Đảo ngược thuật toán biến đổi Fourier thời gian ngắn được mô tả bằng từ ngữ


20

Tôi đang cố gắng hiểu một cách khái niệm những gì đang xảy ra khi các Biến đổi Fourier chuyển tiếp và nghịch đảo (STFT) được áp dụng cho tín hiệu miền thời gian rời rạc. Tôi đã tìm thấy bài báo kinh điển của Allen và Rabiner ( 1977 ), cũng như một bài viết trên Wikipedia ( liên kết ). Tôi tin rằng cũng có một bài viết hay khác được tìm thấy ở đây .

Tôi quan tâm đến việc tính toán biến đổi Gabor, không gì khác hơn là STFT với cửa sổ Gaussian.

Đây là những gì tôi hiểu về STFT chuyển tiếp :

  1. Một chuỗi con được chọn từ tín hiệu, bao gồm các yếu tố miền thời gian.
  2. Chuỗi con được nhân với một hàm cửa sổ bằng cách nhân từng điểm trong miền thời gian.
  3. Chuỗi con được nhân lên được đưa vào miền tần số bằng cách sử dụng FFT.
  4. Bằng cách chọn các chuỗi con chồng chéo liên tiếp và lặp lại quy trình ở trên, chúng ta có được một ma trận với m hàng và n cột. Mỗi cột là chuỗi con được tính toán tại một thời điểm nhất định. Điều này có thể được sử dụng để tính toán một phổ.

Tuy nhiên, đối với STFT nghịch đảo , các bài báo nói về một tổng kết trên các phần phân tích chồng chéo. Tôi thấy rất khó khăn để hình dung những gì đang thực sự xảy ra ở đây. Tôi phải làm gì để có thể tính toán STFT nghịch đảo (theo thứ tự từng bước như trên)?

Chuyển tiếp STFT

Tôi đã tạo một bản vẽ cho thấy những gì tôi nghĩ đang diễn ra cho STFT phía trước. Điều tôi không hiểu là làm thế nào để tập hợp từng chuỗi con để tôi lấy lại chuỗi thời gian ban đầu. Ai đó có thể sửa đổi bản vẽ này hoặc đưa ra một phương trình cho thấy cách thêm các chuỗi con?Chuyển đổi chuyển tiếp

Biến đổi nghịch đảo

Đây là những gì tôi hiểu về biến đổi nghịch đảo. Mỗi cửa sổ liên tiếp được đưa trở lại miền thời gian bằng IFFT. Sau đó, mỗi cửa sổ được thay đổi theo kích thước bước và được thêm vào kết quả của ca trước đó. Sơ đồ sau cho thấy quá trình này. Đầu ra tổng là tín hiệu miền thời gian.

Biến đổi nghịch đảo

Mã ví dụ

Mã Matlab sau đây tạo tín hiệu miền thời gian tổng hợp, sau đó kiểm tra quy trình STFT, chứng minh rằng nghịch đảo là kép của biến đổi chuyển tiếp, trong lỗi tắt số tròn. Đầu và cuối của tín hiệu được đệm bằng 0 để đảm bảo rằng tâm của cửa sổ có thể được đặt ở các phần tử đầu tiên và cuối cùng của tín hiệu miền thời gian.

LƯU Ý rằng theo Allen và Rabiner (1977), nếu phép nhân xảy ra trong miền tần số để thay đổi tần số đáp ứng, độ dài của cửa sổ phân tích phải bằng hoặc lớn hơn điểm, trong đó là đáp ứng bộ lọc . Chiều dài được mở rộng bằng cách đệm không. Mã kiểm tra chỉ đơn giản cho thấy rằng nghịch đảo là kép của biến đổi chuyển tiếp. Chiều dài phải được mở rộng để ngăn chặn một tổ hợp tròn.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
Câu hỏi tuyệt vời - nhưng, làm thế nào bạn thực hiện những sơ đồ này một cách nhanh chóng? ...
Spacey

2
Tôi đã sử dụng Adobe Illustrator cho các sơ đồ và Mathtype cho các ký tự Hy Lạp.
Nicholas Kinar

