อัลกอริทึมการแปลงฟูริเยร์ในช่วงเวลาสั้น ๆ ที่อธิบายไว้ในคำพูด


20

ฉันพยายามเข้าใจแนวคิดว่าเกิดอะไรขึ้นเมื่อมีการใช้การแปลงฟูริเยร์ช่วงเวลาสั้น ๆ (STFT) ไปข้างหน้าและผกผันกับสัญญาณโดเมนเวลาแบบไม่ต่อเนื่อง ฉันได้พบกระดาษคลาสสิกโดย Allen และ Rabiner ( 1977 ) รวมถึงบทความ Wikipedia ( ลิงก์ ) ผมเชื่อว่ายังมีอีกบทความที่ดีที่จะพบได้ที่นี่

ฉันสนใจในการคำนวณการแปลง Gabor ซึ่งไม่มีอะไรมากไปกว่า STFT ด้วยหน้าต่างแบบเกาส์เซียน

นี่คือสิ่งที่ฉันเข้าใจเกี่ยวกับSTFT ไปข้างหน้า :

  1. ลำดับย่อยจะถูกเลือกจากสัญญาณซึ่งประกอบด้วยองค์ประกอบโดเมนเวลา
  2. ลำดับย่อยจะถูกคูณด้วยฟังก์ชันหน้าต่างโดยใช้การคูณแบบจุดต่อจุดในโดเมนเวลา
  3. ลำดับย่อยคูณจะถูกนำเข้าสู่โดเมนความถี่โดยใช้ FFT
  4. ด้วยการเลือกลำดับย่อยที่ทับซ้อนกันอย่างต่อเนื่องและทำซ้ำขั้นตอนข้างต้นเราจะได้เมทริกซ์ที่มีแถวmและคอลัมน์n แต่ละคอลัมน์เป็นลำดับย่อยที่คำนวณในเวลาที่กำหนด นี้สามารถใช้ในการคำนวณ spectrogram

อย่างไรก็ตามสำหรับผกผัน STFT เอกสารพูดคุยเกี่ยวกับผลรวมของส่วนการวิเคราะห์ที่ทับซ้อนกัน ฉันพบว่ามันท้าทายมากที่จะเห็นภาพว่าเกิดอะไรขึ้นที่นี่ ฉันต้องทำอย่างไรจึงจะสามารถคำนวณSTFT ผกผัน (เรียงลำดับตามขั้นตอนข้างต้น) ได้

ส่งต่อ STFT

ฉันได้สร้างภาพวาดที่แสดงสิ่งที่ฉันคิดว่าเกิดขึ้นสำหรับ STFT ไปข้างหน้า สิ่งที่ฉันไม่เข้าใจคือวิธีการรวบรวมแต่ละลำดับย่อยเพื่อที่ฉันจะได้กลับไปตามลำดับเวลาเดิม ใครสามารถแก้ไขภาพวาดนี้หรือให้สมการที่แสดงวิธีการย่อยลำดับจะถูกเพิ่ม?การแปลงไปข้างหน้า

การแปลงผกผัน

นี่คือสิ่งที่ฉันเข้าใจเกี่ยวกับการแปลงผกผัน แต่ละหน้าต่างที่ต่อเนื่องจะถูกนำกลับไปยังโดเมนเวลาโดยใช้ IFFT จากนั้นแต่ละหน้าต่างจะเลื่อนตามขนาดขั้นตอนและเพิ่มไปยังผลลัพธ์ของการเลื่อนครั้งก่อนหน้า แผนภาพต่อไปนี้แสดงกระบวนการนี้ เอาต์พุตรวมเป็นสัญญาณโดเมนเวลา

การแปลงผกผัน

ตัวอย่างรหัส

