ตามที่เราได้พูดคุยในความคิดเห็นอัลกอริทึม Goertzelเป็นวิธีปกติในการตรวจสอบเสียงในเสียง หลังจากการสนทนาฉันไม่แน่ใจว่ามันเป็นสิ่งที่คุณเป็น (หลังจากที่คุณต้องการเวลาโจมตี ) แต่ดูเหมือนจะมีความสับสนว่าอัลกอริทึม Goertzel อาจนำไปใช้กับปัญหาของคุณได้อย่างไรฉันจึงคิดว่าฉันจะเขียนมันขึ้น ที่นี่
อัลกอริทึม Goertzel
อัลกอริทึม Goertzel นั้นใช้งานได้ดีหากคุณทราบความถี่ของเสียงที่คุณกำลังมองหา (เรียกมันว่า ฉก.) และหากคุณมีความคิดที่สมเหตุสมผลเกี่ยวกับระดับเสียงรบกวนเพื่อให้คุณสามารถเลือกเกณฑ์การตรวจจับที่เหมาะสม
อัลกอริทึมของ Goertzel นั้นสามารถนำมาคำนวณการส่งออกของถังขยะหนึ่งช่อง FFT ได้เสมอ:
Y( n ) = eȷ 2 πฉก.nΣk = 0nx ( n ) e- ȷ 2 πฉก.k
ที่ไหน ฉก. เป็นความถี่ที่คุณกำลังมองหา
หน้า Wikipediaมีวิธีที่ดีกว่าในการคำนวณ
นี่คือScilab (อ่อนแอ) ที่พยายามนำมาใช้
function [y,resultr,resulti] = goertzel(f_goertzel,x)
realW = 2.0*cos(2.0*%pi*f_goertzel);
imagW = sin(2.0*%pi*f_goertzel);
d1 = 0;
d2 = 0;
for n = 0:length(x)-1,
y(n+1) = x(n+1) + realW*d1 - d2;
d2 = d1;
d1 = y(n+1);
resultr(n+1) = 0.5*realW*d1 - d2;
resulti(n+1) = imagW*d1;
end
endfunction
พิจารณาสัญญาณด้วย ฉ= 0.0239074 และ ϕ = 4.4318752 :
x = บาป( 2 πฉn + ϕ ) + ϵ ( n )
ที่ไหน ϵ ( n ) เป็นค่าเฉลี่ยศูนย์ความแปรปรวนของหน่วยเกาส์เสียงสีขาว
ในตัวอย่างนี้เสียงจะเริ่มหนึ่งในสามของวิธีเข้าสู่สัญญาณที่ดัชนี 1001
ถ้าเราเรียกใช้อัลกอริทึมของ Goertzel กับมัน ฉก.= f- 0.001 จากนั้นเราจะได้ตัวเลขสองอันดับแรก
ถ้าเราเรียกใช้อัลกอริทึมของ Goertzel กับมัน ฉก.= f จากนั้นเราจะได้ตัวเลขสองอัน
ร่องรอยทั้งสี่คือ:
- x (สีน้ำเงิน) และ Y (สีแดง) สำหรับ ฉก.= 0.0229074
- ผลลัพท์ที่ได้ r e s u l t r2+ r e s u l t i2---------------√
- x (สีน้ำเงิน) และ Y (สีแดง) สำหรับ ฉก.= 0.0239074
- ผลลัพท์ที่ได้ r e s u l t r2+ r e s u l t i2---------------√ (เส้นทึบ) และผลลัพธ์แรก (เส้นประ)
อย่างที่คุณเห็นในกรณีที่น้ำเสียงที่เราสนใจนั้นอยู่ในจุดสูงสุดที่ประมาณ 250 ถ้าเราตั้งค่าเกณฑ์การตรวจจับที่ประมาณครึ่งหนึ่งของค่านี้ (125) จากนั้นการตรวจจับจะเกิดขึ้น ) ที่ประมาณ 1450 --- 450 ตัวอย่างหลังจากน้ำเสียงเริ่มขึ้น
ขีด จำกัด นี้ (125) จะไม่ทำให้เกิดการตรวจจับในกรณีอื่น (สำหรับการรันนี้อย่างไรก็ตาม) แต่ค่าสูงสุดของเอาต์พุตนั้นคือ 115.24 เราไม่สามารถลดเกณฑ์มากเกินไปโดยไม่ได้รับการตรวจจับที่ผิดพลาด
การลดเกณฑ์ถึง 116 จะทำให้เกิดการตรวจจับในกรณีจริง (สำหรับการดำเนินการนี้) ที่ดัชนี 1401 ... แต่เราเสี่ยงต่อการเตือนที่ผิดพลาดมากขึ้น