คำนวณและตีความความถี่ทันที


9

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

ดังนั้นฉันสนใจความถี่ทันที (เสื้อ) ของสัญญาณมูลค่าที่แท้จริง x(เสื้อ). การคำนวณเสร็จสิ้นด้วยความช่วยเหลือของสัญญาณการวิเคราะห์Z(เสื้อ)=x(เสื้อ)+JY(เสื้อ)ที่ไหน Y(เสื้อ) คือการเปลี่ยนแปลงของฮิลแบร์ต x(เสื้อ).

เพื่อคำนวณความถี่ทันทีจากสัญญาณวิเคราะห์ Z(เสื้อ) ฉันติดตามกระดาษ:

การคำนวณความถี่ทันทีและแบนด์วิดท์ทันทีโดย Arthur E. Barns จากปี 1992 ในบทความนี้เขาแนะนำวิธีการหลายวิธีในการคำนวณความถี่ทันที ฉันจดสูตรทั้งหมดที่เขาเสนอ (และฉันใช้) ในเวลาไม่นาน

สำหรับ "การเรียนรู้" ฉันเล่นกับสัญญาณที่เรียบง่ายและสัญญาณที่ซับซ้อนกว่าสองเล็กน้อยใน MATLAB และต้องการรับความถี่ทันที

Fs = 1000;                                            % sampling-rate = 1kHz
t = 0:1/Fs:10-1/Fs;                                    % 10s 'Timevector'
chirp_signal = chirp(t,0,1,2);                         % 10s long chirp-signal, signal 1
added_sinusoid = chirp_signal + sin(2*pi*t*10);        % chirp + sin(10Hz), signal 2
modulated_sinusoid = chirp_signal .* sin(2*pi*t*10);   % chirp * sin(10Hz), signal 3

พล็อตในโดเมนเวลาของสัญญาณทั้งสามมีลักษณะดังต่อไปนี้: พล็อตโดเมนเวลา

พล็อตความถี่ทั้งหมดทันทีที่ฉันได้รับหลังจากใช้วิธีการทั้งหมดจากกระดาษมีดังต่อไปนี้:

ความถี่ของสัญญาณเจี๊ยบบริสุทธิ์ ความถี่ของสัญญาณเจี๊ยบบริสุทธิ์ ทันที : ความถี่ของสัญญาณเจี๊ยบกับไซนัสเพิ่มความถี่ทันทีของสัญญาณเจี๊ยบด้วยไซนัสเพิ่ม ทันที : ความถี่ของสัญญาณเจี๊ยบที่มอดูเลตแบบปรับได้:ความถี่ทันทีของสัญญาณเจี๊ยบแบบมอดูเลต โปรดสังเกตว่าในทั้งสามภาพแกน y ของพล็อต 3 และ 4 จะถูกซูมเข้า สัญญาณมีขนาดเล็กมาก!

ความเป็นไปได้แรกที่จะได้รับจากสัญญาณวิเคราะห์ถึงความถี่ในทันทีคือ:

2(เสื้อ)=12πddเสื้อθ(เสื้อ)
ที่ไหน θ(เสื้อ)เป็นเฟสทันที ฉันคิดว่านี่เป็นวิธีที่ใช้กันมากที่สุดในทุกวันนี้อย่างน้อยก็ในเว็บเพจของ MATLAB ที่คำนวณด้วยวิธีนี้ รหัสมีลักษณะดังต่อไปนี้:

function [instantaneous_frequency] = f2(analytic_signal,Fs)
    factor =  Fs/(2*pi);
    instantaneous_frequency = factor * diff(unwrap(angle(analytic_signal)));
    % Insert leading 0 in return-vector to maintain size
    instantaneous_frequency = [0 instantaneous_frequency];
end

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

