Matlab 中fft 函数的⽤法及关键问题详解
FFT 是Fast Fourier Transform(快速傅⾥叶变换)的简称,这种算法可以减少计算DFT (离散傅⾥叶变换,关于此更详细的说明见后⽂)的时间,⼤⼤提⾼了运算效率,并曾经⼀度被认为是信号分析技术划时代的进步,其重要性由此可见⼀斑。闲话少叙,⾔归正传。
基于FFT 在信号分析中的重要性,其必然会成为MATLAB 的座上宾。FFT 算法在MATLAB 中实现的函数是Y=fft(x,n)。刚接触频谱分析⽤到FFT 时,⼏乎都会对MATLAB 的fft 函数产⽣⼀些疑惑,本⽂本着从问题出发的原则,主要着⼿对⼀下⼏个问题进⾏解释:(⼀)fft 函数计算得到的Y 是输⼊信号x 的频谱吗?如果不是还要经过怎样的变换?为什么要除以N 。
(⼆)如何计算Y 对应的频率f ,并绘制(f,Y )频谱图?
(三)如何根据离散信号的长度确定n 的数值?
下⾯以MATLAB 帮助⽂档中的例⼦来⼀⼀看这⼏个问题。
运⾏结果:1、关于问题(⼀)
程序(1)处为何要除以信号的采样长度L ?
由Fourier
变换对[plain]
1. Fs = 1000;                    % Sampling frequency
2. T = 1/Fs;                    % Sample time
3. L = 1000;                    % Length of signal
4. t = (0:L-1)*T;                % Time vector
5. % Sum of a 50 Hz sinusoid and a 120 Hz sinusoid
6. x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
7. y = x + 2*randn(size(t));    % Sinusoids plus noise
8. subplot(2,1,1)
9. plot(Fs*t(1:50),x(1:50))  10. title('Sinusoids Signal')  11. xlabel('time (milliseconds)')  12. subplot(2,1,2)  13. plot(Fs*t(1:50),y(1:50))  14. title('Signal Corrupted with Zero-Mean Random Noise')  15. xlabel('time (milliseconds)')  16.  17. NFFT = 2^nextpow2(L); % Next power of 2 from length of y            18. Y = fft(y,NFFT)/L;    %                                            (1)  19.    f = Fs/2*linspace(0,1,NFFT/2+1);  20. % Plot single-sided amplitude spectrum.  21. figure  22. plot(f,2*abs(Y(1:NFFT/2+1)))      %                              (2)  23. title('Single-Sided Amplitude Spectrum of y(t)')  24. xlabel('Frequency (Hz)')  25.
ylabel('|Y(f)|')
可知,fft 函数直接计算得到的X (k )并不是频谱幅值。
在x(j)的Fourier 级数(3
)中,谐波分量
对应的幅值为X(k)/N ,因此必须对fft 得到的结果除以离散信号的长度N 才能得到频谱幅值。
2、关于问题(三)
程序(1)处,fft 函数的第⼆个参数NFFT 为何取值
其含义是取不⼩于L 的最⼩的2的幂。之所以这样取值是因为FFT 算法要求信号的长度为2的幂,当NF
FT ⼤于信号长度时,fft 函数以零补齐。由(2)可知幅值谱只取了前半部分,并且还要乘以倍数2。也就是说频谱幅值是
这是因为信号的频谱是前后对称的,⽽且⼀般负频率没有物理意义。也就是说绝对值相等的频率,其对应的频率幅值是相等的,所以把正频率对应的频率幅值的两倍作为频谱幅值。
3、关于问题(⼆)
用subplot函数由离散傅⾥叶变换(DFT )的推导过程可知,如果信号的时间长度是T0,则⽤DFT 进⾏频谱分析的频率分辨率是1/T0。由于fft 函数取信号的长度是NFFT ,采样频率是Fs ,由此可知fft 的频率分辨率是Fs/NFFT 。因此与频谱幅值
相对应的频率值是或者
[plain]
1. NFFT = 2^nextpow2(L);
[plain]
1. 2*abs(Y(1:NFFT/2+1))
[plain]
1. 2*abs(Y(1:NFFT/2+1))
[plain]
1. f=1/(NFFT*T)*(0:NFFT/2);
[plain]  1.    f = Fs/2*linspace(0,1,NFFT/2+1);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。