我是matlab和FFT的新手,想要了解Matlab FFT example。 现在我有两个主要问题:
1)为什么x轴(频率)结束于500?我怎么知道没有更多的频率或者它们被忽略了?
2)我怎么知道频率在0到500之间? FFT不应该告诉我,频率在哪些限制范围内? FFT是否仅在没有频率的情况下返回幅度值?
感谢任何提示!
考虑以1000 Hz采样的数据。形成一个信号,其中包含幅度为0.7和120 Hz的幅度为1的正弦波的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)|')
答案 0 :(得分:36)
1)为什么x轴(频率)结束于500?我怎么知道没有更多的频率或者它们被忽略了?
以500Hz结束,因为当以1000Hz采样时,这是Nyquist frequency of the signal。在Mathworks示例中查看此行:
f = Fs/2*linspace(0,1,NFFT/2+1);
第二个曲线的频率轴从0到 Fs / 2,或采样频率的一半。 奈奎斯特频率始终是采样频率的一半,因为在此之上,aliasing出现
信号将“折叠”回自身,而出现的频率等于或低于500Hz。
2)我怎么知道频率在0到500之间? FFT不应该告诉我,频率在哪些限制范围内?
由于上面描述的“折叠”(奈奎斯特频率通常也称为“折叠频率”),在物理上不可能在FFT中出现500Hz以上的频率;较高频率将“折叠”回来并显示为较低频率。
FFT是否仅在没有频率的情况下返回幅度值?
是的,MATLAB FFT函数只返回一个幅度矢量。但是,它们会映射到您传递给它的频率点。
请告诉我需要澄清的内容,以便我们进一步帮助您。
答案 1 :(得分:10)
这里有一些误解。
高于500 的频率可以在长度为1000的FFT结果中表示。不幸的是,这些频率全部折叠在一起并混合到前500个FFT结果区间中。因此,通常您不希望向FFT提供包含任何频率等于或高于采样率一半的频率的信号,因为FFT无关紧要,只会将高频与低频混合(混叠),使得结果非常漂亮没什么用的。这就是为什么数据在被采样并馈送到FFT之前应该进行低通滤波的原因。
FFT返回没有频率的幅度,因为频率不仅取决于FFT的长度,还取决于数据的采样率,这不是FFT本身或其输入的一部分。您可以以任何采样率提供相同长度的FFT数据,因此可以获得任何频率范围。
结果曲线结束于500的原因在于,对于任何实际数据输入,高于FFT长度一半的频率只是前半部分数据的镜像重复(复共轭)。由于它们是重复的,大多数人只是忽略它们。为什么要重复? FFT为FFT复杂数据(包含实部和虚部)提供结果的另一半计算结果,这会创建两个不同的部分。
答案 2 :(得分:1)
听起来你需要对FFT的背景进行一些阅读(例如http://en.wikipedia.org/wiki/FFT)。但要回答你的问题:
为什么x轴(频率)结束于500?
因为输入向量的长度为1000.通常,长度为 N
输入波形的FFT将产生长度 - N
输出向量。如果输入波形是实数,则输出将是对称的,因此前501个点就足够了。
编辑: (我没有注意到该示例填充了时域向量。)
频率变为500 Hz,因为时域波形被声明为采样率为1 kHz。奈奎斯特采样定理规定采样率fs
的信号可以支持最大带宽为fs/2
的(实际)信号。
我怎么知道频率在0到500之间?
见上文。
FFT不应该告诉我,频率在哪些限制范围内?
没有
FFT是否仅在没有频率的情况下返回幅度值?
FFT只是为每个频率分配器分配一个幅度(和相位)。
答案 3 :(得分:-1)
您的X轴绘制频率仅为500 Hz的原因是您的命令语句'f = Fs / 2 * linspace(0,1,NFFT / 2 + 1);'。你的Fs是1000.所以当你把它除以2&然后乘以范围从0到1的值,它返回长度为NFFT / 2 + 1的向量。该矢量由等间隔的频率值组成,范围从0到Fs / 2(即500Hz)。由于您使用'绘图(f,2 * abs(Y(1:NFFT / 2 + 1)))'命令进行绘图,因此您的X轴限制为500 Hz。