Нулевое заполнение - до или после оконной обработки? - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь выполнить 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

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вы должны сделать это до FFT.

  1. Разделите сигнал на кадры, см. Функцию butter ;
  2. Применить окно к каждому кадру: кадры x окно;
  3. Ноль-падд сигнала;
  4. БПФ каждого оконного кадра.

P.S. Я где-то читал, что алгоритм FFT уже выполняет автоматическое заполнение нулями, т. Е. Когда вы переходите к FFT (x), он уже «дополнит» сигнал x нулями в конце, чтобы достичь длины FFT.

0 голосов
/ 11 ноября 2018

Вы обнуляете кадры внутри окна после окна, чтобы сделать длину окна степенью 2

...