Алгоритм зворотного короткого часу перетворення Фур'є, описаний словами


20

Я намагаюся концептуально зрозуміти, що відбувається, коли прямі та зворотні короткочасні перетворення Фур'є (STFT) застосовуються до дискретного сигналу часової області. Я знайшов класичний документ Аллена та Рабінера ( 1977 ), а також статтю у Вікіпедії ( посилання ). Я вважаю , що є ще одна хороша стаття можна знайти тут .

Мені цікаво обчислити перетворення Габора, яке є не що інше, як STFT з гауссовим вікном.

Це те, що я розумію про прямий STFT:

  1. Підсигнал вибирається з сигналу, що складається з елементів часової області.
  2. Підпослідовність множиться на віконну функцію, використовуючи кратне множення у часовій області.
  3. Розмножена підпослідовність приймається у частотній області за допомогою FFT.
  4. Вибравши послідовні перекриваючі підрядки та повторивши процедуру вище, ми отримуємо матрицю з m рядками та n стовпцями. Кожен стовпець - це підпорядкованість, обчислена в даний момент часу. Це можна використовувати для обчислення спектрограми.

Однак, для зворотного STFT, документи говорять про підсумовування над розділами аналізу, що перекриваються. Мені дуже складно уявити, що насправді відбувається тут. Що я повинен зробити, щоб можна було обчислити зворотний STFT (покроковий порядок, як зазначено вище)?

Вперед STFT

Я створив креслення, на якому показано, що я думаю, що відбувається для передового STFT. Я не розумію, як зібрати кожну з підрядів, щоб я повернув початкову послідовність часу. Чи може хтось або змінити цей малюнок, або дати рівняння, яке показує, як додаються підрядки?Вперед перетворення

Зворотне перетворення

Ось що я розумію щодо зворотного перетворення. Кожне наступне вікно повертається у часову область за допомогою IFFT. Потім кожне вікно зміщується на розмір кроку та додається до результату попередньої зміни. На наступній схемі показаний цей процес. Підсумований вихід - це сигнал часової області.

Зворотне перетворення

Приклад коду

Наведений нижче код Matlab генерує синтетичний сигнал часової області, а потім тестує процес STFT, демонструючи, що обернене є подвійним переходом прямого перетворення в межах числової помилки округлення. Початок і кінець сигналу накладені на нуль, щоб центр вікна міг бути розташований на першому та останньому елементах сигналу часової області.

Зверніть увагу, що згідно з Алленом та Рабінером (1977), якщо у частотній області відбувається множення, щоб змінити частотну характеристику, довжина вікна аналізу повинна бути рівною або більшою, ніж бал, де - відповідь фільтра . Довжина подовжується нульовим накладкою. Тестовий код просто показує, що обернене є дуалом прямого перетворення. Довжина повинна бути збільшена, щоб запобігти круговій згортці.N 0N+N0-1N0

% The code computes the STFT (Gabor transform) with step size = 1
% This is most useful when modifications of the signal is required in
% the frequency domain

% The Gabor transform is a STFT with a Gaussian window (w_t in the code)

% written by Nicholas Kinar

% Reference:
% [1] J. B. Allen and L. R. Rabiner, 
% “A unified approach to short-time Fourier analysis and synthesis,” 
% Proceedings of the IEEE, vol. 65, no. 11, pp. 1558 – 1564, Nov. 1977.

% generate the signal
mm = 8192;                  % signal points
t = linspace(0,1,mm);       % time axis

dt = t(2) - t(1);           % timestep t
wSize = 101;                % window size


% generate time-domain test function
% See pg. 156
% J. S. Walker, A Primer on Wavelets and Their Scientific Applications, 
% 2nd ed., Updated and fully rev. Boca Raton: Chapman & Hall/CRC, 2008.
% http://www.uwec.edu/walkerjs/primer/Ch5extract.pdf
term1 = exp(-400 .* (t - 0.2).^2);
term2 = sin(1024 .* pi .* t);
term3 = exp(-400.*(t- 0.5).^2);
term4 = cos(2048 .* pi .* t);
term5 = exp(-400 .* (t-0.7).^2);
term6 = sin(512.*pi.*t) - cos(3072.*pi.*t);
u = term1.*term2  + term3.*term4 + term5.*term6; % time domain signal
u = u';

figure;
plot(u)

Nmid = (wSize - 1) / 2 + 1;    % midway point in the window
hN = Nmid - 1;                 % number on each side of center point       


% stores the output of the Gabor transform in the frequency domain
% each column is the FFT output
Umat = zeros(wSize, mm);     