รหัส Matlab ต่อไปนี้สร้างสัญญาณโดเมนเวลาสังเคราะห์แล้วทดสอบกระบวนการ STFT แสดงให้เห็นว่าการผกผันเป็นคู่ของการแปลงไปข้างหน้าภายในข้อผิดพลาดการปัดเศษตัวเลข จุดเริ่มต้นและจุดสิ้นสุดของสัญญาณเป็นศูนย์เบาะเพื่อให้แน่ใจว่าจุดกึ่งกลางของหน้าต่างสามารถตั้งอยู่ที่องค์ประกอบแรกและสุดท้ายของสัญญาณโดเมนเวลา

ยังไม่มีข้อความ+ยังไม่มีข้อความ0-1ยังไม่มีข้อความ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
เป็นคำถามที่ดี - แต่คุณทำไดอะแกรมเหล่านี้ได้อย่างรวดเร็วได้อย่างไร ...
4997 Spacey

2
ฉันใช้ Adobe Illustrator สำหรับไดอะแกรมและ Mathtype สำหรับตัวอักษรกรีก
Nicholas Kinar

1
"ฉันสนใจที่จะคำนวณการแปลง Gabor ซึ่งไม่มีอะไรมากไปกว่า STFT ด้วยหน้าต่างแบบเกาส์เซียน" โปรดจำไว้ว่าการแปลง Gabor เป็นส่วนประกอบสำคัญอย่างต่อเนื่องและหน้าต่างแบบเกาส์เซียนขยายไปถึงอินฟินิตี้ การใช้งานทั่วไปของ STFT ใช้ชิ้นส่วนที่ซ้อนกันแบบแยกส่วนและต้องใช้หน้าต่างที่มีความยาว จำกัด
endolith

ขอบคุณสำหรับการชี้ให้เห็น endolith ฉันมักจะคิดอย่างไม่ต่อเนื่องเมื่อทำการประมวลผลสัญญาณ
นิโคลัสคินาร์

คำตอบ:


11

คู่การแปลง STFT สามารถกำหนดได้ด้วยพารามิเตอร์ที่แตกต่างกัน 4 รายการ:

  1. ขนาด FFT (N)
  2. ขนาดขั้นตอน (M)
  3. หน้าต่างการวิเคราะห์ (ขนาด N)
  4. หน้าต่างการสังเคราะห์ (ขนาด N)

กระบวนการดังต่อไปนี้:

  1. ตัวอย่าง Grab N (ขนาด fft) จากตำแหน่งอินพุตปัจจุบัน
  2. ใช้หน้าต่างการวิเคราะห์
  3. ทำ FFT
  4. ทำสิ่งที่คุณต้องการทำในโดเมนความถี่
  5. ผกผัน FFT
  6. ใช้หน้าต่างการสังเคราะห์
  7. เพิ่มไปยังเอาต์พุตที่ตำแหน่งเอาต์พุตปัจจุบัน
  8. เลื่อนตำแหน่งอินพุตและเอาต์พุตโดยตัวอย่าง M (ขนาดขั้นตอน)

อัลกอริธึมการเพิ่มที่ทับซ้อนกันเป็นตัวอย่างที่ดี ในกรณีนี้ขนาดขั้นตอนคือ N ขนาด FFT คือ 2 * N หน้าต่างการวิเคราะห์เป็นรูปสี่เหลี่ยมผืนผ้าที่มี N ตามด้วยศูนย์ N และหน้าต่างการสังเคราะห์เป็นเพียงทั้งหมด

มีตัวเลือกอื่น ๆ อีกมากมายสำหรับสิ่งนั้นและภายใต้เงื่อนไขบางประการการโอนไปข้างหน้า / ผกผันกำลังสร้างขึ้นใหม่อย่างสมบูรณ์ (เช่นคุณสามารถรับสัญญาณดั้งเดิมกลับมาได้)

