[signal processing] FFT快速傅立叶变换

来源:互联网 发布:再见老婆啥软件 编辑:程序博客网 时间:2024/05/19 18:00

Fast Fourier Transform是离散傅立叶变换的快速算法,可将信号转换到频域。
应用:1、在频率内可视,得到频率组成。2、为滤波做准备。
采样率:Fs,频率:F,信号长度:L,采样点数N。FFT后是N点的复数,每一个点对应一个频率点,点的模值对应该频率下的幅度特性
幅度特性与原始信号幅值的关系
1、原始峰值为A,FFT结果的每个点(除去第一个直流分量)模值为A的N/2倍,第一个点直流分量模值是自留分量的N倍。
2、每个点的相位代表在该频率下的信号的相位。

采样频率Fs,被N-1个点平均分成N等份,每个点的频率依次增加。为了便于FFT运算,N取大于信号长度L的2的整数次方。
例如某点n所表示的频率为: Fn=(n-1)*Fs/N。可以看出,Fn所能分辨到频率为Fs/N。如果采样频率Fs为1024,采样点数为1024,则结果可以分辨到1Hz。1024Hz采样率,1s采样1024个点,采集1s的信号做FFT,结果可以分析到1Hz,材料2s的信号做FFT,结果分辨率可以达到0.5Hz。

即如果提高分辨力,则必须增加采样点数,即采样时间。分辨率=1/采样时间。

FFT之后,某点用复数a+bi表示。该复数的模是sqrt(a^2+b^2)。相位就是atan2(b,a)。根据以上结果,可以得到对应信号的表达式
An/(N/2)*cos(2*pi*Fn*t+Pn)。由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。

exam.
x=5+7*cos(2*pi*15*t)+3cos(2*pi*40*t);
用128的采样率采样,总共采样256点。按照分析,频率分辨力为0.5Hz

例子参考连接
http://blog.sina.com.cn/s/blog_86186c970101tgcm.html

matlab 程序如下

Fs = 128;       % 采样频率T = 1/Fs;       % 采样时间L = 256;        % 信号长度t = (0:L-1)*T; % 时间x = 5 + 7*cos(2*pi*15*t - 30*pi/180) + 3*cos(2*pi*40*t - 90*pi/180);   %cos为底原始信号y = x + randn(size(t));     %添加噪声figure;plot(t,y)title('加噪声的信号')xlabel('时间(s)')N = 2^nextpow2(L); %采样点数,采样点数越大,分辨的频率越精确N>=L,超出的部分信号补为0Y = fft(y,N)/N*2;   %除以N乘以2才是真实幅值,N越大,幅值精度越高f = Fs/N*(0:1:N-1); %频率A = abs(Y);     %幅值P = angle(Y);   %相值figure;subplot(211);plot(f(1:N/2),A(1:N/2));   %函数fft返回值的数据结构具有对称性,因此我们只取前一半title('幅值频谱')xlabel('频率(Hz)')ylabel('幅值')subplot(212);plot(f(1:N/2),P(1:N/2));title('相位谱频')xlabel('频率(Hz)')ylabel('相位')
0 0