ฉันยังใหม่กับหลักการคำนวณความถี่ในทันทีและเกิดคำถามมากมายขึ้นมา คุณพบพวกเขาทั้งหมดในรายการสัญลักษณ์แสดงหัวข้อท้ายข้อความนี้ ข้อความอาจยาวไปหน่อยขอโทษสำหรับเรื่องนั้น แต่ฉันพยายามแก้ปัญหาด้วยตัวเอง
ดังนั้นฉันสนใจความถี่ทันที ของสัญญาณมูลค่าที่แท้จริง . การคำนวณเสร็จสิ้นด้วยความช่วยเหลือของสัญญาณการวิเคราะห์ที่ไหน คือการเปลี่ยนแปลงของฮิลแบร์ต .
เพื่อคำนวณความถี่ทันทีจากสัญญาณวิเคราะห์ ฉันติดตามกระดาษ:
การคำนวณความถี่ทันทีและแบนด์วิดท์ทันทีโดย 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 จะถูกซูมเข้า สัญญาณมีขนาดเล็กมาก!
ความเป็นไปได้แรกที่จะได้รับจากสัญญาณวิเคราะห์ถึงความถี่ในทันทีคือ:
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 ดัชนีอื่น ๆ ทั้งหมดตรงกับวิธีเดียวกันกับตัวเลขในกระดาษ
เนื่องจากความคลุมเครือในระยะเขาค่อนข้างแนะนำ:
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
จากนั้นบาร์เนอร์ให้สูตรอีกสามสูตรซึ่งเขาตั้งชื่อว่า "การประมาณความถี่ทันที":
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
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
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 ก็นำสิ่งนั้นมาเป็นตัวอย่าง ความถี่ทันใดนั้นน่าสนใจในหลายพื้นที่หรือไม่?
ขอบคุณมากสำหรับการตอบกลับทุกครั้งโดยเฉพาะอย่างยิ่งเมื่อมีคนให้คำแนะนำในการใช้งานใน โครงการซอฟต์แวร์จริง )
ขอแสดงความนับถือแพทริค