了解Matlab FFT的例子
我是新来的matlab和FFT,想了解Matlab的FFT的例子 。 现在我有两个主要问题:
1)为什么x轴(频率)在500? 我怎么知道没有更多的频率,或者只是忽略了?
2)我怎么知道频率在0到500之间? FFT不应该告诉我,在哪个极限频率是? FFT是否仅在没有频率的情况下返回振幅值?
感谢任何提示!
问题示例:
考虑以1000Hz采样的数据。 形成一个信号,其中包含振幅为1,振幅为0.7和120 Hz正弦波的50 Hz正弦曲线,并用一些零均值随机噪声损坏它:
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)')
转换到频域,通过进行快速傅立叶变换(FFT)来发现噪声信号y的离散傅里叶变换:
NFFT = 2^nextpow2(L); % Next power of 2 from length of y Y = fft(y,NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2+1); % 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)|')
1)为什么x轴(频率)在500? 我怎么知道没有更多的频率,或者只是忽略了?
它以500Hz结束,因为这是在1000Hz采样时信号的奈奎斯特频率 。 看看Mathworks示例中的这一行:
f = Fs/2*linspace(0,1,NFFT/2+1);
第二个曲线的频率轴从0到Fs / 2,即采样频率的一半。 奈奎斯特频率始终是采样频率的一半,因为在此之上会发生混叠 :
信号本身会“折叠”, 似乎是500Hz或500Hz以下的频率。
2)我怎么知道频率在0到500之间? FFT不应该告诉我,在哪个极限频率是?
由于上述“折叠”(奈奎斯特频率通常也被称为“折叠频率”),在FFT中出现高于500Hz的频率在物理上是不可能的; 较高的频率将“折叠”回来,并显示为较低的频率。
FFT是否仅在没有频率的情况下返回振幅值?
是的,MATLAB的FFT函数只返回一个幅度vector。 但是,它们会映射到您传递给它的频率点。
让我知道什么需要澄清,所以我可以进一步帮助你。
这里有一些误解。
高于500的频率可以在长度为1000的FFT结果中表示。不幸的是,这些频率全部折叠在一起并混合到前500个FFT结果仓中。 所以通常情况下,您不希望为FFT提供一个包含采样率一半或更高频率的任何频率的信号,因为FFT不会在意,只会混合高频和低频(混叠),从而使结果变得漂亮太无用了。 这就是为什么数据在被采样并馈送到FFT之前应该被低通滤波的原因。
由于FFT的频率不仅取决于FFT的长度,而且还取决于数据的采样率,而FFT不是FFT本身的一部分或者它是input,所以FFT返回幅度而没有频率。 您可以以任何采样率input相同长度的FFT数据,从而获得任何频率范围。
结果图表结束于500的原因是,对于任何实际的数据input,高于FFT一半长度的频率仅仅是前半部分数据的镜像重复(复共轭)。 由于它们是重复的,大多数人都忽略它们。 为什么情节重复? FFT为计算复杂数据(包括实数和虚数分量)的人员计算结果的另一半,这会产生两个不同的半数。
这听起来像你需要一些背景阅读什么是FFT(如http://en.wikipedia.org/wiki/FFT )。 但要回答你的问题:
为什么X轴(频率)在500?
因为input向量是长度为1000.一般来说,长度为 N
input波形的FFT将导致长度为N
输出向量。如果input波形是实数,则输出将是对称的,所以前501个点就足够了。
编辑:( 我没有注意到这个例子填充了时域vector。)
频率为500Hz,因为时域波形被声明为具有1kHz的采样率。 奈奎斯特采样定理指出,采样率为fs
的信号可以支持带宽为fs/2
的(实数)信号。
我怎么知道频率在0到500之间?
往上看。
FFT不应该告诉我,在哪个极限频率是?
没有。
FFT是否仅在没有频率的情况下返回振幅值?
FFT简单地为每个频点分配振幅(和相位)。
你的X轴绘制频率直到500Hz的原因是你的命令语句'f = Fs / 2 * linspace(0,1,NFFT / 2 + 1);' 。 你的F是1000.所以当你除以2然后乘以0到1的值,它将返回一个长度为NFFT / 2 + 1的向量。 这个vector由等间隔的频率值组成,范围从0到Fs / 2(即500Hz)。 由于您使用' plot(f,2 * abs(Y(1:NFFT / 2 + 1))) '命令进行绘图 ,所以X轴限制为500 Hz。