มีอัลกอริทึมสำหรับค้นหาความถี่ที่ไม่มี DFT หรือ FFT หรือไม่


34

ฉันกำลังค้นหาแอพสโตร์ Android สำหรับนักกีต้าร์ ฉันพบแอปเครื่องรับที่อ้างว่าเร็วกว่าแอปอื่น ๆ มันอ้างว่าสามารถหาความถี่ได้โดยไม่ต้องใช้ DFT (ฉันหวังว่าฉันจะยังมี URL ตามข้อกำหนดนี้)

ฉันไม่เคยได้ยินเรื่องนี้ คุณสามารถรับสัญญาณเสียงและคำนวณความถี่โดยไม่ใช้อัลกอริทึม DFT หรือ FFT ได้หรือไม่?

คำตอบ:


29

FFT ไม่ใช่วิธีที่ดีในการสร้างจูนเนอร์ FFT มีความละเอียด จำกัด แน่นอนโดยเนื้อแท้และไม่ใช่เรื่องง่ายที่จะตรวจพบการเปลี่ยนแปลงความถี่ที่น้อยมากโดยไม่ต้องตั้งเวลาให้นานมากซึ่งทำให้ไม่สะดวกและไม่ราบรื่น

การแก้ปัญหาที่ดีกว่าจะขึ้นอยู่กับลูปเฟสล็อก , ลูปล่าช้าล็อคความสัมพันธ์อัตโนมัติ, การตรวจสอบศูนย์ข้ามและการติดตามตรวจสอบสูงสุดหรือต่ำสุดและการติดตามและการรวมกันที่ชาญฉลาดอย่างแน่นอนวิธีการเหล่านี้

การประมวลผลล่วงหน้าจะช่วยเสมอ


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

ใครสามารถช่วยฉันด้วย: - stackoverflow.com/questions/42359344/…
dreamBegin

12

FFT รายงานความถี่สูงสุดของคลื่นความถี่หรือจุดสูงสุด (วัดจากขนาดถังขยะ FFT) ซึ่งแตกต่างจากระดับเสียงดนตรี เป็นไปได้ที่ความถี่พิตช์ที่รับรู้จะหายไปอย่างสมบูรณ์จากสเปกตรัม FFT

จูนเนอร์กีต้าร์ที่ง่ายที่สุดบางตัวใช้การกรองแบบ low-pass หรือ band-pass และวัดเวลาระหว่างการข้ามศูนย์ ซึ่งกันและกันให้ประมาณการความถี่

Autocorrelation เป็นอีกวิธีการประมาณพิทช์ทั่วไป และความสัมพันธ์แบบเลื่อนหรือมาตรการอื่น ๆ ที่คล้ายคลึงกันในตัวเองมีรูปแบบมากมายเช่นการเลื่อน ASDF (ความแตกต่างยกกำลังสอง), AMDF (ความแตกต่างเฉลี่ย), การจับคู่รูปแบบที่ไม่ใช่เชิงเส้น, การตรวจสอบแบบปรับตัวสำหรับช่วง จำกัด เท่านั้น การเลือกหน้าต่างแบบปรับได้, น้ำหนักต่าง ๆ หรือใช้ทฤษฎีการตัดสินใจเพื่อเลือกระหว่างลำดับเหตุการณ์ความล่าช้าที่อาจเกิดขึ้นและอื่น ๆ ปัญหาหนึ่งที่มีมาตรการความคล้ายคลึงกันในตนเองส่วนใหญ่คือการเลือกอ็อกเทฟที่เหมาะสมเนื่องจาก sub-octave อาจแสดงความคล้ายคลึงกันเกือบเดียวกัน

ความเป็นไปได้อื่น ๆ รวมถึงการใช้ PLL, demodulators พื้นที่สี่เหลี่ยมจัตุรัสที่กรอง, การแปลง Hilbert ที่กรองแล้วและอื่น ๆ

แต่โปรดทราบว่าวิธีการกรอง DSP และ demodulation บางวิธีนั้นเกือบจะเทียบเท่ากับการทำ 1-bin ของ DFT แบบหน้าต่างซึ่งอาจจะใช่หรือไม่พอดีกับคำตอบสำหรับคำถามของคุณ