จุดสำคัญที่นี่คือว่าแต่ละตัวอย่างผลลัพธ์มักจะได้รับการสนับสนุนเพิ่มเติมจาก FFT ผกผันมากกว่าหนึ่งรายการ เอาต์พุตจะต้องมีการสะสมในหลายเฟรม จำนวนเฟรมที่มีส่วนร่วมจะถูกกำหนดโดยขนาด FFT หารด้วยขนาดขั้นตอน (ปัดเศษขึ้นหากจำเป็น)


ขอบคุณมากสำหรับคำตอบที่ลึกซึ้งของคุณ ฉันเข้าใจวิธีการเหลื่อมกันเพิ่ม ฉันจะใช้อะไรกับหน้าต่างการสังเคราะห์ มีสมการไหม หากฉันรู้ว่าฟังก์ชั่นหน้าต่างการวิเคราะห์ (เช่นหน้าต่างเกาส์เซียน) ฉันจะคำนวณหน้าต่างการสังเคราะห์ได้อย่างไร ฉันเข้าใจว่ามีการใช้วิธีการทับซ้อนกันเพื่อเพิ่มความมั่นใจอย่างไร แต่ฉันไม่เข้าใจว่าวิธีนี้ใช้สำหรับ STFT อย่างไร หากขนาดขั้นตอนคือ step = 1 ฉันจะเพิ่มเฟรมเข้าด้วยกันได้อย่างไร มีสมการไหม
Nicholas Kinar

ถ้าฟังก์ชั่นการวิเคราะห์หน้าต่างอยู่ตรงกลางของแต่ละตัวอย่างด้วยขนาดขั้นตอน step = 1 ฉันจะทำ zero-pad ลำดับเริ่มต้นและจุดสิ้นสุดของลำดับโดเมนเวลาเพื่อให้กึ่งกลางของหน้าต่างอยู่ตรงกลางของแต่ละตัวอย่าง (รวมถึงตัวแรกและตัวสุดท้าย ตัวอย่างในลำดับโดเมนเวลา)
นิโคลัส Kinar

คุณสามารถเลือกขนาดขั้นตอนขนาด fft การวิเคราะห์และหน้าต่างสังเคราะห์ขึ้นอยู่กับความต้องการเฉพาะของแอปพลิเคชันของคุณ ตัวอย่างหนึ่งคือขนาดขั้นตอน N, ขนาด FFT 2 * N, การวิเคราะห์การแฮนค์, การสังเคราะห์ทั้งหมด คุณสามารถปรับเปลี่ยนเป็นการวิเคราะห์ sqrt (hanning) และ synthesis sqrt (hanning) ทั้งสองจะทำงาน ฉันจะพิจารณาสิ่งที่คุณทำในโดเมนความถี่และสิ่งประดิษฐ์ประเภทใดเช่นนามแฝงโดเมนเวลาที่คุณสร้างขึ้น
Hilmar

@Hilmar: ฉันต้องสามารถแก้ไขโดเมนความถี่กับสัญญาณแล้วใช้ IFFT เพื่อรับสัญญาณโดเมนเวลา ฉันต้องการลดขนาดชื่อแทนโดเมนให้เล็กสุด ฉันยังไม่เข้าใจวิธีนำแต่ละลำดับย่อยกลับเข้าไปในโดเมนเวลาแล้วเพิ่มเข้าด้วยกัน
Nicholas Kinar

ฉันเขียนรหัสทดสอบแล้วอัปเดตคำถามเดิมของฉัน
นิโคลัส Kinar

2

เจ็ดปีหลังจากคำถามนี้ถูกหยิบยกขึ้นเป็นครั้งแรกฉันพบกับความสับสนนี้คล้ายกับ @Nicholas Kinar ที่นี่ฉันต้องการให้บางอย่าง "ทางการ" และ "ถูกต้องไม่มั่นใจอย่างเต็มที่" ความคิดและคำอธิบายการรับรู้ส่วนบุคคล

