เคล็ดลับสำหรับการปรับปรุงการตรวจจับพิช


21

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

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

ปัญหาหลักของฉันคือเมื่อตรวจพบความถี่ที่แน่นอนมันจะแสดงความถี่นั้นเป็นเวลา 1-2 วินาทีแล้วกระโดดไปยังความถี่สุ่มอื่น ๆ และกลับมาอีกครั้งและต่อ ๆ ไปแม้ว่าเสียงจะดังต่อเนื่อง

ฉันยังสนใจในการเพิ่มประสิทธิภาพประเภทอื่น ๆ หากมีประสบการณ์กับสิ่งเหล่านี้

คำตอบ:


20

ฉันเดาว่าความถี่อื่น ๆ ที่ได้รับนั้นเป็นเสียงประสานของพื้นฐานหรือไม่ เช่นคุณกำลังเล่น 100 Hz และมันเลือก 200 Hz หรือ 300 Hz แทน? ก่อนอื่นคุณควร จำกัด พื้นที่การค้นหาของคุณให้อยู่ในระดับความถี่ที่น่าจะเป็นกีตาร์ ค้นหาพื้นฐานสูงสุดที่คุณน่าจะต้องการและ จำกัด

Autocorrelationจะทำงานได้ดีกว่า FFT ในการค้นหาพื้นฐานถ้าพื้นฐานมีความกว้างต่ำกว่าฮาร์โมนิกส์ (หรือขาดหายไปทั้งหมด แต่นั่นไม่ใช่ปัญหากับกีตาร์):

ป้อนคำอธิบายรูปภาพที่นี่

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

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

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

นี่คือตัวอย่างรหัสหลามของฉันทั้งหมดนี้


นี่คือสิ่งที่ฉันกำลังมองหาคำตอบที่ดีมากขอบคุณ!
Valentin Radu

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

@JasonR เนื่องจากความจริงที่ว่าสิ่งนี้ได้รับการออกแบบมาเพื่อทำงานในสภาพแวดล้อมที่มีความน่าจะเป็นของสัญญาณรบกวนกำลังสูงต่ำจริง ๆ คุณแนะนำว่าดีกว่าที่จะไม่ใช้หน้าต่างแฮมมิงหรือไม่?
Valentin Radu

1
ฉันสามารถยืนยันได้ว่าการใช้หน้าต่าง Hamming ทำให้ฉันใกล้ชิดกับเป้าหมายของฉันมากขึ้นในการอ่านให้นิ่ง ตอนนี้เมื่อฉันเล่น A4 ฉันจะได้รับ 440 Hz เป็นส่วนใหญ่และหายากมากฉันได้อ่านอย่างใกล้ชิดเช่น 650 Hz หรือมากกว่านั้น ฉันเดาว่ามันเป็นเสียงประสานใช่ไหม นอกจากนี้ฉันไม่สามารถสังเกตได้ว่าสำหรับความถี่ที่สูงขึ้นแอปจะทำงานได้อย่างไร้ที่ติและยิ่งต่ำลงก็เริ่มล้มเหลว อาจเป็นเพราะฉันใช้ FTT เพื่อตรวจจับ bin ความถี่สูงสุดและสำหรับความถี่ที่ต่ำกว่าซึ่งไม่ได้เป็นพื้นฐานเสมอไป
Valentin Radu

1
@mindnoise: 660 Hz ไม่ใช่ฮาร์โมนิกของ 440 Hz แต่มันเป็นฮาร์โมนิกที่ 220 เฮิร์ตหรือที่สมบูรณ์แบบที่สูงกว่า 440 กว่าอาจเป็นอีกหนึ่งสายที่มีการสะท้อนหรือบิดเบือนหรืออะไรทำนองนั้น? มันง่ายกว่ามากที่จะเข้าใจปัญหาเช่นนี้หากคุณสามารถวางแผน FFT และดูได้ ใช่ความถี่ต่ำอาจถูกกรองและลดลงเมื่อเทียบกับความถี่ที่สูงขึ้นไม่ว่าจะโดยผลกระทบทางกลหรือวงจรอนาล็อกของคุณ
endolith

12