1
"Tôi quan tâm đến việc tính toán biến đổi Gabor, không gì khác hơn là STFT với cửa sổ Gaussian." Hãy nhớ rằng biến đổi Gabor là một tích phân liên tục và các cửa sổ Gaussian mở rộng đến vô tận. Việc triển khai STFT điển hình sử dụng các khối chồng chéo rời rạc và phải sử dụng các cửa sổ có chiều dài hữu hạn.
endolith

Cảm ơn đã chỉ ra rằng, endolith. Tôi có xu hướng suy nghĩ một cách rất riêng biệt khi thực hiện xử lý tín hiệu.
Nicholas Kinar

Câu trả lời:


11

Cặp biến đổi STFT có thể được đặc trưng bởi 4 tham số khác nhau:

  1. Kích thước FFT (N)
  2. Kích thước bước (M)
  3. Cửa sổ phân tích (kích thước N)
  4. Cửa sổ tổng hợp (kích thước N)

Quá trình này như sau:

  1. Lấy mẫu N (kích thước fft) từ vị trí đầu vào hiện tại
  2. Áp dụng cửa sổ phân tích
  3. Làm FFT
  4. Làm bất cứ điều gì bạn muốn làm trong miền tần số
  5. FFT nghịch đảo
  6. Áp dụng cửa sổ tổng hợp
  7. Thêm vào đầu ra tại vị trí đầu ra hiện tại
  8. Vị trí đầu vào và đầu ra nâng cao theo mẫu M (kích thước bước)

Thuật toán thêm chồng lấp là một ví dụ tốt cho điều đó. Trong trường hợp này, kích thước bước là N, kích thước FFT là 2 * N, cửa sổ phân tích là hình chữ nhật với N, theo sau là N số không và các cửa sổ tổng hợp chỉ đơn giản là tất cả các cửa sổ.

Có rất nhiều sự lựa chọn khác cho điều đó và trong một số điều kiện nhất định, chuyển tiếp / nghịch đảo được tái cấu trúc hoàn toàn (tức là bạn có thể lấy lại tín hiệu ban đầu).

Điểm mấu chốt ở đây là mỗi mẫu đầu ra thường nhận được đóng góp phụ gia từ nhiều hơn một FFT nghịch đảo. Đầu ra cần phải được tích lũy qua nhiều khung. Số lượng khung đóng góp được đưa ra đơn giản bằng kích thước FFT chia cho kích thước bước (làm tròn lên, nếu cần).


Cảm ơn bạn rất nhiều vì câu trả lời sâu sắc của bạn. Tôi hiểu phương pháp chồng chéo. Tôi sử dụng gì cho cửa sổ tổng hợp? Có một phương trình? Nếu tôi biết hàm cửa sổ phân tích (như cửa sổ Gaussian), làm cách nào để tính cửa sổ tổng hợp? Tôi hiểu phương thức thêm chồng lấp được sử dụng để tích chập, nhưng tôi không hiểu cách sử dụng phương pháp này cho STFT. Nếu kích thước bước là bước = 1, làm cách nào để thêm các khung lại với nhau? Có một phương trình?
Nicholas Kinar

Nếu chức năng cửa sổ phân tích được căn giữa ở mỗi mẫu với kích thước bước step = 1, thì tôi có phải không bắt đầu và kết thúc chuỗi miền thời gian sao cho giữa cửa sổ được căn giữa ở mỗi mẫu (bao gồm cả đầu tiên và cuối cùng các mẫu trong chuỗi thời gian)?
Nicholas Kinar

Bạn có thể chọn kích thước bước, kích thước fft, cửa sổ phân tích và tổng hợp tùy thuộc vào nhu cầu cụ thể của ứng dụng của bạn. Một ví dụ là kích thước bước N, kích thước FFT 2 * N, phân tích hanning, tổng hợp tất cả những cái. Bạn có thể sửa đổi điều đó để phân tích sqrt (hanning) và sqrt tổng hợp (hanning). Một trong hai sẽ làm việc. Tôi hiểu rõ những gì bạn làm trong miền tần số và loại tạo tác nào như bí danh miền thời gian bạn có thể tạo.
Hilmar

