50

我是 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)|')

频域

4

4 回答 4

40

1)为什么x轴(频率)以500结束?我怎么知道没有更多的频率或者它们只是被忽略了?

它以 500Hz 结束,因为这是在 1000Hz 采样时信号的奈奎斯特频率。查看 Mathworks 示例中的这一行:

f = Fs/2*linspace(0,1,NFFT/2+1);

第二个图的频率轴从 0 到Fs/2,或采样频率的一半。 奈奎斯特频率始终是采样频率的一半,因为在此之上会发生混叠别名插图

信号会“折叠”回自身,并且似乎是某个频率等于或低于 500Hz。

2) 我怎么知道频率在 0 到 500 之间?FFT不应该告诉我,频率在哪些范围内?

由于上述的“折叠”(奈奎斯特频率也俗称“折叠频率”),500Hz以上的频率在物理上是不可能出现在FFT中的;较高的频率将“折返”并显示为较低的频率。

FFT 是否只返回幅度值而不返回频率?

是的,MATLAB FFT 函数只返回一个幅度向量。但是,它们映射到您传递给它的频率点。

让我知道需要澄清的内容,以便我可以进一步帮助您。

于 2012-05-25T16:55:07.230 回答
10

这里有一些误解。

超过 500 的频率可以表示为长度为 1000 的 FFT 结果。不幸的是,这些频率都折叠在一起并混合到前 500 个 FFT 结果箱中。因此,通常您不希望向 FFT 提供包含采样率一半或以上的任何频率的信号,因为 FFT 不会在意,只会将高频与低频(混叠)混合在一起,从而使结果非常漂亮多没用。这就是为什么数据在被采样并馈送到 FFT 之前应该进行低通滤波的原因。

FFT 返回没有频率的幅度,因为频率不仅取决于 FFT 的长度,还取决于数据的采样率,这不是 FFT 本身的一部分,也不是它的输入。您可以以任何采样率提供相同长度的 FFT 数据,从而从中获得任何频率范围。

结果图以 500 结束的原因是,对于任何实际数据输入,FFT 长度一半以上的频率只是前半部分数据的镜像重复(复共轭)。由于它们是重复的,大多数人只是忽略它们。为什么要绘制重复?FFT 为提供 FFT 复数数据(具有实部和虚部)的人计算结果的另一半,这确实创建了两个不同的一半。

于 2012-05-25T18:46:41.110 回答
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 只是为每个频率仓分配一个幅度(和相位)。

于 2012-05-25T16:49:37.257 回答
-1

您的 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。

于 2016-11-03T05:36:36.527 回答