FFT和IFFT的Matlab实现

这几天要用C语言做一个FFT和IFFT,所以先在MATLAB中进行仿真,我在网上找了个FFT的matlab仿真,经过验证后,功能是正确的,自己又做了一个IFFT的,又用C语言实现了一遍;先来稍微分析一下我在网上找的FFT的Maltab代码把,具体的理论知识自己看下书。
现在有一信号为x=[0 2 4 6 0 2 4 6];那么根据蝶形图运算法则(这里为DIF-FFT),有:
x(1) = x(1)+x(5);x(5) = (x(1)-x(5))*W1
x(2) = x(2)+x(6);x(6) = (x(2)-x(6))*W2
x(3) = x(3)+x(7);x(7) = (x(3)-x(7))*W3
x(4) = x(4)+x(8);x(8) = (x(4)-x(8))*W4
这是第一级的规律

x(1) = x(1)+x(3);x(3) = (x(1)-x(3))*W1
x(2) = x(2)+x(4);x(4) = (x(2)-x(4))*W2
x(5) = x(5)+x(7);x(6) = (x(5)-x(7))*W1
x(7) = x(6)+x(8);x(8) = (x(6)-x(8))*W2
这是第二级的规律

x(1) = x(1)+x(2);x(2) = (x(1)-x(2))*W1
x(3) = x(3)+x(4);x(4) = (x(3)-x(4))*W1
x(5) = x(5)+x(6);x(6) = (x(5)-x(6))*W1
x(7) = x(7)+x(8);x(8) = (x(7)-x(8))*W1
这是第三级的规律

由上述运算我们可得知,
只要有三个循环我们就可以实现此算法,一个循环控制蝶形运算级数,一个循环控制旋转因子的值,另外一个循环控制运算过程中参与运算数据的规律,但是这三个循环也还是存在着一些相互联系,具体你们自己看代码,这完全是根据C语言的语法来写的,应该很轻松的改编成C语言。

所以下面来实现代码:
下面是FFT的matlab代码:
FFT和IFFT的Matlab实现_第1张图片

下面是IFFT的代码:
FFT和IFFT的Matlab实现_第2张图片
验证下答案:FFT的和内置FFT做对比,我只放出自己写的FFT后的值:

再对比下IFFT的效果,结果正确:
FFT和IFFT的Matlab实现_第3张图片

但是IFFT有时会出现点误差,具体原因我不解释了,有兴趣可以自己找下原因。

你可能感兴趣的:(编辑器,傅立叶分析)