순방향 및 역 짧은 시간 푸리에 변환 (STFT)이 이산 시간 도메인 신호에 적용될 때 발생하는 상황을 개념적으로 이해하려고합니다. Allen and Rabiner ( 1977 )의 논문과 Wikipedia 기사 ( link )를 찾았습니다 . 또한 찾을 수있는 또 다른 좋은 기사가 있다고 생각 여기 .
Gabors 변환을 계산하는 데 관심이 있습니다. 가우시안 창이있는 STFT에 불과합니다.
이것이 앞으로 STFT 에 대해 이해하는 것 입니다 .
- 서브 시퀀스는 시간 영역 요소들로 구성된 신호로부터 선택된다.
- 서브 시퀀스에는 시간 영역에서 포인트 단위 곱셈을 사용하는 윈도우 함수가 곱해집니다.
- 곱해진 서브 시퀀스는 FFT를 사용하여 주파수 영역으로 취해진 다.
- 연속적인 겹치는 하위 시퀀스를 선택하고 위의 절차를 반복하여 m 개의 행과 n 개의 열 이있는 행렬을 얻습니다 . 각 열은 주어진 시간에 계산 된 하위 순서입니다. 스펙트로 그램을 계산하는 데 사용할 수 있습니다.
그러나 역 STFT의 경우 논문은 중복 분석 섹션에 대한 요약에 대해 이야기합니다. 나는 여기서 실제로 일어나고있는 것을 시각화하는 것이 매우 어렵다는 것을 알게되었습니다. 역 STFT 를 계산하려면 (위와 같이 단계별로) 어떻게해야합니까?
앞으로 STFT
앞으로 STFT에 대해 어떻게 진행되고 있는지 보여주는 그림을 만들었습니다. 내가 이해하지 못하는 것은 원래의 시간 순서를 다시 얻을 수 있도록 각 하위 시퀀스를 조립하는 방법입니다. 누군가이 그림을 수정하거나 하위 시퀀스가 어떻게 추가되는지 보여주는 방정식을 줄 수 있습니까?
역변환
다음은 역변환에 대한 이해입니다. 각 연속 창은 IFFT를 사용하여 시간 도메인으로 다시 가져옵니다. 그런 다음 각 창은 단계 크기만큼 이동하고 이전 이동 결과에 추가됩니다. 다음 다이어그램은이 프로세스를 보여줍니다. 합산 된 출력은 시간 도메인 신호입니다.
코드 예
다음 Matlab 코드는 합성 시간 도메인 신호를 생성 한 다음 STFT 프로세스를 테스트하여 숫자 반올림 오차 내 에서 역이 순방향 변환 의 이중 임을 나타냅니다. 신호의 시작과 끝은 제로 패딩되어 창의 중심이 시간 영역 신호의 첫 번째 요소와 마지막 요소에 위치 할 수 있습니다.
Allen and Rabiner (1977)에 따르면 주파수 영역에서 주파수 응답을 변경하기 위해 곱셈이 발생하는 경우 분석 창의 길이는 포인트 보다 크거나 같아야합니다 . 여기서 은 필터 응답입니다 . 길이는 제로 패딩으로 연장됩니다. 테스트 코드는 단순히 역수가 순방향 변환의 이중임을 나타냅니다. 원형 컨벌루션을 방지하려면 길이를 연장해야합니다.N 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);