% generate the Gaussian window 
% [1] Y. Wang, Seismic inverse Q filtering. Blackwell Pub., 2008.
% pg. 123.
T = dt * hN;                    % half-width
sp = linspace(dt, T, hN); 
targ = [-sp(end:-1:1) 0 sp];    % this is t - tau
term1 = -((2 .* targ) ./ T).^2;
term2 = exp(term1);
term3 = 2 / (T * sqrt(pi));
w_t = term3 .* term2;
wt_sum = sum ( w_t ); % sum of the wavelet


% sliding window code
% NOTE that the beginning and end of the sequence
% are padded with zeros 
for Ntau = 1:mm

    % case #1: pad the beginning with zeros
    if( Ntau <= Nmid )
        diff = Nmid - Ntau;
        u_sub = [zeros(diff,1); u(1:hN+Ntau)];
    end

    % case #2: simply extract the window in the middle
    if (Ntau < mm-hN+1 && Ntau > Nmid)
        u_sub = u(Ntau-hN:Ntau+hN);
    end

    % case #3: less than the end
    if(Ntau >= mm-hN+1)
        diff = mm - Ntau;
        adiff = hN - diff;
        u_sub = [ u(Ntau-hN:Ntau+diff);  zeros(adiff,1)]; 
    end   

    % windowed trace segment
    % multiplication in time domain with
    % Gaussian window  function
    u_tau_omega = u_sub .* w_t';

    % segment in Fourier domain
    % NOTE that this must be padded to prevent
    % circular convolution if some sort of multiplication
    % occurs in the frequency domain
    U = fft( u_tau_omega );

    % make an assignment to each trace
    % in the output matrix
    Umat(:,Ntau) = U;

end

% By here, Umat contains the STFT (Gabor transform)

