Kelimelerde açıklanan Ters Kısa Zaman Fourier Dönüşümü algoritması


20

Kavramsal olarak ileri ve ters Kısa Zaman Fourier Dönüşümleri (STFT) ayrık bir zaman alanı sinyaline uygulandığında ne olduğunu anlamaya çalışıyorum. Allen ve Rabiner'ın ( 1977 ) klasik makalesini ve bir Wikipedia makalesini ( bağlantı ) buldum . Burada bulunacak iyi bir makale daha olduğuna inanıyorum .

Bir Gauss penceresiyle STFT'den başka bir şey olmayan Gabor dönüşümünü hesaplamakla ilgileniyorum.

Ileri STFT hakkında anlamak budur :

  1. Zaman etki alanı elemanlarından oluşan sinyalden bir alt dizi seçilir.
  2. Alt dizi, zaman alanında noktadan noktaya çarpma kullanılarak bir pencere işlevi ile çarpılır.
  3. Çarpılan alt dizi, FFT kullanılarak frekans alanına alınır.
  4. Art arda üst üste binen alt sekansları seçerek ve yukarıdaki prosedürü tekrarlayarak, m satır ve n sütun içeren bir matris elde ederiz . Her sütun, belirli bir zamanda hesaplanan alt dizidir. Bu bir spektrogram hesaplamak için kullanılabilir.

Bununla birlikte, ters STFT için, kağıtlar örtüşen analiz bölümleri hakkında bir özet hakkında konuşmaktadır. Burada olup bitenleri görselleştirmeyi çok zor buluyorum. Ters STFT'yi hesaplayabilmek için ne yapmam gerekiyor (yukarıdaki gibi adım adım)?

İleri STFT

İleri STFT için neler olduğunu düşündüğüm bir çizim hazırladım. Anlamadığım şey, alt dizilerin her birinin nasıl monte edileceğidir, böylece orijinal zaman dizisini geri alırım. Birisi bu çizimi değiştirebilir veya alt sekansların nasıl eklendiğini gösteren bir denklem verebilir mi?İleri dönüşüm

Ters Dönüşüm

İşte ters dönüşüm hakkında anladığım şey. Birbirini izleyen her pencere IFFT kullanılarak zaman alanına geri alınır. Daha sonra her pencere adım boyutuna göre kaydırılır ve önceki vardiya sonucuna eklenir. Aşağıdaki şemada bu işlem gösterilmektedir. Toplanan çıktı zaman alanı sinyalidir.

Ters dönüşüm

Kod Örneği

Aşağıdaki Matlab kodu sentetik bir zaman alanı sinyali üretir ve daha sonra STFT işlemini test eder, bu da tersinin sayısal yuvarlama hatası içinde ileri dönüşümün ikili olduğunu gösterir . Sinyalin başlangıcı ve bitişi, pencerenin merkezinin zaman alanı sinyalinin ilk ve son elemanlarına yerleştirilebilmesini sağlamak için sıfır dolguludur.

N-+N-0-1N-0

% 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
Harika bir soru - ama, bu diyagramları hızlı bir şekilde nasıl yaptın? ...
Spacey

2
Diyagramlar için Adobe Illustrator ve Yunan karakterleri için Mathtype kullandım.
Nicholas Kinar

1
"Bir Gauss penceresiyle STFT'den başka bir şey olmayan Gabor dönüşümünü hesaplamakla ilgileniyorum." Gabor dönüşümünün sürekli bir integral olduğunu ve Gauss pencerelerinin sonsuza kadar uzandığını unutmayın. STFT'nin tipik uygulamaları, kesikli kesikli parçalar kullanır ve sonlu uzunluktaki pencereleri kullanmak zorundadır.
endolith

Bunu gösterdiğin için teşekkürler endolith. Sinyal işleme yaparken çok ayrık bir şekilde düşünme eğilimindeyim.
Nicholas Kinar

Yanıtlar:


11

STFT dönüşüm çifti 4 farklı parametre ile karakterize edilebilir:

  1. FFT boyutu (N)
  2. Adım boyutu (M)
  3. Analiz penceresi (boyut N)
  4. Sentez penceresi (boyut N)

İşlem aşağıdaki gibidir:

  1. Geçerli giriş konumundan N (fft boyutu) örnekleri alın
  2. Analiz penceresini uygula
  3. FFT yapın
  4. Frekans alanında ne yapmak isterseniz yapın
  5. Ters FFT
  6. Sentez penceresini uygula
  7. Geçerli çıkış konumundaki çıkışa ekleyin
  8. M (adım boyutu) örnekleri ile gelişmiş giriş ve çıkış yeri

Örtüşme ekleme algoritması bunun için iyi bir örnektir. Bu durumda adım boyutu N, FFT boyutu 2 * N, analiz penceresi N olanı, ardından N sıfırları olan dikdörtgen şeklindedir ve sentez pencereleri basitçe tümüdür.

Bunun için birçok seçenek var ve belirli koşullar altında ileri / ters transfer tamamen yeniden yapılandırılıyor (yani orijinal sinyali geri alabilirsiniz).

Buradaki kilit nokta, her çıktı örneğinin tipik olarak birden fazla ters FFT'den katkı payı almasıdır. Çıktının birden çok çerçeve üzerinde birikmesi gerekir. Katkıda bulunan karelerin sayısı basitçe FFT boyutunun adım boyutuna bölünmesi ile verilir (gerekirse yuvarlanır).