ในกระดาษของเขาสูตรมีหมายเลขฉลาก (2) ดังนั้นฉันจึงให้ f (t) ดัชนี 2 ดัชนีอื่น ๆ ทั้งหมดตรงกับวิธีเดียวกันกับตัวเลขในกระดาษ

เนื่องจากความคลุมเครือในระยะเขาค่อนข้างแนะนำ:

3(เสื้อ)=12πx(เสื้อ)Y'(เสื้อ)a-x'(เสื้อ)Y(เสื้อ)x(เสื้อ)2+Y(เสื้อ)2d
ฉันแนะนำสัญลักษณ์ "a", "b", "c" และ "d" เพื่อทำให้การเขียนโปรแกรมง่ายขึ้นเล็กน้อย:

function [instantaneous_frequency] = f3(analytic_signal,Fs,T)
    x = real(analytic_signal);
    y = imag(analytic_signal);
    diff_x = diff(x);
    diff_y = diff(y);
    factor = Fs/(2*pi);
    a = x(2:end).*diff_y;
    b = y(2:end).*diff_x;
    c = x(2:end).^2;
    d = y(2:end).^2;
    instantaneous_frequency = factor * ((a-b)./(c+d));
    % Insert leading 0 in return-vector to maintain size
    instantaneous_frequency = [0 instantaneous_frequency];
end

จากนั้นบาร์เนอร์ให้สูตรอีกสามสูตรซึ่งเขาตั้งชื่อว่า "การประมาณความถี่ทันที":

9(เสื้อ)=12πTarctan[x(เสื้อ)Y(เสื้อ+T)a-x(เสื้อ+T)Y(เสื้อ)x(เสื้อ)x(เสื้อ+T)+Y(เสื้อ)Y(เสื้อ+T)d]

function[instantaneous_frequency] = f9(analytic_signal, Fs, T)
    x = real(analytic_signal);
    y = imag(analytic_signal);
    factor = Fs/(2*pi*T);
    a = x(1:end-T).*y(1+T:end);
    b = x(1+T:end).*y(1:end-T);
    c = x(1:end-T).*x(1+T:end);
    d = y(1:end-T).*y(1+T:end);
    instantaneous_frequency = factor.*atan((a-b)./(c+d));
    % Append 0 to return-vector to maintain size
    instantaneous_frequency = [instantaneous_frequency zeros(1,T)];
end

11(เสื้อ)=14πTarctan[x(เสื้อ-T)Y(เสื้อ+T)a-x(เสื้อ+T)Y(เสื้อ-T)x(เสื้อ-T)x(เสื้อ+T)+Y(เสื้อ-T)Y(เสื้อ+T)d]

function [instantaneous_frequency] = f11(analytic_signal, Fs, T)
    x = real(analytic_signal);
    y = imag(analytic_signal);
    factor = Fs/(4*pi*T);
    a = x(1:end-2*T).*y(1+2*T:end);
    b = x(1+2*T:end).*y(1:end-2*T);
    c = x(1:end-2*T).*x(1+2*T:end);
    d = y(1:end-2*T).*y(1+2*T:end);
    instantaneous_frequency = factor.*atan((a-b)./(c+d));
    % Append and insert 0s to maintain size
    instantaneous_frequency = [zeros(1,T) instantaneous_frequency zeros(1,T)];
end

14(เสื้อ)=2πT[x(เสื้อ)Y(เสื้อ+T)a-x(เสื้อ+T)Y(เสื้อ)(x(เสื้อ)+x(เสื้อ+T))2+(Y(เสื้อ)+Y(เสื้อ+T))2d]

function [instantaneous_frequency] = formula14(analytic_signal, Fs, T);
    x = real(analytic_signal);
    y = imag(analytic_signal);
    factor = 2*Fs/(pi*T);
    a = x(1:end-T).*y(1+T:end);
    b = x(1+T:end).*y(1:end-T);
    c = (x(1:end-T)+x(1+T:end)).^2;
    d = (y(1:end-T)+y(1+T:end)).^2;
    instantaneous_frequency = factor * ((a-b)./(c+d));
    % Append and insert 0s to maintain size
    instantaneous_frequency = [instantaneous_frequency zeros(1,T)];
