提问人:stefan.at.kotlin 提问时间:5/26/2012 最后编辑:stefan.at.kotlin 更新时间:2/7/2018 访问量:156047
了解 Matlab FFT 示例
Understanding Matlab FFT example
问:
我是 matlab 和 FFT 的新手,想了解 Matlab FFT 示例。 现在我有两个主要问题:
1) 为什么 x 轴(频率)以 500 结束?我怎么知道没有更多的频率,或者它们只是被忽略了?
2) 我怎么知道频率在 0 到 500 之间?FFT不应该告诉我,频率的限制是什么吗?FFT是否只返回幅度值而不返回频率?
感谢您的任何提示!
相关示例:
考虑以 1000 Hz 采样的数据。 形成一个包含振幅为 0.7 的 50 Hz 正弦曲线和振幅为 1 的 120 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)|')
答:
听起来您需要了解 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只是为每个频率箱分配一个幅度(和相位)。
评论
2^nextpow2(L)
2^nextpow2(L)
NFFT = 2^nextpow2(L)
1) 为什么 x 轴(频率)以 500 结束?我怎么知道没有更多的频率,或者它们只是被忽略了?
它以 500Hz 结束,因为这是以 1000Hz 采样时信号的奈奎斯特频率。请看 Mathworks 示例中的这一行:
f = Fs/2*linspace(0,1,NFFT/2+1);
第二个图的频率轴从 0 到 Fs/2,即采样频率的一半。奈奎斯特频率始终是采样频率的一半,因为在此频率之上,会发生混叠:
信号会自行“折叠”,并且看起来是 500Hz 或以下的某个频率。
2) 我怎么知道频率在 0 到 500 之间?FFT不应该告诉我,频率的限制是什么吗?
由于上述“折叠”(奈奎斯特频率通常也称为“折叠频率”),FFT中不可能出现高于500Hz的频率;较高的频率将“折叠”回来并显示为较低的频率。
FFT是否只返回幅度值而不返回频率?
是的,MATLAB FFT 函数仅返回一个幅度向量。但是,它们映射到您传递给它的频率点。
让我知道需要澄清什么,以便我进一步为您提供帮助。
评论
这里有一些误解。
高于 500 的频率可以用长度为 1000 的 FFT 结果表示。不幸的是,这些频率都被折叠在一起,并混合到前 500 个 FFT 结果箱中。因此,通常您不希望向 FFT 提供包含任何频率等于或高于采样率一半的信号,因为 FFT 不会在乎,只会将高频与低频混合在一起(混叠),使结果几乎毫无用处。因此,在对数据进行采样并馈送到FFT之前,应先对数据进行低通滤波。
FFT 返回的幅度没有频率,因为频率不仅取决于 FFT 的长度,还取决于数据的采样率,而数据的采样率不是 FFT 本身或其输入的一部分。您可以以任何采样率提供相同长度的 FFT 数据,从而从中获得任何频率范围。
结果图以 500 结尾的原因是,对于任何实际数据输入,FFT 长度一半以上的频率只是前半部分数据的镜像重复(复数共轭)。由于它们是重复的,大多数人只是忽略它们。为什么要绘制重复项?FFT 为提供 FFT 复数数据(包括实部和虚部)的人计算结果的另一半,这确实创建了两个不同的半部分。
评论
您的 X 轴绘制频率的原因只有 500 Hz,这是因为您的命令语句“f = Fs/2*linspace(0,1,NFFT/2+1);”。你的 Fs 是 1000。因此,当你将其除以 2 然后乘以 0 到 1 的值时,它会返回一个长度为 NFFT/2+1 的向量。该矢量由等距的频率值组成,范围从 0 到 Fs/2(即 500 Hz)。由于您使用 'plot(f,2*abs(Y(1:NFFT/2+1)))' 命令进行绘图,因此您的 X 轴限制为 500 Hz。
上一个:类似于批处理文件中的函数/方法?
下一个:用于显示多行文本的控件?
评论