การตรวจจับระดับพิทช์แบบเรียลไทม์


11

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

ฉันได้เจอหัวข้อมากมายที่ถามคำถามเดียวกัน แต่ฉันก็ยังไม่ได้ทำเพราะอาจขาดประสบการณ์และความรู้พื้นฐานทางคณิตศาสตร์ ฉันใช้อัลกอริทึมตามบทความของ pitch shift ของเว็บไซต์ DSPDimension: http://www.dspdimension.com/admin/pitch-shifting-using-the-ft/

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

ขอบคุณล่วงหน้า,

แก้ไข: ฉันลืมที่จะพูดถึงว่าฉันเพียง แต่สนใจในระดับสนามดังนั้นมันก็โอเคถ้าพื้นฐานหายไป แต่ฉันมีเสียงที่ดังมากในตัวอย่าง

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


Wikipediaมีข้อมูลบางอย่าง
เอ็ม

คำตอบ:


9

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

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

http://www.phon.ucl.ac.uk/courses/spsci/matlab/lect10.html

คุณต้องการให้พวกเขาร้องเพลงจริง ๆ หรือไม่หรือว่ามันจะโอเคถ้าพวกเขาร้องเพลงคู่ด้านบนหรือด้านล่างขึ้นอยู่กับการลงทะเบียนเสียงของพวกเขา?


คุณพูดถูกฉันลืมที่จะพูดถึงว่าฉันสนใจในชั้นเรียนพิทช์เท่านั้น ฉันใช้เว็บไซต์นี้เพื่อทดสอบเครื่องมือของฉัน: seventhstring.com/tuningfork/tuningfork.html สำหรับอินพุต A (220Hz) จะส่งคืน E (660Hz) เป็นระดับพิชที่พบ ฉันดูที่ sprectum และ 220Hz นั้นอยู่ที่นั่น แต่มีขนาดน้อยกว่า 660Hz หลังจากกรองค่าต่ำกว่าขนาดต่ำสุดและความถี่สูงสุดในช่วงที่ฉันต้องการ sprectum ที่ฉันได้รับจากสิ่งนี้มี 4 จุด [peak, mag] = [220, 0.0203], [618, 0.0142], [660, 0.0668], [703, 0.0497]
เฟลิเป้ลิร่า

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

@elipedrl: ดังนั้นคุณต้องเขียนจูนเนอร์กีต้าร์เป็นหลัก :) ตามที่ฉันเข้าใจพวกมัน low-pass filter เพื่อทำความสะอาดรูปร่างคลื่นแล้วนับยอดเขาเพื่อให้ได้ระดับเสียง electronicdesign.com/article/articles/... aboutmicrocontroller.blogspot.com/2008/04/...มีวิธีที่ดีกว่า แต่ถ้าคุณกำลังจะไปเพื่อความถูกต้องมากกว่าความเลวgist.github.com/255291
endolith

@elipedrl: เฟสออฟเซ็ตสำหรับถังควรไม่เกี่ยวข้องกับระดับเสียง แต่ละ bin เป็นจำนวนเชิงซ้อนและคุณสนใจในค่าสัมบูรณ์หรือขนาดของจำนวนนั้น en.wikipedia.org/wiki/Absolute_value#Complex_numbers
endolith

1
และหากคุณมี FFT ที่สั้นกว่า 2 ประการด้วยเหตุผลบางอย่าง (ความหน่วงแฝงเวลาควอนตัม ฯลฯ ) การคำนวณค่ากระแสไฟฟ้าเฟสคือการคำนวณน้อยกว่าการทำ FFT อีกอันหนึ่ง
hotpaw2

6

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

นี่คือหนึ่ง: /programming/4227420/matlab-missing-fundamental-from-an-fft/4231322#4231322และอื่น ๆ : เคล็ดลับสำหรับการปรับปรุงการตรวจจับระดับเสียง

เพิ่ม # 1: คำถามที่คล้ายกันนี้ถูกถามบ่อยครั้งที่ฉันเขียนโพสต์บล็อกที่ยาวขึ้นในหัวข้อ: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft- frequency.html


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

@elipedrl: FFT ควรทำงานแล้ว รับหลาย ๆ จุดแล้วเลือกหนึ่งในนั้นอย่างชาญฉลาดควรจะดีพอ โปรดจำไว้ว่าจุดสูงสุดที่ถูกต้องจะใกล้เคียงกับจำนวนเต็ม (แต่ไม่แน่นอน) จำนวนเต็มพื้นฐานขณะที่ยอดปลอมจะไม่ คุณต้องหลีกเลี่ยงการเลือกยอดปลอมและหลีกเลี่ยงการเลือกฮาร์มอนิกลำดับที่ 3 ฯลฯ ซึ่งไม่ได้อยู่ห่างจากโน้ตที่คุณต้องการ
endolith

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

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