16点基4DIT-FFT实现

 C程序的思路大致是理清了,平时不编程,小毛病很多,还好有度娘陪伴,迅速化解。照猫画虎地弄出16点的FFT。这并不是最优化的程序,但为了思路清晰,就姑且这样吧。下一步开始FPGA了吧,日语单词还没背,这周凌乱,应该是每一周都很乱。

和上一次的程序思路一样,其中比较烦的一点是4点数据输入会分成实部虚部共8个等式。

 

关于旋转因子,WNP=e^(-j*2*pi*p/n)=cos(-j*2*pi*p/n)+j*sin(-j*2*pi*p/n),用查表的方法COS[p]=cos(-j*2*pi*p/n),SIN[p]=j*sin(-j*2*pi*p/n)。由于16点的基4FFT有两级运算,第二级用到的旋转因子各类最多,为4^(2-1)=4种,所以需要计算4种WNP,每种含WNP,WN2P , WN3P.所以一共需要计算3*4=12个WNP。每个包含sin值和cos值两部分,共有12组值。

 

dataR[k]是输入第一个数据的实部,dataR[k+b]是输入第二个数据实部,彼此间隔b个数据,依次类推。

FFT运算部分如下,眼花了有没有~~:

 

TR=dataR[k];TBR=dataR[k+b];T2BR=dataR[k+2*b];T3BR=dataR[k+3*b];
TI=dataI[k];TBI=dataI[k+b];T2BI=dataI[k+2*b];T3BI=dataI[k+3*b];

dataR[k]=TR +TBR*COS[p]-TBI*SIN[p] +T2BR*COS[2*p]-T2BI*SIN[2*p] +T3BR*COS[3*p]-T3BI*SIN[3*p];
dataI[k]=TI +TBR*SIN[p]+TBI*COS[p] +T2BR*SIN[2*p]+T2BI*COS[2*p] +T3BR*SIN[3*p]+T2BI*COS[3*p];

dataR[k+b]=TR +TBR*SIN[p]+TBI*COS[p] -T2BR*COS[2*p]+T2BI*SIN[2*p] -T3BR*SIN[3*p]-T3BI*COS[3*p];
dataI[k+b]=TI -TBR*COS[p]+TBI*SIN[p] -T2BR*SIN[2*p]-T2BI*COS[2*p] +T3BR*COS[3*p]-T3BI*SIN[3*p];

dataR[k+2*b]=TR -TBR*COS[p]+TBI*SIN[p] +T2BR*COS[2*p]-T2BI*SIN[2*p] -T3BR*COS[3*p]+T3BI*SIN[3*p];
dataI[k+2*b]=TI -TBR*SIN[p]-TBI*COS[p] +T2BR*SIN[2*p]+T2BI*COS[2*p] -T3BR*SIN[3*p]-T3BI*COS[3*p];

dataR[k+3*b]=TR -TBR*SIN[p]-TBI*COS[p] -T2BR*COS[2*p]+T2BI*SIN[2*p] +T3BR*SIN[3*p]+T3BI*COS[3*p];
dataI[k+3*b]=TI +TBR*COS[p]-TBI*SIN[p] -T2BR*SIN[2*p]-T2BI*COS[2*p] -T3BR*COS[3*p]+T3BI*SIN[3*p];

 

你可能感兴趣的:(c语言,fft)