end

ในสูตรการประมาณทั้ง 3 สูตร T ถูกตั้งค่าเป็น Fs (T = Fs = 1000 = 1s) ตามที่แนะนำในกระดาษ

ตอนนี้คำถามของฉันคือ:

  • สูตร f2 และ f3 ส่งคืนผลลัพธ์เดียวกันสำหรับสัญญาณ chirp แท้ ฉันคิดว่ามันดีเพราะมันคำนวณเหมือนกัน วิธีการประมาณค่าทั้งสามไม่กลับมาเหมือนเดิมไม่ใช่สิ่งที่ใกล้เคียงกัน! ทำไมเป็นเช่นนั้น (ฉันหวังว่ามันจะไม่ใช่แค่ข้อผิดพลาดในการเขียนโปรแกรม ... )
  • แม้ว่าพวกเขาจะกลับมาเหมือนกันโดยเฉพาะอย่างยิ่งในตอนท้ายของพล็อตที่พวกเขาเริ่มที่จะ 'เลื้อย' มาก คำอธิบายสำหรับสิ่งนั้นคืออะไร? ฉันนึกถึงสิ่งอื่นเช่นนามแฝง แต่ความถี่การสุ่มตัวอย่างของฉันค่อนข้างสูงเมื่อเทียบกับความถี่ของสัญญาณดังนั้นฉันคิดว่าสามารถแยกออกได้
  • อย่างน้อย f2 และ f3 ดูเหมือนจะทำงานได้อย่างเหมาะสมบนสัญญาณเสียงร้องล้วน แต่วิธีการทั้งหมดรวมถึง f2 และ f3 ดูเหมือนจะล้มเหลวอย่างน่ากลัวเมื่อมันมาถึงความถี่มากกว่าหนึ่งสัญญาณ ในความเป็นจริงการมีความถี่มากกว่าหนึ่งสัญญาณนั้นค่อนข้างเป็นไปได้เสมอ ดังนั้นหนึ่งจะได้รับความถี่ทันที (มากหรือน้อย) ที่ถูกต้อง?

    • ฉันไม่รู้ด้วยซ้ำว่าจะเกิดอะไรขึ้นเมื่อมีสัญญาณมากกว่าหนึ่งความถี่ในสัญญาณ การคำนวณจะคืนค่าตัวเลขหนึ่งสำหรับเวลาที่กำหนดดังนั้นมันควรทำอย่างไรเมื่อเช่นที่นี่มีความถี่มากขึ้น? คืนค่าเฉลี่ยของความถี่ทั้งหมดหรืออะไรแบบนั้น?
  • และคำถามที่สำคัญที่สุดของฉันก็คือวิธีนี้จัดการกับซอฟต์แวร์จริงและที่มีรายละเอียดได้อย่างไร สมมติว่าฉันต้องการทราบความถี่ทันทีของสัญญาณมอดูเลตที่ 1.75 วิและฉันเลือกวิธีการ f2 มากกว่าที่ฉันจะ 'โชคดี' และได้ตัวเลขที่ใกล้เคียงกับ 6 [Hz] ซึ่งน่าจะเป็นคำตอบที่ถูกต้องที่สุดหรือ เลือกตัวอย่างผลลัพธ์ของฉันสองสามชิ้นถัดจากนั้นและทันใดนั้นฉันก็ได้รับสายวิธีไปสูงผลลัพธ์เนื่องจากฉันโชคไม่ดีที่เลือกค่าในสไปค์ สิ่งนี้สามารถจัดการได้อย่างไร โดยการประมวลผลภายหลังด้วยตัวกรองเฉลี่ยหรือดีกว่า? ฉันคิดว่าแม้มันอาจจะยากโดยเฉพาะอย่างยิ่งในภูมิภาคที่มีหนามแหลมจำนวนมากอยู่ติดกัน

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

