窗口函数和信号长度

信息处理 fft matlab 离散信号 频谱 信号检测
2022-02-20 18:56:29

我是 FFT 和 DSP 的新手,我想问你一些关于在 Matlab 中计算 FFT 的问题。以下代码来自 Matlab 帮助,我只是去除了噪音。

  1. 如果我选择信号长度 L > NFFT 会发生什么?那么选择 L 种不同形式的 NFFT 又如何呢?

  2. 在下面的代码中,我不确定我是否正确使用了窗口。但是当我使用window(在下面的代码中)时,我无法获得幅度的确切值?

  3. 当 L 和 NFFT 得到不同的值时(我的意思是当我改变 L 和 NFFT 时),那么幅度的值也不同。如何获得输入信号幅度的确切值?

非常感谢您,并期待收到您的来信:)

Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sample time
L = 512;                     % Length of signal
NFFT=1024;                   % number of fft points
t = (0:L-1)*T;                % Time vector
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);    input signal
X = fft(hann(L).*x', NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);
plot(f,2*abs(X(1:NFFT/2+1)))     % Plot single-sided amplitude spectrum.
3个回答
  1. 如果我选择信号长度 L > NFFT 会发生什么?那么选择 L 种不同形式的 NFFT 又如何呢?

你读过文档吗?http://www.mathworks.com/help/techdoc/ref/fft.html

Y = fft(X,n) 返回 n 点 DFT。fft(X) 等价于 fft(X, n),其中 n 是 X 在第一个非单一维度中的大小。如果 X 的长度小于 n,则用尾随零填充 X 到长度 n。如果 X 的长度大于 n,则序列 X 被截断。当 X 为矩阵时,列的长度以相同的方式调整。

所以它只是忽略了 n 个样本后的信号。

2 在下面的代码中,我不确定我是否正确使用了window。

是的。您只需将窗口乘以信号:

在此处输入图像描述

但是当我使用window(在下面的代码中)时,我无法获得幅度的确切值?

是的,它会衰减窗口末端的任何东西,因此幅度会根据窗口何时到达信号而变化。如果信号中有一个巨大的峰值,但它发生在窗口的末尾,则将其乘以 0。如果它发生在窗口的中间,则将其乘以 1。

对于在窗口上静止的信号,那么窗口何时应用于信号并不重要,对吧?所以你可以乘以一个常数(我认为 2 代表 Hann 窗,因为窗下的面积是 0.5)来得到真实的幅度。

此外,如果您使用重叠窗口和某些窗口(常量重叠相加 (COLA) 约束),我相信您可以将它们组合起来以获得任何波形的真实幅度,甚至是非平稳波形。 https://ccrma.stanford.edu/~jos/sasp/Overlap_Add_Decomposition.html

3 当 L 和 NFFT 得到不同的值时(我的意思是当我改变 L 和 NFFT 时),那么幅度的值也不同。如何获得输入信号幅度的确切值?

信号是静止的,所以你测量多少并不重要。要获得真实的幅度,您可能需要除以 N,具体取决于 matlab 的实现。https://gist.github.com/236567

当 L>NFFT 时,信号会在 FFT 之前被裁剪;当 NFFT>L 时,信号将在 FFT 之前补零。

在您的情况下,该窗口用于抑制噪声,它会改变信号的频谱,因此您无法获得“准确”的幅度频谱。实际上,精确的光谱只能从无限样本中计算出来。由于信号始终具有有限长度,因此您永远无法获得准确的频谱。这称为频谱泄漏

如何获得输入信号幅度的确切值?

如果您的信号是平稳且完全周期性的,那么您可以通过使用恰好是信号周期整数倍的数据和 FFT 长度来获得幅度,并且不使用窗口函数。

如果您不知道周期或 S/N 比,并且只想要光谱的估计而不是任何“精确”值,则非矩形窗函数和比数据长度更长的 FFT 长度很有用。比数据长度更长的 FFT 长度还有助于从给定数量的数据样本中插入“看起来更平滑”的频谱,从而有可能提供远高于本底噪声的孤立频谱峰值的更高分辨率频率。