FFT IP核调用与仿真之FFT数学分析
对于FFT这个IP核,我其实对它真的是又爱又恨,因为它真的耗费了我太多时间,但是随着研究的深入,遇到的问题一点点给消化解决,终于不用带着问题睡觉了,哈哈,有时候真的挺佩服自己的,遇到不懂的,不了解的,真的不允许自己留一点疑惑,必须深挖到底,一点含糊都不留给自己,其实,不知道大家有没有这样的疑惑,现在不懂的,懒得去研究的,估计过不了多久这个知识点又会兜回来找你的。我有时候也会侥幸自己能逃过不会做的任务,但是真的过不了多久,我越是不会的东西就越是会来找我,感觉今天的话有点多,赶紧回到正题上来。FFT是什么?我也曾经花了大半个月的时间去研究过它的原理,还手写代码不调用IP核去实现它的计算,这个实现过程还是挺复杂的,所以最简单易上手的还是好好学会调用IP核吧,这个IP核真的忒好用呢。
FFT其实本质上就是用来做频谱分析的,我给你一堆混杂的频谱,你知道里面有哪些频率吗?你不知道,但是FFT知道,它能帮你分析混杂频谱中有哪些频率成分。说得官方一点就是:FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域,有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了,这就是很多信号分析采用FFT变换的原因。简单来说,FFT的作用就是对信号进行频谱分析。
我们首先结合MATALB这个强大的数学分析软件来生动阐释下FFT这个概念,它可以拿来做什么?它是如何实现频谱分析的?一个模拟信号,经过ADC采样之后,就变成了数字信号,我们就可以拿采样得到的数字信号,做FFT变换。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。 例如某点n所表示的频率为:Fn=(n-1)*Fs/N。由这条公式可以看出,Fn所能分辨到的频率为Fs/N,举例来说如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,那这个对应的时间序列点数就是2048,则结果可以分析到0.5Hz。所以如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。
2)信号幅值对比:
预测猜想:按照我们的原始频率输入,第1个点、第51个点、第76个点的幅度值分别是2、3、1.5;
Matlab输出结果:
3)相位输出验证:
预测猜想:第1个点直流分量没有相位输出,不管,第51个点、第76个点的幅度值分别是-30,90;
Matlab输出结果:
1 %知识点补充: 2 % 假设经过FFT处理之后,某点n用复数a+bi表示,那么这个复数的模就是An=sqrt(a*a+b*b),幅度值=An/(N/2)(对于直流信号是除以N),相位=atan2(b,a)。 3 %1、假设某一点频率为Fn=(n-1)*Fs/N,那Fn所能分辨到的频率为Fs/N,举例来说如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。 4 %2、以1024Hz的采样率采样1024点,刚好是1秒,也就是频率分辨率是1Hz,如果是以采样2秒的时间做FFT也就是说对应的时间序列点数就是2048,则频率分辨率可以提高至0.5Hz。 5 %3、要提高频率分辨力,则必须增加采样点数,也即采样时间。 6 %4、频率分辨率和采样时间是倒数关系,由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。 7 8 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9 close all; 10 Adc=2; %直流分量幅度 11 A1=3; %频率F1信号的幅度 12 A2=1.5; %频率F2信号的幅度 13 F1=50; %信号1频率(Hz) 14 F2=75; %信号2频率(Hz) 15 Fs=256; %采样频率(Hz) 16 P1=-30; %信号1相位(度) 17 P2=90; %信号相位(度) 18 N=256; %采样点数 19 t=[0:1/Fs:N/Fs]; %采样时刻 20 21 %信号 22 S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180) 23 %显示原始信号 24 plot(S); 25 title('原始信号'); 26 27 figure; 28 Y = fft(S,N) ;%做FFT变换 29 Ayy = (abs(Y));%取模 30 plot(Ayy(1:N)); %显示原始的FFT模值结果 31 title('FFT 模值'); 32 33 figure; 34 Ayy=Ayy/(N/2); %换算成实际的幅度 35 Ayy(1)=Ayy(1)/2;%直流信号幅度值 36 37 F=([1:N]-1)*Fs/N; %换算成实际的频率值 38 plot(F(1:N/2),Ayy(1:N/2)); %显示换算后的FFT模值结果 39 title('幅度-频率曲线图'); 40 41 figure; 42 Pyy=[1:N/2]; 43 for i=1:N/2; 44 Pyy(i)=phase(Y(i)); %计算相位 45 Pyy(i)=Pyy(i)*180/pi; %换算为角度 46 end; 47 plot(F(1:N/2),Pyy(1:N/2)); %显示相位图 48 title('相位-频率曲线图'); 49 50 num=[1 3 5];den=[2 5 7 8 3]; 51 sys=tf(num,den); 52 bode(sys);grid on;