ชื่อของข้อความต่อไปนี้มีการพูดเกินจริงเพื่อความเข้าใจที่ดีขึ้น

  1. กระบวนการส่งต่อของ STFT ไม่ได้หมายถึงการรักษาสัญญาณดั้งเดิมไว้
    • เมื่อใช้ STFT กับหน้าต่างที่ไม่ใช่เรื่องเล็ก (ไม่ใช่ทั้งหมด) สัญญาณอินพุตไปยัง FFT เป็นเวอร์ชันแฟรกเมนต์ / ส่วนที่บิดเบือนของส่วนสัญญาณดั้งเดิม
    • สิ่งนี้เป็นสิ่งที่ดีสำหรับการแยกคุณลักษณะซึ่งมีการกรองข้อมูลที่ไร้ประโยชน์ / ซ้ำซ้อน เช่นเดียวกับการตรวจสอบพยางค์ไม่จำเป็นต้องใช้ข้อมูลชั่วคราวทั้งหมดในการตรวจสอบเสียงบางอย่างในการพูด
    • จุดสูงสุดในหน้าต่างเวกเตอร์แสดงถึงตำแหน่งส่วนน้อยในสัญญาณเสียงซึ่งอัลกอริธึมควรให้ความสนใจ
  2. ดังนั้นผลดิบของ STFT แบบผกผันอาจเป็นสิ่งที่เราอาจไม่คาดคิด
    • ควรเป็นแฟรกเมนต์สัญญาณที่มีลักษณะเป็นหน้าต่างที่มีลักษณะคล้าย ifft ของ STFT
  3. ในการรับแฟรกเมนต์สัญญาณ un-windowed ดั้งเดิมสามารถใช้อินเวอร์ส - หน้าต่างกับเอาท์พุตดิบของ ifft
    • มันง่ายในการออกแบบฟังก์ชั่นการทำแผนที่ซึ่งสามารถยกเลิกผลกระทบหน้าต่าง hann / hamming
  4. หน้าต่างการสังเคราะห์จะเกี่ยวข้องกับการจัดการกับการกระจายตัวชั่วคราว
    • เนื่องจากชิ้นส่วนของสัญญาณ un-windowed ดั้งเดิมสามารถมองเห็นได้ตามที่ได้รับมาแล้วจึงสามารถใช้ "น้ำหนักการเปลี่ยนผ่าน" เพื่อแก้ไขส่วนที่เหลื่อมซ้อนกันได้
  5. หากคุณต้องการพิจารณาว่าคำพูดที่มีหน้าต่างน้อยอาจเคารพสัญญาณที่อ่อนแอ แต่ชื่นชอบสัญญาณที่ทรงพลังเหล่านั้นดังนั้นอาจมีวิธีการออกแบบหน้าต่างสังเคราะห์ที่สอดคล้องกัน
  6. นอกจากนี้อัลกอริทึมการสร้างหน้าต่างการสังเคราะห์ตรงไปข้างหน้าสามารถให้ได้โดยใช้หลักการต่อไปนี้:
    • น้ำหนักสูงกว่าตำแหน่งในหน้าต่างการสังเคราะห์ถ้าค่าหน้าต่างการวิเคราะห์สำหรับตำแหน่งนี้สูงขึ้นเมื่อเปรียบเทียบกับส่วนอื่น ๆ ที่ซ้อนทับตำแหน่งนี้
    • น้ำหนักลดตำแหน่งในหน้าต่างการสังเคราะห์ถ้าค่าหน้าต่างการวิเคราะห์สำหรับตำแหน่งนี้ต่ำและชิ้นส่วนที่ทับซ้อนกันอื่น ๆ ให้เกียรติตำแหน่งนี้มากขึ้นด้วยค่าหน้าต่างการวิเคราะห์ที่ใหญ่ขึ้น

1
นี่เป็นข้อความที่น่าสนใจที่สามารถช่วยกระตุ้นการคิด STFT ได้อย่างแน่นอน
Nicholas Kinar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.