阅读:2861回复:5
关于傅立叶变换算法的问题,100分求助。
一直搞硬件,现在总算遇到算法问题了,想躲也躲不开,只好硬着头皮搞。
这是一个数字滤波的项目,硬件核心使用定点DSP-VC5402,设计思路是通过DSP把采样到的数字音频信号,按帧进行频谱分析,使用傅立叶变换把时域信号转为频域信号,再对频域数据中的特定频段进行衰减或提升,再使用傅立叶逆变换把处理过的频域信号转回为时域信号,最后通过DA输出。 问题有三: 1、傅立叶变换要用到复数运算,第一步就是把要处理的数据,由实数组转为复数组,谁能告诉我转换的规则?就是复数的实部和虚部与转换前的实数是什么关系? 2、傅立叶变换后得到的频域信号数据,也是复数表示的,数组大小与转换前一样,这个数组的数据表示的就是低频到高频的能量分布吗?怎么使用这组数据? 3、谁能给个傅立叶逆变换的算法?后面附上正变换的PC算法程序,其中有浮点运算,因为我还没有把它移到定点DSP上。 void CFOURIERDlg::OnOK() { Complex U,W,T; int LE,LE1,I,J,IP; int M=10; int N=(int)pow(2,M); float PI; PI=3.142e+0; //由于采用时间抽选奇偶分解方式,所以在参加运算前首先要对时间序列进行倒序 Complex * A=new Complex[N]; ReverseOrder(A,N); int L=1; while(L<=M) { LE=(int)pow(2,L); //2的L次方 LE1=LE/2; U.Re=1.0f; U.Im=0.0f; //计算W算子的值 W.Re=(float)cos(PI/(1.0*LE1)); W.Im=(float)-1.0*sin(PI/(1.0*LE1)); if(abs(W.Re)<1.0e-12) W.Re=0.0f; if(abs(W.Im)<1.0e-12) W.Im=0.0f; J=1; while(J<=LE1) { I=J; while(I<=N) { IP=I+LE1; //复数运算A×U T.Re=(float)A[IP-1].Re*U.Re-A[IP-1].Im*U.Im; T.Im=(float)A[IP-1].Re*U.Im+A[IP-1].Im*U.Re; //复数运算A-T A[IP-1].Re=(float)A[I-1].Re-T.Re; A[IP-1].Im=(float)A[I-1].Im-T.Im; //复数运算A+T A[I-1].Re+=T.Re; A[I-1].Im+=T.Im; I+=LE; } float temp=U.Re; //复数运算U×W U.Re=(float)U.Re*W.Re-U.Im*W.Im; U.Im=(float)temp*W.Im+U.Im*W.Re; J++; } L++; } delete A; } void CFOURIERDlg::ReverseOrder(Complex * A,int N) { int NV2=N/2; int NM1=N-1; int I,J,K=0; //用于中介的复数变量T Complex T; I=J=1; while(I<=NM1) { if(I<J) {//借助于中间变量T,将A[J-1]的内容和A[I-1]的内容互换 T=A[J-1]; A[J-1]=A[I-1]; A[I-1]=T; } K=NV2; while(K<J) { J-=K; K/=2; } J+=K; I++; } } |
|
|
沙发#
发布于:2004-10-10 10:25
经过A/D采样后的数据是实数组,转化成复数组时,是不可以把复数组定义成结构体变量,即让复数组的实部等于原来数组的实数,虚部定义为0,这样就可以转化了。
2.经过fft处理后的频域数据与复数组的大小相同,在Y(k)中的k值就代表第k次谐波了。 |
|
板凳#
发布于:2004-10-10 19:44
lrm101兄:
这句话我没看懂:"经过A/D采样后的数据是实数组,转化成复数组时,是不可以把复数组定义成结构体变量,即让复数组的实部等于原来数组的实数,虚部定义为0,这样就可以转化了。" 您的意思是不是定义一个有两个浮点数成员的结构变量数组,将其实部值取AD后的实数值,虚部为0? 2、转换后的频域数据是复数,有实部和虚部,如果我想把某次谐波进行衰减,该如何处理呢?是保持幅角不变,减少向量值;还是其它什么算法? 另,我找到逆运算的算法了。 多谢多谢!!!! |
|
|
地板#
发布于:2004-10-11 10:01
我就是那个意思,您找到的逆运算算法是指位码倒序算法吗?采用什么语言编写的,是用C语言编写的还是汇编语言编写的,我是用C编写的,能把您的程序传给我一份吗?我也look look,希望能与您多交流
多谢了! |
|
地下室#
发布于:2004-10-18 10:01
呵呵,找到的那个逆运算程序不能用,但是原来那个正变换的程序是可以用的,于是就把它的运算过程完全颠倒过来,竟然试通了。其实傅立叶变换本来就是可逆的。
|
|
|
5楼#
发布于:2004-10-19 08:45
请问你经常在那个网站上搜程序呀,
|
|