Pitch ไม่เหมือนกับช่องเก็บความถี่สูงสุดของ FFT Pitch เป็นปรากฏการณ์ทางจิตของมนุษย์ เสียงพิทช์อาจมีพื้นฐานที่ขาดหายไปหรืออ่อนแอมาก (เสียงธรรมดาบางเสียงเปียโนและกีตาร์) และ / หรือเสียงหวือหวาที่ทรงพลังมากมายในสเปกตรัมที่ครอบงำความถี่เสียงพิทช์ (แต่ยังคงได้ยินเหมือนเสียงพิทช์ของมนุษย์) . ดังนั้นเครื่องตรวจจับความถี่สูงสุด FFT ใด ๆ (แม้จะรวมถึงหน้าต่างและการแก้ไขบางส่วน) จะไม่เป็นวิธีที่มีประสิทธิภาพในการประมาณระดับเสียง

คำถาม stackoverflowนี้มีรายการวิธีการทางเลือกในการประมาณระดับเสียงที่อาจให้ผลลัพธ์ที่ดีกว่า

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

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


เพิ่งเข้าชม (และแสดงความคิดเห็นใน) บล็อกที่คุณเพิ่งแนะนำให้เรา
robert bristow-johnson

5

ฉันใช้เวลาหลายปีทำการค้นคว้าการตรวจจับพิทช์เกี่ยวกับดนตรีโพลีโฟนิค - เหมือนกับการตรวจสอบบันทึกของกีต้าร์โซโลในการบันทึก mp3 ฉันยังเขียนหัวข้อใน Wikipedia ซึ่งให้คำอธิบายสั้น ๆ เกี่ยวกับกระบวนการ (ดูที่ส่วนย่อย "Pitch detection" ในลิงค์ด้านล่าง)

เมื่อกดปุ่มเดียวบนเปียโนสิ่งที่เราได้ยินไม่ใช่แค่การสั่นสะเทือนความถี่เดียว แต่เป็นการรวมกันของการสั่นสะเทือนเสียงหลายครั้งที่เกิดขึ้นในความถี่ที่เกี่ยวข้องกับคณิตศาสตร์ที่แตกต่างกัน องค์ประกอบของการสั่นสะเทือนประกอบกันที่ความถี่ที่ต่างกันนี้เรียกว่าฮาร์โมนิกหรือชิ้นงาน ตัวอย่างเช่นถ้าเรากดปุ่มกลาง C บนเปียโนความถี่ของเสียงประสานของแต่ละคอมโพสิตจะเริ่มต้นที่ 261.6 Hz เป็นความถี่พื้นฐาน 523 Hz จะเป็นฮาร์มอนิก 2, 785 Hz จะเป็นฮาร์มอนิกอันดับที่ 3, 1,046 Hz เป็นฮาร์มอนิกที่ 4 เป็นต้นฮาร์มอนิกต่อมาคือทวีคูณทวีคูณของความถี่พื้นฐาน 261.6 Hz (เช่น 2 x 261.6 = 523, 3 x 261.6 = 785, 4 x 261.6 = 1,046)

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

ตอนนี้ถูกเกษียณฉันได้ตัดสินใจที่จะปล่อยซอร์สโค้ดสำหรับเครื่องมือตรวจจับสนามของฉันภายในแอพพลิเคสาธิตฟรีที่เรียกว่าPitchScope เล่น PitchScope Player มีอยู่ในเว็บและคุณสามารถดาวน์โหลดไฟล์ปฏิบัติการสำหรับ Windows เพื่อดูอัลกอริทึมของฉันที่ทำงานบนไฟล์ mp3 ที่คุณเลือก ลิงค์ด้านล่างไปที่ GitHub.com จะนำคุณไปสู่ซอร์สโค้ดเต็มของฉันซึ่งคุณสามารถดูวิธีตรวจจับฮาร์โมนิกด้วยการแปลง DFT แบบลอการิทึมแบบกำหนดเองแล้วมองหาพาร์ติชัน (ฮาร์โมนิก) ที่ความถี่ตรงกับความสัมพันธ์ สนาม'