@Hilmar: Tôi cần có khả năng sửa đổi miền tần số thành tín hiệu, sau đó lấy IFFT để lấy tín hiệu miền thời gian. Tôi muốn giảm thiểu bí danh miền thời gian. Tôi vẫn không hiểu làm thế nào để đưa từng chuỗi con trở lại miền thời gian và sau đó thêm chúng lại với nhau.
Nicholas Kinar

Tôi đã viết một số mã kiểm tra và sau đó cập nhật câu hỏi ban đầu của tôi.
Nicholas Kinar

2

Bảy năm sau khi câu hỏi này lần đầu tiên được nêu ra, tôi gặp phải sự nhầm lẫn này tương tự như @Nicholas Kinar. Ở đây tôi muốn cung cấp một số ý tưởng và giải thích nhận thức cá nhân "không chính thức" và "không chính xác".

Tiêu đề của các tuyên bố sau được phóng đại để dễ hiểu hơn.

  1. Quá trình chuyển tiếp của STFT không thực sự có nghĩa là để bảo toàn tín hiệu gốc.
    • Khi sử dụng STFT với cửa sổ không tầm thường (Không phải tất cả), tín hiệu đầu vào cho FFT là phiên bản bị lệch / kéo dài của đoạn tín hiệu gốc.
    • Điều này tốt cho việc trích xuất tính năng, trong đó dữ liệu vô dụng / dư thừa được lọc ra. Giống như trong phát hiện âm tiết, không phải tất cả dữ liệu tạm thời là cần thiết để phát hiện một số âm nhất định trong bài phát biểu.
    • Đỉnh trong vectơ cửa sổ biểu thị thiểu số các vị trí trong tín hiệu âm thanh nơi các thuật toán nên chú ý đến.
  2. Vì vậy, kết quả thô của STFT nghịch đảo có thể là điều mà chúng ta có thể không mong đợi bằng trực giác.
    • Nó phải là các đoạn tín hiệu được cửa sổ mà các tính năng của STFT sẽ trông như thế nào.
  3. Để có được các đoạn tín hiệu không có cửa sổ ban đầu, người ta có thể áp dụng cửa sổ nghịch đảo cho đầu ra thô của ifft.
    • Thật dễ dàng để thiết kế một chức năng ánh xạ có thể hoàn tác hiệu ứng cửa sổ hann / hamming.
  4. Cửa sổ tổng hợp sau đó được tham gia để đối phó với sự phân mảnh thời gian chồng chéo
    • Do các đoạn tín hiệu chưa được cửa sổ ban đầu có thể được xem như đã thu được, nên bất kỳ "trọng số chuyển tiếp" nào cũng có thể được sử dụng để nội suy các phần chồng chéo.
  5. Nếu bạn muốn xem xét rằng fft của một bài phát biểu có cửa sổ có thể ít tôn trọng các tín hiệu yếu hơn nhưng yêu thích các tín hiệu mạnh mẽ đó, thì có thể có một cách để thiết kế các cửa sổ tổng hợp tương ứng.
  6. Ngoài ra, một thuật toán tạo cửa sổ tổng hợp chuyển tiếp thẳng có thể được đưa ra bằng cách áp dụng các nguyên tắc sau:
    • trọng số cao hơn các vị trí trong cửa sổ tổng hợp nếu giá trị cửa sổ phân tích cho vị trí này cao, so với các mảnh khác chồng lên vị trí này.
    • trọng số hạ thấp các vị trí trong cửa sổ tổng hợp nếu giá trị cửa sổ phân tích cho vị trí này thấp và các phân đoạn chồng chéo khác tôn vinh vị trí này nhiều hơn với giá trị cửa sổ phân tích lớn hơn.

1
Đây là những tuyên bố thú vị chắc chắn có thể giúp khuyến khích suy nghĩ về STFT.
Nicholas Kinar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.