零填充 - 在窗口之前还是之后?
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 之前完成。
- 将信号分成帧,见butter函数;
- 对每个帧应用 window:帧 x window;
- 零填充信号;
- FFT 每个 windowed 帧。
P.S。我在某处读到 FFT 算法已经自动进行了零填充,即,当您使用 FFT(x) 时,它已经在末尾用零“填充”信号 x,以达到 FFT 的长度。
我正在尝试对语音信号执行 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 之前完成。
- 将信号分成帧,见butter函数;
- 对每个帧应用 window:帧 x window;
- 零填充信号;
- FFT 每个 windowed 帧。
P.S。我在某处读到 FFT 算法已经自动进行了零填充,即,当您使用 FFT(x) 时,它已经在末尾用零“填充”信号 x,以达到 FFT 的长度。