อัลกอริทึมการตรวจจับ Pitch ของฉันเป็นจริงสองขั้นตอน: ก) ขั้นแรกตรวจพบScalePitch ('ScalePitch' มีค่าระยะห่างที่เป็นไปได้ 12 ค่า: {E, F, F #, G, G #, A, A #, B, C, C #, D , D #}) b) และหลังจากกำหนด ScalePitch แล้วOctaveจะถูกคำนวณโดยการตรวจสอบฮาร์โมนิกทั้งหมดสำหรับโน้ต 4 คู่ที่เป็นไปได้ อัลกอริทึมถูกออกแบบมาเพื่อตรวจจับระยะห่างที่โดดเด่นที่สุด (โน้ตดนตรี) ในช่วงเวลาใดก็ตามในไฟล์ MP3 โพลีโฟนิก ที่มักจะสอดคล้องกับบันทึกของโซโล่บรรเลง ผู้ที่สนใจในซอร์สโค้ด C ++ สำหรับอัลกอริทึมการตรวจจับระยะห่าง 2 ระดับของฉันอาจต้องการเริ่มต้นที่ฟังก์ชัน Estimate_ScalePitch () ภายในไฟล์ SPitchCalc.cpp ที่ GitHub.com

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

ด้านล่างเป็นภาพของ Logarithmic DFT (สร้างโดยซอฟต์แวร์ C ++ ของฉัน) เป็นเวลา 3 วินาทีของกีตาร์โซโลในการบันทึกเสียง MP3 แบบโพลีโฟนิค มันแสดงให้เห็นว่าฮาร์มอนิกปรากฏอย่างไรสำหรับโน้ตแต่ละอันของกีตาร์ในขณะที่เล่นโซโล สำหรับโน้ตแต่ละอันเกี่ยวกับ DFT ลอการิทึมนี้เราสามารถเห็นฮาร์โมนิกหลายตัวที่ขยายในแนวตั้งเพราะแต่ละฮาร์มอนิกจะมีความกว้างเวลาเท่ากัน หลังจากกำหนดโน้ตคู่ของโน้ตแล้วเรารู้ความถี่ของพื้นฐาน

ป้อนคำอธิบายรูปภาพที่นี่

แผนภาพด้านล่างแสดงให้เห็นถึงอัลกอริทึมการตรวจจับคู่ซึ่งฉันพัฒนาขึ้นเพื่อเลือกบันทึกคู่ที่ถูกต้อง (นั่นคือพื้นฐานที่ถูกต้อง) เมื่อมีการกำหนด ScalePitch สำหรับบันทึกย่อนั้น ผู้ที่ต้องการเห็นวิธีการใน C ++ ควรไปที่ฟังก์ชัน Calc_Best_Octave_Candidate () ภายในไฟล์ชื่อ FundCandidCalcer.cpp ซึ่งมีอยู่ในซอร์สโค้ดของฉันที่ GitHub

ป้อนคำอธิบายรูปภาพที่นี่


James เครื่องตรวจจับพิชท์ DFT ของคุณตรวจจับโน้ตที่มีพื้นฐาน (หรืออ่อน) ขาดหายไปหรือไม่?
robert bristow-johnson

ใช่อัลกอริทึมการตรวจจับระยะห่าง 2 ขั้นตอนของฉันจะตรวจจับบันทึกแม้ว่าสัญญาณจะมีพื้นฐาน "ขาดหายไป (หรืออ่อนแอ)" - ซึ่งเป็นจุดแข็งของกระบวนการสเตจ 2 ขั้นนี้ พื้นฐานจะถูกกำหนดในขั้นตอนที่สองเมื่อทำการตรวจจับคู่ในเวลาที่มีความกว้างที่คุณเห็นสำหรับบันทึกในแผนภาพ DFT ลอการิทึม เนื่องจากฟังก์ชั่นตรวจจับระดับเสียงนี้ทำงานได้ภายในความสับสนของสัญญาณโพลีโฟนิก mp3 มันจะตรวจจับโน้ตที่ขาดฮาร์โมนิคจำนวนมากรวมถึงพื้นฐาน ฉันเพิ่งเพิ่มไปยังคำตอบนี้ไดอะแกรมที่สองซึ่งอธิบายอัลกอริทึมการตรวจจับคู่ของฉัน
James Paul Millard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.