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;

python fft计算相位谱_采样频率

拿到第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。