8

การตรวจจับระดับเสียงสามารถทำได้หลายวิธีและหลากหลาย วิธีการหนึ่งที่จะทำคือการใช้อัต กระดาษนี้ให้ตัวอย่างของวิธีการใช้ Autocorrelation นั้นสามารถทำได้ง่าย ๆ โดยใช้ correlator ขนาด 1 บิต (ไม่สามารถหาเอกสารที่เหมาะสมได้ด้วยเหตุผลบางอย่าง) ดังนั้นในทางทฤษฎีสนามสามารถถูกตรวจพบเร็วกว่าด้วย FFT แต่ฉันสงสัยว่ามันจะมากขึ้นได้อย่างแม่นยำโดยไม่ต้องจริงๆฉลาดก่อนการประมวลผล


ฉันคิดว่าลิงก์นี้ใช้งานไม่ได้ ...
Spacey

ไม่ได้ผล ฉันเพิ่งตรวจสอบมัน
Phonon

7

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


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

สัญญาณในชีวิตจริงส่วนใหญ่ค่อนข้างไม่คงที่นั่นคือพวกเขาจะแตกต่างกันเล็กน้อยในแอมพลิจูดและความถี่ HHT นั้นมีความไวต่อการเปลี่ยนแปลงน้อยกว่าดังนั้นจึงสลายสัญญาณดังกล่าวในลักษณะที่เป็นธรรมชาติมากขึ้นซึ่งชิ้นส่วนต่าง ๆ มีความสัมพันธ์อย่างใกล้ชิดกับปรากฏการณ์ทางกายภาพ
Nordlöw

3

หากคุณรู้ว่าถังขยะความถี่ใดที่คุณกำลังมองหาใน DFT / FFT คุณสามารถใช้อัลกอริทึม Goertzel เพื่อรับค่าของถังขยะนั้นเท่านั้น

http://en.wikipedia.org/wiki/Goertzel_algorithm


1
แต่นั่นไม่ใช่สำหรับการค้นหาความถี่
endolith


2

คุณสามารถคำนวณความถี่ของสัญญาณโดยใช้ pseudo-spectrum ซึ่งดูที่ eigenvector ของ autocorrelation matrix โดยทั่วไปจะย่อยสัญญาณของคุณเป็นช่องสัญญาณเสียงและสัญญาณย่อย จากตรงนั้นคุณจะพบสเปกตรัมของมัน (คุณสามารถ จำกัด และให้ช่วงความถี่เพื่อตรวจสอบ) นอกจากนี้ยังเป็นเสียงที่ค่อนข้างภูมิคุ้มกัน แน่นอนว่านี่เป็นวิธีการแบบพารามิเตอร์ไม่ใช่แบบไม่มีพารามิเตอร์เช่น DFT


เห็นได้ชัดว่านี่ใช้ FFT หรือไม่ mathworks.com/help/toolbox/signal/ref/peig.html
endolith

1
@endolith คุณสามารถคำนวณได้โดยไม่ต้องมี FFT ใด ๆ ที่เกี่ยวข้อง จากเมทริกซ์สหสัมพันธ์คุณจะได้ eigenvector แล้วก็สเปซซับเสียง จากนั้นคุณสามารถสร้างเวกเตอร์ความถี่ของคุณเองเพื่อฉายต่อต้านดังนั้นจึงไม่มี FFT ที่ใช้
Spacey

1

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

แต่ถ้าคุณต้องการจินตนาการด้วยการประมวลผลสัญญาณลองใช้วิธี MUSIC:

http://en.wikipedia.org/wiki/Multiple_signal_classification

หวังว่ามันจะช่วย


0

มีวิธีการประมาณระยะพิทช์จำนวนมากโดยไม่ต้องใช้ DFT / FFT ซึ่งบางวิธีรวมถึงวิธี MUSIC แสดงอยู่ในบทความนี้: https://ieeexplore.ieee.org/abstract/document/6521410/ ผลการจำลองในเอกสารนี้ระบุ ว่าเมื่อความถี่พื้นฐานต่ำมากวิธี NLS ที่แน่นอนจะมีประสิทธิภาพเหนือกว่าที่อื่น ๆ ในรายการ

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