本篇文章给大家谈谈c语言信号傅里叶变换,以及信号进行傅里叶变换对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、傅里叶变换C语言程序问题:为什么我改变输入数组的输入顺序,或是改掉几个数据最后的对应的结果就不一样了2、c语言实现音乐信号的快速傅里叶变换,为什么要有周期中断来ad采集音乐,这个周期采集的周期怎么确定?3、傅里叶变换用C语言程序怎么实现?
傅里叶变换C语言程序问题:为什么我改变输入数组的输入顺序,或是改掉几个数据最后的对应的结果就不一样了
傅里叶变换是对输入信号进行频谱分析,信号变了,它的频谱自然也要跟着变,你把输入的数组理解为一串信号就对了
c语言实现音乐信号的快速傅里叶变换,为什么要有周期中断来ad采集音乐,这个周期采集的周期怎么确定?
频率和周期互为倒数。 f = 1/T; T=1/f;
f = 40khz = 40000 hz = 40000 ( 1 秒 多少次 叫 多少 赫兹);
T = 1/f = 1.0 / 40000.0; 采样的时间间隔。
傅里叶变换 — 时域到频域变换,用于研究时序信号的频域特性
快速傅里叶变换 — 数据点数 必须是 2 的整数次方,例如 1024,2048,4096 。。。。不足时要补点,补点有多种方法,最常用是补0 或 假定信号从头再来。
——-
你想用 40000 hz 采样频率,1秒就要有 40000 点。
总的信号长度若是几分钟,点数就吓人地多,FFT 耗时也要很长。
你也许可以把信号分段来FFT, 或1次就分析4096点,或 设一个 t0 时步推进,分段信号 重叠 几分之1,得动态频谱。。。。看你的需要。
傅里叶变换用C语言程序怎么实现?
#include math.h
#include stdio.h
#define N 8
void kkfft(double pr[], double pi[], int n, int k, double fr[], double fi[], int l, int il);
void main()
{
double xr[N],xi[N],Yr[N],Yi[N],l=0,il=0;
int i,j,n=N,k=3;
for(i=0;iN;i++)
{
xr[i]=i;
xi[i]=0;
}
printf(“——FFT——\n”);
l=0;
kkfft(xr,xi,n,k,Yr,Yi,l,il);
for(i=0;iN;i++)
{
printf(“%-11lf + j* %-11lf\n”,Yr[i],Yi[i]);
}
printf(“—–DFFT——-\n”);
l=1;
kkfft(Yr,Yi,n,k,xr,xi,l,il);
for(i=0;iN;i++)
{
printf(“%-11lf + j* %-11lf\n”,xr[i],xi[i]);
}
getch();
}
void kkfft(double pr[], double pi[], int n, int k, double fr[], double fi[], int l, int il)
{
int it,m,is,i,j,nv,l0;
double p,q,s,vr,vi,poddr,poddi;
for (it=0; it=n-1; it++)
{
m = it;
is = 0;
for(i=0; i=k-1; i++)
{
j = m/2;
is = 2*is+(m-2*j);
m = j;
}
fr[it] = pr[is];
fi[it] = pi[is];
}
pr[0] = 1.0;
pi[0] = 0.0;
p = 6.283185306/(1.0*n);
pr[1] = cos(p);
pi[1] = -sin(p);
if (l!=0)
pi[1]=-pi[1];
for (i=2; i=n-1; i++)
{
p = pr[i-1]*pr[1];
q = pi[i-1]*pi[1];
s = (pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
pr[i] = p-q;
pi[i] = s-p-q;
}
for (it=0; it=n-2; it=it+2)
{
vr = fr[it];
vi = fi[it];
fr[it] = vr+fr[it+1];
fi[it] = vi+fi[it+1];
fr[it+1] = vr-fr[it+1];
fi[it+1] = vi-fi[it+1];
}
m = n/2;
nv = 2;
for (l0=k-2; l0=0; l0–)
{
m = m/2;
nv = 2*nv;
for(it=0; it=(m-1)*nv; it=it+nv)
for (j=0; j=(nv/2)-1; j++)
{
p = pr[m*j]*fr[it+j+nv/2];
q = pi[m*j]*fi[it+j+nv/2];
s = pr[m*j]+pi[m*j];
s = s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
poddr = p-q;
poddi = s-p-q;
fr[it+j+nv/2] = fr[it+j]-poddr;
fi[it+j+nv/2] = fi[it+j]-poddi;
fr[it+j] = fr[it+j]+poddr;
fi[it+j] = fi[it+j]+poddi;
}
}
/*逆傅立叶变换*/
if(l!=0)
{
for(i=0; i=n-1; i++)
{
fr[i] = fr[i]/(1.0*n);
fi[i] = fi[i]/(1.0*n);
}
}
/*是否计算模和相角*/
if(il!=0)
{
for(i=0; i=n-1; i++)
{
pr[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
if(fabs(fr[i])0.000001*fabs(fi[i]))
{
if ((fi[i]*fr[i])0)
pi[i] = 90.0;
else
pi[i] = -90.0;
}
else
pi[i] = atan(fi[i]/fr[i])*360.0/6.283185306;
}
}
return;
}
关于c语言信号傅里叶变换和信号进行傅里叶变换的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。