网上看了一些大牛的关于FFT的见解,加上自己的一点儿理解,针对以下这几个问题来加深对FFT的理解。
不知道大家有没有类似以下几点的困惑:
问题的提出
-
对于1秒钟输出的连续信号,使用采样率Fs不同,就会得到不同的采样序列。在计算N点FFT之后得到N点的复数,幅频图中横坐标如何与我实际的频率相对应?
-
FFT之后的幅频响应图,对应的幅值到底有什么含义,我们可以通过这个对应频率点的幅值推出原始信号的相关特性吗?
问题的解释
傅里叶是法国数学家和物理学家的名字,英语原名是Jean Baptiste Joseph Fourier(1768-1830)。他在1807年在他论文里面运用正弦曲线来描述温度分布,论文里有个在当时具有争议性的决断:任何连续周期信号都可以由一组适当的正弦曲线组合而成。
分解信号的方法是无穷多个的,为什么我们要用正弦曲线来代替原来的曲线呢?分解信号的目的是为了更加简单地处理原来的信号。用正余弦来表示原信号会更加简单,因为正余弦拥有原信号所不具有的性质:正弦曲线保真度。一个正余弦曲线信号输入后,输出的仍是正余弦曲线,只有幅度和相位可能发生变化,但是频率和波的形状仍是一样的。(话外1)对线性系统而言,输入正弦信号,输出为同频率的正弦信号,只有附加相移和幅度变化。2)根据傅立叶变换性质,几乎全部实际信号都可以表示成傅里叶级数形式,包括正弦信号本身。可见,正弦信号是不可分的基本信号,而方波或三角波不是,所以不用方波或三角波。)且只有正余弦曲线才拥有这样的性质,正因如此我们才不用方波或三角波来表示。
1三角函数形式的傅里叶级数
我们来看这个式子:
它就是傅里叶级数,周期函数f(t)的角频率为w1,可由三角函数的线性组合来表示,式中n为正整数,
a为直流分量
余弦分量的幅度
正弦分量的幅度
2指数形式的傅里叶级数
根据欧拉公式,将f(t)表示为:
令
那么
f(t)指数形式的傅里叶级数为:
注意:这就将0到正无穷的范围扩展到了负无穷到正无穷,就是为什么做傅里叶变化之后会出现负的频率。指数形式表示的信号频谱图中,每个分量nw1的幅度一分为2,在正负频率上相对应的位置上个为一半,所以,只有把正、负频率上对应的这两条谱线矢量相加起来才代表一个分量的幅度。复数频谱中出现的负频率是由于将sin(nw1t),cos(nw1t)写成指数形式的时,从数学观点自然分成了exp(-jnw1t)和exp(jnw1t)两项,负频率的出现完全是数学运算的结果只有把相应的正、负频率成对的合并起来,才是实际的频谱函数,。
三角形式的傅立叶级数频率为非负的,对应的频谱一般称为单边谱,
指数形式的傅立叶级数频率为整个实轴,所以称为双边谱。
最后回过头来想想:f(t)的指数形式也可以说明F(nw1)是代表各个频率点上的复数信息,说明了傅里叶变化的结果就是将时域变换到的频域去分析信号。
3DFT
接着来看一下离散傅里叶变化
DFT合成等式
其中
但k等于0和N/2时,实数部分的计算要用下面的等式:
假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是的A的N/2倍。而第一个点就是直流分量,他的模值就是直流分量的N倍。
首先,FFT(快速傅里叶变换)是一种实现DFT(离散傅里叶变换)的快速算法,是利用复数形式的离散傅里叶变换来计算实数形式的离散傅里叶变换)。
5Matlab程序举例
%%时域信号的表示,
Fs = 1000; % Sampling frequency
T = 1/Fs; % Sample time
L = 1000; % Length of signal
t = (0:L-1)*T; % Time vector
% Sum of a 50 Hz sinusoid and a 120 Hz sinusoid
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
y = x + 2*randn(size(t)); % Sinusoids plus noise
plot(Fs*t(1:50),y(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('time (milliseconds)');
%%这样子横坐标代表实际时间。。
NFFT = 2^nextpow2(L); % Next power of 2 from length of y
f = Fs/2*linspace(0,1,NFFT/2+1);
%%%频域也有NFFT个点,频域中每两个点之间的间隔为Fs/NFFT;
%%%因此f的坐标设置为FS*(0:NFFT-1)/NFFT;
% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2+1)))
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')