Алгоритм обратного кратковременного преобразования Фурье, описанный словами


20

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

Я заинтересован в вычислении преобразования Габора, которое представляет собой не что иное, как STFT с гауссовым окном.

Вот что я понимаю о форвардном STFT:

  1. Подпоследовательность выбирается из сигнала, состоящего из элементов временной области.
  2. Подпоследовательность умножается на оконную функцию с использованием точечного умножения во временной области.
  3. Умноженная подпоследовательность берется в частотную область с использованием БПФ.
  4. Выбрав последовательные перекрывающиеся подпоследовательности и повторив вышеописанную процедуру, мы получим матрицу с m строками и n столбцами. Каждый столбец - это подпоследовательность, вычисленная в данный момент времени. Это может быть использовано для вычисления спектрограммы.

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

Вперед STFT

Я создал рисунок, показывающий, что, как мне кажется, происходит для форвардного STFT. Чего я не понимаю, так это как собрать каждую из подпоследовательностей, чтобы я вернулся к исходной временной последовательности. Может ли кто-нибудь изменить этот рисунок или дать уравнение, показывающее, как добавляются подпоследовательности?Прямое преобразование

Обратное преобразование

Вот что я понимаю об обратном преобразовании. Каждое последующее окно возвращается во временную область с использованием IFFT. Затем каждое окно сдвигается на размер шага и добавляется к результату предыдущего сдвига. Следующая диаграмма показывает этот процесс. Суммированный выходной сигнал является сигналом временной области.

Обратное преобразование

Пример кода

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

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

% 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
Отличный вопрос - но как вы сделали эти диаграммы так быстро на лету? ...
Спейси

2
Я использовал Adobe Illustrator для диаграмм и Mathtype для греческих символов.
Николай Кинар

1
«Я заинтересован в вычислении преобразования Габора, которое представляет собой не более чем STFT с гауссовым окном». Помните, что преобразование Габора является непрерывным интегралом, и что гауссовы окна расширяются до бесконечности. Типичные реализации STFT используют дискретные перекрывающиеся фрагменты и должны использовать окна конечной длины.
эндолит

Спасибо за указание на это, эндолит. Я склонен мыслить очень дискретно при обработке сигналов.
Николай Кинар

Ответы:


11

Пара преобразования STFT может быть охарактеризована 4 различными параметрами:

  1. Размер БПФ (N)
  2. Размер шага (М)
  3. Окно анализа (размер N)
  4. Окно синтеза (размер N)

Процесс выглядит следующим образом:

  1. Получить N (размер в футах) выборок из текущего местоположения ввода
  2. Применить окно анализа
  3. Сделать БПФ
  4. Делай, что хочешь в частотной области
  5. Обратное БПФ
  6. Применить окно синтеза
  7. Добавить к выходу в текущем месте выхода
  8. Предварительное расположение ввода и вывода по M (размер шага) выборок

Алгоритм добавления перекрытия является хорошим примером для этого. В этом случае размер шага равен N, размер БПФ равен 2 * N, окно анализа является прямоугольным с N единицами, за которыми следуют N нулей, а окна синтеза - просто все.

Для этого есть множество других вариантов, и при определенных условиях прямая / обратная передача полностью восстанавливается (т.е. вы можете получить исходный сигнал обратно).

Ключевым моментом здесь является то, что каждая выходная выборка обычно получает аддитивные вклады от более чем одного обратного БПФ. Вывод должен быть накоплен в нескольких кадрах. Количество участвующих кадров просто определяется размером FFT, деленным на размер шага (при необходимости округляется в большую сторону).


Большое спасибо за ваш проницательный ответ. Я понимаю метод перекрытия-добавления. Что я использую для окна синтеза? Есть ли уравнение? Если я знаю функцию окна анализа (например, окно Гаусса), как мне вычислить окно синтеза? Я понимаю, как метод наложения-добавления используется для свертки, но я не понимаю, как он используется для STFT. Если размер шага равен step = 1, как мне добавить кадры вместе? Есть ли уравнение?
Николас Кинар

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

Вы можете выбрать размер шага, размер БПФ, окна анализа и синтеза в зависимости от конкретных потребностей вашего приложения. Одним из примеров является размер шага N, размер БПФ 2 * N, анализ анализа, синтез всех. Вы можете изменить это для анализа sqrt (hanning) и синтеза sqrt (hanning). Либо один будет работать. Я сводлюсь к тому, что вы делаете в частотной области, и к каким типам артефактов, таким как псевдонимы во временной области, вы можете создавать.
Хильмар

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

Я написал тестовый код, а затем обновил свой оригинальный вопрос.
Николай Кинар

2

Через семь лет после того, как этот вопрос был впервые поднят, я столкнулся с этой путаницей, похожей на @Nicholas Kinar. Здесь я хотел бы привести некоторые «неофициальные» и «не совсем корректные» личные идеи восприятия и объяснения.

Название следующих утверждений преувеличено для лучшей наглядности.

  1. Процесс пересылки STFT на самом деле не предназначен для сохранения исходного сигнала.
    • При использовании STFT с нетривиальным окном (не для всех) входной сигнал в FFT является искаженной / растянутой версией исходного фрагмента сигнала.
    • Это хорошо для извлечения функций, в которых бесполезные / избыточные данные отфильтровываются. Как и при обнаружении слогов, не все временные данные необходимы для обнаружения некоторых определенных тонов в речи.
    • Пик в окне вектора представляет меньшую часть позиций в аудиосигнале, на которые должны обратить внимание алгоритмы.
  2. Таким образом, исходный результат обратного STFT может быть чем-то, чего мы не можем интуитивно ожидать.
    • Это должны быть фрагменты оконного сигнала, которыми должен выглядеть набор функций STFT.
  3. Чтобы получить исходные неоконные фрагменты сигнала, можно применить обратное окно к необработанному выводу ifft.
    • Легко спроектировать картографическую функцию, которая может отменить эффект окна Ханна / Хэмминга.
  4. Затем включается окно синтеза, чтобы справиться с перекрытием временной фрагментации
    • Поскольку исходные неоконные фрагменты сигнала можно рассматривать как уже полученные, любые «весовые коэффициенты перехода» могут использоваться для интерполяции перекрывающихся частей.
  5. Если вы хотите учесть, что часть оконной речи может меньше уважать слабые сигналы, но обожать эти мощные сигналы, тогда может быть способ спроектировать соответствующие окна синтеза.
  6. Кроме того, прямой алгоритм генерации окна синтеза может быть задан с применением следующих принципов:
    • вес выше позиций в окне синтеза, если значение окна анализа для этой позиции велико, по сравнению с другими фрагментами, которые перекрывают эту позицию.
    • наименьшее значение уменьшают позиции в окне синтеза, если значение окна анализа для этой позиции является низким, а другие перекрывающиеся фрагменты больше удовлетворяют этой позиции с большим значением окна анализа.

1
Это интересные заявления, которые определенно могут помочь стимулировать размышления о STFT.
Николай Кинар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.