Anlayışlı cevabınız için çok teşekkür ederim. Çakışma ekleme yöntemini anlıyorum. Sentez penceresi için ne kullanırım? Bir denklem var mı? Analiz penceresi işlevini (Gauss penceresi gibi) biliyorsanız, sentez penceresini nasıl hesaplayabilirim? Çakışma ekleme yönteminin evrişim için nasıl kullanıldığını anlıyorum, ancak STFT için nasıl kullanıldığını anlamıyorum. Adım boyutu adım = 1 ise, kareleri birlikte nasıl ekleyebilirim? Bir denklem var mı?
Nicholas Kinar

Analiz penceresi işlevi, adım boyutu adım = 1 olan her örnekte ortalanmışsa, pencerenin ortası her örnekte (ilk ve son dahil) ortalanacak şekilde zaman alanı dizisinin başlangıcını ve sonunu sıfırla doldurur muyum? alan adı dizisindeki örnekler)?
Nicholas Kinar

Uygulamanızın özel ihtiyaçlarına bağlı olarak adım boyutu, fft boyutu, analiz ve sentez pencerelerini seçebilirsiniz. Bir örnek, adım boyutu N, FFT boyutu 2 * N, analiz hanning, hepsinin sentezi. Bunu sqrt (hanning) ve sentez sqrt (hanning) analiz etmek için değiştirebilirsiniz. İkisi de işe yarayacaktır. Frekans alanında ne yaptığınıza ve zaman alanı takma adı gibi ne tür eserler oluşturabileceğinize bağlıyım.
Hilmar

@Hilmar: Sinyale frekans alanı değişiklikleri yapabilmem ve daha sonra bir zaman alanı sinyali almak için IFFT'yi alabilmem gerekiyor. Zaman alanı takma adını en aza indirmek istiyorum. Hala her alt dizinin zaman alanına nasıl geri alınacağını ve sonra bunları nasıl ekleyeceğimi anlamıyorum.
Nicholas Kinar

Bazı test kodları yazdım ve orijinal sorumu güncelledim.
Nicholas Kinar

2

Bu sorunun ilk ortaya çıkışından yedi yıl sonra, @Nicholas Kinar'a benzer bir kafa karışıklığı yaşadım. Burada bazı "resmi olmayan" ve "tam olarak güvence altına alınmayan" kişisel algısal fikir ve açıklamalar sunmak istiyorum.

Daha iyi anlaşılabilirlik için aşağıdaki ifadelerin başlığı abartılmıştır.

  1. STFT'nin ileriye doğru işlenmesi, orijinal sinyalin korunması anlamına gelmez.
    • STFT'yi önemsiz olmayan bir pencerede kullanırken (Hepsi değil), FFT'ye giriş sinyali orijinal sinyal parçasının eğrilmiş / uzatılmış bir versiyonudur.
    • Bu, yararsız / yedekli verilerin filtrelendiği özellik çıkarma için iyidir. Hece tespitinde olduğu gibi, bir konuşmadaki bazı belirli tonları tespit etmek için tüm geçici veriler gerekli değildir.
    • Pencere vektöründeki tepe noktası, bir ses sinyalindeki algoritmaların dikkat etmesi gereken konumların azınlığını temsil eder.
  2. Bu nedenle, ters STFT'nin ham sonucu, sezgisel olarak beklemediğimiz bir şey olabilir.
    • STFT özelliklerinin etkin olması gereken pencereli sinyal parçaları olmalıdır.
  3. Orijinal penceresiz sinyal parçalarını elde etmek için, ifft'nin ham çıktısına bir ters pencere uygulanabilir.
    • Hann / hamming pencere efektini geri alabilen bir haritalama fonksiyonu tasarlamak kolaydır.
  4. Sentez penceresi daha sonra zamansal parçalanma örtüşmesi ile ilgilenir
    • Orijinal penceresiz sinyal parçaları halihazırda elde edildiği gibi görülebildiğinden, üst üste binen parçaları enterpole etmek için herhangi bir "geçiş ağırlığı" kullanılabilir.
  5. Pencereli bir konuşmanın kaynağının zayıf sinyallere daha az saygı gösterebileceğini, ancak bu güçlü sinyallere tapabileceğini düşünmek istiyorsanız, ilgili sentez pencerelerini tasarlamanın bir yolu olabilir.
  6. Ayrıca, aşağıdaki ilkeler uygulanarak bir düz ileri sentez penceresi oluşturma algoritması verilebilir:
    • bu pozisyon için analiz penceresi değeri yüksekse, bu pozisyonla çakışan diğer fragmanlarla karşılaştırıldığında, sentez penceresindeki pozisyonların ağırlığı artar.
    • bu pozisyon için analiz penceresi değeri düşükse ve sentezleme penceresindeki pozisyonları düşürürseniz ve üst üste binen diğer fragmanlar bu pozisyonu daha büyük bir analiz penceresi değeri ile onurlandırır.

1
Bunlar, STFT hakkında düşünmeyi teşvik etmeye kesinlikle yardımcı olabilecek ilginç ifadelerdir.
Nicholas Kinar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.