当 FFT 大小小于信号持续时间时,幅度如何缩放?

信息处理 fft 离散信号
2022-02-06 16:55:00

我有一个非常简单的问题:当我们进行 FFT 时,信号的幅度如何缩放,其中 FFT 窗口长度比信号的持续时间短?这是否意味着如果 FFT 大小缩短 12 倍,那么信号幅度也将按 1/12 缩放?如果是这样,数学解释是什么。提前感谢您的任何回复。

1个回答

当您对具有长度的信号进行简单的 DFT 时ñ,那么你必须适当地缩放它。通常它是通过将幅度除以频谱矢量的长度来完成的,即ñ. 另一件事是,通常我们对单边光谱感兴趣,因此您需要将上述结果乘以 2 以补偿能量。这将确保量值具有代表性。

如果您使用不同于矩形的窗口(Hamming、Blackman 等),您不会除以ñ- 您必须按窗口样本的总和对其进行缩放。

因此,当您对信号进行窗口化时,您会得到一个窗口长度的新信号。因此,在您的情况下,幅度将按比例缩小 12。

1Hz 正弦波和两种窗口类型的示例如下所示。请注意,频率轴在 3Hz 处被斩波。您可以看到峰值的幅度等于信号的单位幅度。同样,在汉明窗的情况下,旁瓣比在矩形的情况下要低得多,同时牺牲了主瓣宽度。这可以在对数尺度上更好地看到。

在此处输入图像描述

用于产生结果的 MATLAB 代码:

clc, clear all, close all
f0 = 1;        % fundamental frequency
fs = 50;       % sampling frequency
T = 6*pi;      % upper time limit 
t = 0:1/fs:T;  % time vector
N = length(t); % number of samples

% 5 Hz sinusoid with unit amplitude
s = sin(2*pi*f0*t);
% Windowing signal
win = hamming(N)'; 
s_win = s.*win;
% Magnitude spectra
S = abs(fft(s));
S_win = abs(fft(s_win));
% Frequency vector
f = (0:fs/N:round(fs/2));
% Take one-sided spectrum
S_h = 2*S(1:length(f));
S_win_h = 2*S_win(1:length(f));
% Normalisation
S_h = S_h / length(s);
S_win_h = S_win_h / sum(win);
% Time domain signal plots
subplot(2,1,1)
plot(t,s)
xlim([0 T]); grid on; hold on;
plot(t,s_win,'r');
legend({'Rectangular window','Hamming window'})
xlabel('Time'); ylabel('Amplitude')
% Frequency domain plots
subplot(2,1,2)
plot(f, S_h)
grid on; hold on;
plot(f, S_win_h, 'r');
legend({'Rectangular window','Hamming window'})
xlabel('Frequency'); ylabel('Amplitude')
xlim([0 3])