零填充 - 在窗口之前还是之后?

Zero padding - before or after the windowing?

我正在尝试对语音信号执行 STFT。我想知道什么时候应该进行零填充,是在对每一帧进行窗口化之前,还是之后?

我的尝试:

x    = signal(:);                   % make sure signal is a column vector
sL   = length(x);                   % signal length
wL   = fix(window_Time*fs);         % window length
HOP  = floor(wL*(1 - overlap/100)); % windowing step 
win  = gausswin(wL);                % window type
F    = 1 + fix((sL-wL)/HOP);        % calculate the number of signal     frames
stft = zeros(nfft,F);               % preallocate stft matrix, [nfftxF]

for f = 0:F-1
    xw          = x(1+f*HOP:wL+f*HOP).*win; % windowing
    X           = fftshift(fft([xw;zeros(wL,1)],nfft));   % FFT shifted (double-sided)
    stft(:,1+f) = X;                        % update of the stft matrix
end

在 window 使 window 长度成为 2

的幂后,您在 window 内补零帧

你必须在 FFT 之前完成。

  1. 将信号分成帧,见butter函数;
  2. 对每个帧应用 window:帧 x window;
  3. 零填充信号;
  4. FFT 每个 windowed 帧。

P.S。我在某处读到 FFT 算法已经自动进行了零填充,即,当您使用 FFT(x) 时,它已经在末尾用零“填充”信号 x,以达到 FFT 的长度。