% Notice how the Fourier transform is symmetrical 
% (we only need the first N/2+1
% points, but I've plotted the full transform here
figure;
imagesc( (abs(Umat)).^2 )


% now let's try to get back the original signal from the transformed
% signal

% use IFFT on matrix along the cols
us = zeros(wSize,mm);
for i = 1:mm 
    us(:,i) = ifft(Umat(:,i));
end

figure;
imagesc( us );

% create a vector that is the same size as the original signal,
% but allows for the zero padding at the beginning and the end of the time
% domain sequence
Nuu = hN + mm + hN;
uu = zeros(1, Nuu);

% add each one of the windows to each other, progressively shifting the
% sequence forward 
cc = 1; 
for i = 1:mm
   uu(cc:cc+wSize-1) = us(:,i) + uu(cc:cc+wSize-1)';
   cc = cc + 1;
end

% trim the beginning and end of uu 
% NOTE that this could probably be done in a more efficient manner
% but it is easiest to do here

% Divide by the sum of the window 
% see Equation 4.4 of paper by Allen and Rabiner (1977)
% We don't need to divide by L, the FFT transform size since 
% Matlab has already taken care of it 
uu2 = uu(hN+1:end-hN) ./ (wt_sum); 

figure;
plot(uu2)

% Compare the differences bewteen the original and the reconstructed
% signals.  There will be some small difference due to round-off error
% since floating point numbers are not exact
dd = u - uu2';

figure;
plot(dd);

2
Чудове запитання - але як ти швидко зробив ці діаграми на льоту? ...
Spacey

2
Я використовував Adobe Illustrator для діаграм і Mathtype для грецьких символів.
Ніколас Кінар

1
"Мені цікаво обчислити перетворення Габора, яке є не що інше, як STFT з гауссовим вікном". Пам’ятайте, що перетворення Габора є суцільним інтегралом, і що Гауссові вікна поширюються до нескінченності. У типових реалізаціях STFT використовуються дискретні перекриті шматки і доводиться використовувати вікна кінцевої довжини.
ендоліт

Дякую, що вказали на це, ендоліт. Я схильний думати дуже дискретно, коли роблю обробку сигналів.
Микола Кінар

Відповіді:


11

Пара трансформацій STFT може характеризуватися 4 різними параметрами:

  1. Розмір FFT (N)
  2. Розмір кроку (М)
  3. Вікно аналізу (розмір N)
  4. Вікно синтезу (розмір N)

Процес такий:

  1. Візьміть N зразків (fft size) з поточного місця введення
  2. Застосувати вікно аналізу
  3. Зробіть FFT
  4. Робіть все, що ви хочете зробити, в частотній області
  5. Зворотний FFT
  6. Застосувати вікно синтезу
  7. Додати до виходу у поточному місці виводу
  8. Заздалегідь розташування вводу та виводу за М (зразками кроків)

Алгоритм додавання перекриття є хорошим прикладом для цього. У цьому випадку розмір кроку - N, розмір FFT - 2 * N, вікно аналізу прямокутне з N, за яким слід N нулів, а вікна синтезу - просто всі.

Для цього існує безліч інших варіантів, і за певних умов передача вперед / назад повністю реконструюється (тобто ви можете отримати вихідний сигнал назад).

Ключовим моментом тут є те, що кожен вихідний зразок, як правило, отримує додаткові внески з більш ніж однієї зворотної ЗПТ. Вихід потрібно акумулювати на декількох кадрах. Кількість кадрів, що вносяться, просто визначається розміром FFT, поділеним на розмір кроку (округлення, якщо потрібно).


Дуже дякую за проникливу відповідь. Я розумію метод накладання-додавання. Що я використовую для вікна синтезу? Чи існує рівняння? Якщо я знаю функцію вікна аналізу (наприклад, вікно Гаусса), як я обчислюю вікно синтезу? Я розумію, як метод перекриття додавання використовується для згортання, але я не розумію, як він використовується для STFT. Якщо розмір кроку - крок = 1, як я додати кадри разом? Чи існує рівняння?
Ніколас Кінар

Якщо функція вікна аналізу зосереджена на кожному зразку з кроком розміру кроку = 1, чи робити я нульовий пробіл початком і кінцем послідовності часової області, щоб середина вікна була зосереджена на кожному зразку (включаючи перший і останній вибірки в послідовності часової області)?
Ніколас Кінар

Ви можете вибрати розмір кроку, розмір fft, вікна аналізу та синтезу залежно від конкретних потреб вашої програми. Одним із прикладів є розмір кроку N, розмір FFT 2 * N, аналіз ханінгу, синтез всіх. Ви можете змінити це для аналізу sqrt (hanning) та синтезу sqrt (hanning). Або один буде працювати. Я зводиться до того, що ви робите в частотній області, і який тип артефактів, таких як згладжування часової області, ви можете створити.
Гільмар

@Hilmar: Мені потрібно мати можливість змінювати частоту домену сигналу, а потім взяти IFFT, щоб отримати сигнал часової області. Я хотів би мінімізувати згладжування часових доменів. Я досі не розумію, як повернути кожну підпорядку назад у часову область і потім додати їх разом.
Ніколас Кінар

Я написав тестовий код, а потім оновив своє початкове запитання.
Ніколас Кінар

2

Сім років після того, як це питання було вперше поставлене, я стикаюся з цим плутаниною, схожим на @Nicholas Kinar. Тут я хотів би надати деякі "неофіційні" та "правильність не повністю впевнені" особисті перцептивні ідеї та пояснення.

Назва наступних тверджень перебільшена для кращої розбірливості.

  1. Процес переадресації STFT насправді не призначений для збереження вихідного сигналу.
    • При використанні STFT з нетривіальним вікном (Не всі), вхідний сигнал для FFT є перекошеною / розтягнутою версією вихідного фрагмента сигналу.
    • Це добре для вилучення функцій, в яких марно / надлишкові дані фільтруються. Як і при виявленні складів, не всі тимчасові дані потрібні для виявлення певних тонів у мовленні.
    • Пік у віконному векторі представляє меншість позицій в аудіосигналі, на які слід звернути увагу алгоритмам.
  2. Таким чином, сировинним результатом зворотного STFT може стати те, чого ми не можемо інтуїтивно очікувати.
    • Потрібно виглядати фрагменти сигналу, що має вікно, як повинен виглядати ifft функцій STFT.
  3. Для отримання оригінальних фрагментів сигналу, що не має вікна, можна застосувати зворотне вікно до необробленого виводу ifft.
    • Розробити функцію відображення легко, що може скасувати ефект вікна Ханна / Хеммінга.
  4. Потім використовується вікно синтезу, щоб вирішити тимчасове фрагментарне перекриття
    • Оскільки оригінальні фрагменти сигналу без вікна можуть розглядатися як уже отримані, будь-які «перехідні зважування» можуть використовуватися для інтерполяції перекритих частин.
  5. Якщо ви хочете врахувати, що переклад віконної мови може менше поважати слабкі сигнали, але обожнює ці потужні сигнали, то може бути спосіб розробити відповідні вікна синтезу.
  6. Також алгоритм генерації вікна прямого синтезу може бути заданий, застосовуючи наступні принципи:
    • вага вище позицій у вікні синтезу, якщо значення вікна аналізу для цієї позиції є високим, порівняно з іншими фрагментами, які перекривають це положення.
    • вага зменшує позиції у вікні синтезу, якщо значення вікна аналізу для цієї позиції є низьким, а інші фрагменти, що перекриваються, більше позначають цю позицію більшим значенням вікна аналізу.

1
Це цікаві висловлювання, які безумовно можуть допомогти спонукати думати про STFT.
Микола Кінар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.