ขอบคุณมากสำหรับการตอบกลับทุกครั้งโดยเฉพาะอย่างยิ่งเมื่อมีคนให้คำแนะนำในการใช้งานใน โครงการซอฟต์แวร์จริง )

ขอแสดงความนับถือแพทริค

คำตอบ:


4

ไม่ใช่คำตอบจริงๆ แต่อาจมีประโยชน์: โดยส่วนตัวแล้วฉันพบว่าแนวคิดของความถี่ในทันทีนั้นมีประโยชน์สำหรับสัญญาณย่านความถี่ที่แคบเท่านั้น

ลองพิจารณาตัวอย่างง่ายๆของคลื่นไซน์สองตัวที่มีความเสถียรเช่น 100Hz และ 934Hz ในกรณีนี้คุณสามารถกำหนดและคำนวณความถี่ในทันที (ในแบบที่คุณต้องการ) แต่ผลลัพธ์ควรเป็นอย่างไร ความถี่ที่ฉับพลันที่เป็นไปได้มีความเข้าใจอย่างถ่องแท้ว่ามีอะไรบ้างที่มีความหมายเกี่ยวกับสัญญาณ การนำแนวคิดความถี่ทันทีไปใช้กับสัญญาณที่มีความถี่หลายความถี่ในเวลาเดียวกันก็ไม่สมเหตุสมผลนัก

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


ขอบคุณสำหรับคำใบ้จนถึงตอนนี้และฉันคิดว่าความคิดเห็นนี้เป็นประเด็นที่ดี แต่แล้วฉันก็สงสัยว่าทำไมการคำนวณเฟสทันทีของ "สัญญาณเสียงร้องเพียวล้วน" จึงมีปัญหาเมื่ออยู่เหนือ 20Hz ยังคงมีเพียงหนึ่งความถี่ที่ต้องพิจารณานำเสนอ
muuh

// แนวคิดของความถี่ในทันทีมีประโยชน์สำหรับสัญญาณย่านความถี่ที่แคบเพียงพอ // ------ ใช่เช่นเดียวกับ AM'd และ FM จะเป็นไซนัส
เบิร์ตบริสโตจอห์นสัน

4

อย่างน้อย f2 และ f3 ดูเหมือนจะทำงานได้อย่างเหมาะสมบนสัญญาณเสียงร้องล้วน แต่วิธีการทั้งหมดรวมถึง f2 และ f3 ดูเหมือนจะล้มเหลวอย่างน่ากลัวเมื่อมันมาถึงความถี่มากกว่าหนึ่งสัญญาณ ในความเป็นจริงการมีความถี่มากกว่าหนึ่งสัญญาณนั้นค่อนข้างเป็นไปได้เสมอ ดังนั้นหนึ่งจะได้รับความถี่ทันที (มากหรือน้อย) ที่ถูกต้อง?

ตามที่ฮิลมาร์แนะนำวิธีการแปลงของฮิลแบร์ต (หรือ "สัญญาณวิเคราะห์") ไม่ทำงานบนวงกว้างเนื่องจากมีองค์ประกอบความถี่มากกว่าหนึ่ง คุณสามารถทำวิธีนี้ได้เท่านั้นสำหรับองค์ประกอบไซน์เดียว

ดังนั้นด้วยวิธีสัญญาณวิเคราะห์สัญญาณสิ่งที่คุณต้องการทำคือใช้ประโยชน์จากข้อมูลประจำตัวนี้:

arctanยู-arctanโวลต์=arctan(ยู-โวลต์1+ยูโวลต์)

ถ้า |ยู-โวลต์| เล็กพอที่คุณจะได้รับจาก Barner "9"สูตรจาก

