FFT(Fast Fourier Transformation),即为快速傅氏变换,是离散傅氏变换(DFT)的快速算法。
采样得到的数字信号,做FFT变换,N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。
假设信号:
S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)
它含有:2V的直流分量
频率为50Hz、相位为-30度、幅度为3V的交流信号
频率为75Hz、相位为90度、幅度为1.5V的交流信号
假设以采样频率为Fs(200HZ)对信号进行采样,信号频率F(0HZ,50HZ,75HZ),共采样点数为N(256),那么FFT之后结果就是一个为N(256)点的复数。每一个点就对应着一个频率点。即有N(256)个频率点,第一个点表示直流分量(0HZ),第N+1个点(不存在,事实最后一个点为第256点)表示采样频率Fs(200HZ),N个间隔平分采样频率Fs,每个点的频率依次增加。某点n所表示的频率为:Fn=(n-1)*Fs/N。
点n为(1,2,3,4,········256)对应的频率分别为
(0,200/256,2*200/256,3*200/256,..........127*200/256)HZ.
由上面的公式可以看出,Fn所能分辨到频率为为Fs/N(200/256),即两点的间隔位200/256.
如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。
继续回到例子,有三个频率点,0HZ,50HZ,75HZ,应该在点n(1,65,97)其所代表的频率为(0,64*200/256,96*200/256)即(0,50,75)上出现峰值。结合matlab实验拿到这些值综合分析峰值与原始信号的关系。
clf; fs=200;N=256; %采样频率和数据点数 n=(0:N-1); t=n/fs; %时间序列 S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180); %信号 y=fft(S,N); %对信号进行快速Fourier变换 mag=abs(y); %求得Fourier变换后的振幅 f=n*fs/N; %频率序列 subplot(2,1,1),plot(f,mag); %绘出随频率变化的振幅 xlabel(‘频率/Hz‘); ylabel(‘振幅‘);title(‘200的采样频率‘);grid on; subplot(2,1,2),plot(n,mag); %绘出随频率变化的振幅 xlabel(‘频率点‘); ylabel(‘振幅‘);title(‘256个数据点‘);grid on;
拿到第1,65,97点的数据。 no.1: 512.000000000001
no.65: 332.553755053224 - 192.000000000001i
no.97: 2.40097106720006e-12 + 192.000000000000i
结合数据可得:计算三个点的幅值:1点 512 65点 384 97点 192
分析数据可得:直流分量为512/N=512/256=2;
50Hz信号的幅度为:384/(N/2)=384/(256/2)=3;
75Hz信号的幅度为192/(N/2)=192/(256/2)=1.5。可见,从频谱分析出来的幅度是正确的。
计算三点相位信息:直流信号没有相位信息; 65点 :arctan(-192, 332.55)=-0.5236 ;97点: arctan(192, 2.4e-12)=1.5708
单位为弧度转换为角度:65点: 180*(-0.5236)/pi=-30.0001 ;97点:180*1.5708/pi=90.0002
总结:假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=sqrt(a*a+b*b),相位就是Pn=arctan(b,a)。根据以上的结果,就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。对于n=1点的信号,是直流分量,幅度即为A1/N。