แต่จะต้องมีไซน์อยด์ที่แปรผันเพียงครั้งเดียวในการคำนวณการแปลงของฮิลแบร์ตเพื่อให้ทำอย่างถูกต้อง และคุณควรจัดองค์ประกอบ "ในเฟส" กับเอาต์พุตของการแปลง Hilbert (ซึ่งล่าช้าด้วยตัวกรอง FIR เชิงสาเหตุ) มิฉะนั้นคุณจะได้รับอึ


1

ว้าวคำถามนี้ช่างใหญ่เหลือเกิน ฉันจะตอบคำถามที่ไม่สำคัญก่อน:

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

เหตุผลคือระบบคลื่นไหวสะเทือน"vibroseis"ถูกนำมาใช้ในอุตสาหกรรมน้ำมันในการสำรวจคลื่นไหวสะเทือน รถบรรทุกที่ฉันเชื่อมโยงเพื่อสั่นสะเทือนจากประมาณ 5 Hz ถึงประมาณ 90 Hz และสามารถทำเพื่อส่งเสียงร้องเจี๊ยก ๆ มีเงินมากในอุตสาหกรรมน้ำมันและการประมวลผลตอบแทนจากสัญญาณเหล่านี้อาจมีกำไรมาก ดังนั้นคนจำนวนมากใช้เวลาหลายชั่วโมงในการวิเคราะห์สัญญาณดังกล่าวรวมถึงการดูเทคนิคความถี่ทันที


สำหรับคำถามที่สำคัญของคุณ: โดยทั่วไปแล้วการคำนวณความแตกต่างทางคณิตศาสตร์และการคำนวณอาร์กแทนเจนต์ในสัญญาณไม่ต่อเนื่องเป็นสิ่งที่ไม่ดีTM. นี่เป็นเพราะการประมาณค่าความถี่ไม่ต่อเนื่องจำเป็นต้องคำนวณโดยใช้ "การคำนวณแบบวงกลม" (AKA vector arithmetic)

ลองดูบทความนี้

วิธีการที่ดีขึ้นมีแนวโน้มที่จะใช้ "เฟสถ่วงน้ำหนัก averagers" เป็นดำเนินการที่นี่ หรือที่นี่เพื่อเชื่อมโยงโดยตรงกับของ Matlab


1

ขออภัยที่ให้คำตอบหนึ่งปีหลังจากข้อเท็จจริง แต่ฉันพบบทความนี้ในขณะที่ค้นหาบทความในหัวข้อนี้มาก คำถามของคุณสะท้อนถึงความไม่เห็นด้วยอย่างกว้างขวางและการตีความของ "ความถี่ทันที" ที่ได้รบกวนสนามตั้งแต่เริ่มก่อตั้ง ผู้คนจำนวนมากจะบอกคุณตามคำตอบบางส่วนของที่นี่ว่า IF ใช้ได้กับสัญญาณ "narrowband" หรือ "โมโนคอมโพเนนต์" เท่านั้น ในความเป็นจริงนั้นไม่เป็นความจริง: บางครั้ง IF ที่ได้จากการแปลง Hilbert นั้นมีสัญญาณที่ดีสำหรับสัญญาณบรอดแบนด์และ / หรือ "องค์ประกอบหลายส่วน" ปริมาณหนึ่งที่ได้รับการเสนอเพื่อหลีกเลี่ยงปัญหาเหล่านี้คือ "ความถี่ถัวเฉลี่ยถ่วงน้ำหนักทันที (WAIF)" ซึ่งสามารถวัดได้โดยใช้ spectrogram

ดู Loughlin ใน J. Acoust Soc Am., 1999. เอกสารที่ดีอื่น ๆ เกี่ยวกับ IF และความเข้าใจผิดที่พบบ่อยคือ Picinbono (IEEE Trans. Sig. Proc., March 1997) และ Vakman (IEEE Trans. Sig. Proc., เมษายน 1996)

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