ฉันสามารถใช้ FFT เพื่อรับรู้โน้ตดนตรีบนเปียโนได้หรือไม่?


13

ฉันต้องการสร้างเครื่องมือที่รู้จักโน้ตดนตรีสองสามอัน (ฉันรู้ว่านี่เป็นการประดิษฐ์วงล้อใหม่) ดังนั้นฉันจะเล่นตรงกลาง C, D และ E บนเปียโนและมันควรจะสามารถจำแนกโน้ตเหล่านั้นได้ นี่คือวิธีที่ฉันคิดว่าฉันควรเข้าใกล้:

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

ฉันยังไม่ได้ลองสิ่งนี้เพราะฉันไม่ต้องการเริ่มต้นเส้นทางที่ผิด ในทางทฤษฎีแล้วจะใช้งานได้ไหม


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

1
@pipe ok ฉันเปลี่ยนมัน
michaelsnowden

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

@ user2943160 ฉันได้เพิ่มมันเพื่อความชัดเจน เสียงสามารถจัดเก็บได้ในหลายรูปแบบและโดยทั่วไปจะใช้เวลาในการจัดการเสียงเพื่อให้ได้แอมพลิจูดที่ดีตลอดเวลา
michaelsnowden

@michaelsnowden: คุณกำลังใช้คำว่า "กว้าง" ผิด: ความกว้างของฟังก์ชั่นไซน์ เป็น มันเป็นสัญญาณสูงสุด (แรงดัน, การกระจัด, ... ) และมันเป็นค่าคงที่ (หรือเปลี่ยนแปลงอย่างช้าๆตามความถี่) สิ่งที่คุณหมายเป็นเพียงสัญญาณ(t) มิฉะนั้นฉันจะคิดว่า "แอมพลิจูดเมื่อเวลาผ่านไป" คุณหมายถึงซองจดหมายของสัญญาณ แต่เท่าที่ฉันเข้าใจคุณไม่ได้ A y ( t )y(t)=Asin(ωt)Ay(t)
นมเปรี้ยว

คำตอบ:


23

แนวคิดนี้ดี แต่คุณจะพบว่ามันไม่ง่ายนักในการฝึกฝน

Pitch ไม่ใช่แค่น้ำเสียงที่โดดเด่นดังนั้นจึงมีปัญหาหมายเลข 1

ถังขยะความถี่ FFT ไม่สามารถกดโทนเสียงดนตรีทั้งหมด (หรือหลายครั้ง) ได้พร้อมกัน

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

หากคุณต้องการตรวจสอบเสียงเฉพาะบางอย่างคุณอาจพบว่าอัลกอริทึมของ Goertzelนั้นง่ายขึ้นและเร็วขึ้น

การตรวจจับระดับเสียงนั้นซับซ้อนและยังมีงานวิจัยที่ดำเนินการในสาขานั้น การตรวจจับเสียงค่อนข้างตรงไปตรงมา แต่อาจไม่ได้สิ่งที่คุณต้องการ


ถ้าเราเริ่มด้วยสมมติฐานว่าตัวอย่างเป็นเครื่องมือเฉพาะปัญหาอาจจะง่ายขึ้นนิดหน่อยใช่ไหม?
mkeith

มันดูดีจริงๆ หนึ่งคำถามติดตามคือ: สามารถใช้อัลกอริทึม Goertzel ในการตรวจสอบสองโน้ตที่กำลังเล่นพร้อมกันหรือไม่?
michaelsnowden

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

2
@mkeith: เรียงจาก คุณสามารถทดสอบบันทึกย่อและดูว่าการตรวจสอบเสียงเด่นนั้นเพียงพอสำหรับเครื่องมือเฉพาะหรือไม่ (และอาจเป็นเพียงบันทึกย่อที่น่าสนใจ) เท่าที่ฉันรู้ถึงแม้ว่าจะไม่มีวิธีแก้ไขปัญหาทั่วไปสำหรับการตรวจสอบบันทึกทั้งหมดจากเครื่องมือทั้งหมด
JRE

3

ฉันจะบอกว่าใช้หน้าต่างการสังเกตแบบหลายค่าของสัญญาณจะดีกว่า บางสิ่งที่เรียงตามแนวของการสลายตัวของเวฟเล็ตสัญญาณเสียงของคุณซึ่งจะช่วยให้คุณระบุ overtones หลายภายในโน้ต ใช่จริงเวฟเล็ตฉันจะบอกว่าเป็นวิธีที่จะไป

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

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

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

หากคุณต้องการที่จะเรียนรู้วิธีการทำงานของเวฟเล็ตนี้เป็นเอกสารทางเทคนิคที่ยอดเยี่ยมที่ HP เปิดเผยเกี่ยวกับเรื่องนี้ :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdfและ Introduction to Wavelets

สำหรับการติดตั้ง MATLAB มีเครื่องมือเวฟเล็ตและฉันมั่นใจว่ามีแพ็คเกจอื่น ๆ มากมายสำหรับแพลตฟอร์มเช่น R เป็นต้น


1

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

สำหรับโน้ตที่ปลายล่างของช่วงโน้ตคุณจะพบว่าพลังงานเสียงน้อยมาก (น้อยกว่า 1%) นั้นอยู่ในระดับเสียงพื้นฐานของโน้ต

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

คุณอาจตรวจสอบวิธีการแปลงฟูริเยร์ระยะสั้นได้ดีกว่าเช่นการแปลง Gabor หรือวิธีที่ใช้เวฟเล็ต

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


0

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

เปลี่ยนคำตอบทุกอย่างขึ้นอยู่กับสิ่งที่คุณต้องการ

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

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

ถ้าคุณต้องการสร้างอุปกรณ์เพื่อทำสิ่งนั้นมันค่อนข้างซับซ้อน คุณจะต้องใช้ uC / dsp / fpga / etc เพื่อทำการคำนวณ อุปกรณ์ยอดนิยมส่วนใหญ่มาพร้อมกับรหัส FFT แล้วดังนั้นคุณจะไม่ต้องใช้รหัสด้วยตัวเอง (เช่นซับซ้อน)

คุณจะต้องสร้างวงจรและสิ่งนั้น มันไม่ยาก แต่ขึ้นอยู่กับประสบการณ์ / ความรู้ของคุณมันอาจใช้เวลาพอสมควรและมีช่วงการเรียนรู้ที่สูงชัน นอกจากนี้ยังขึ้นอยู่กับคุณภาพของผลิตภัณฑ์ขั้นสุดท้าย

ศาสตร์โน้ตดนตรีในอุดมคติประกอบด้วยชุดเรขาคณิตของ "พื้นฐาน"

สมมติว่า F0 เป็นความถี่พื้นฐานแล้วโน้ตดนตรีส่วนใหญ่จะประมาณโดย F (t) + F0 * ผลรวม (a_k e ^ (2 ^ k F0 * pi i t)) = F0 + a_1 * F1 + a_2 * F2 + ...

a_k's เป็นเพียงจุดแข็งของความถี่ที่สูงกว่าเหล่านั้น F_k และ F_k เป็นเพียงค่าคูณของ F0 ถ้า a_k = 0 สำหรับ k ทั้งหมดดังนั้นเรามีไซน์ไซด์บริสุทธิ์ ระยะพิทช์นี้ง่ายต่อการตรวจจับ เพียงแค่หาค่าสูงสุดของ FFT และความถี่นั้นคือพื้นฐานของเสียง = โน้ตดนตรี

เมื่อคุณใช้ FFT คุณจะต้องจบด้วยข้อมูลนั้นและทำการคำนวณทางคณิตศาสตร์ มันเป็นแคลคูลัส

ทั้งหมดนั้นค่อนข้างง่าย

ปัญหาบางอย่างที่คุณจะต้องจัดการ โปรดทราบว่าไม่ใช่ทั้งหมดที่มี "แก้ไข"

  1. ความหน่วงแฝง - หากคุณกำลังทำสิ่งต่าง ๆ แบบเรียลไทม์สิ่งนี้อาจกลายเป็นปัญหาได้

  2. บันทึกหลายรายการ - เป็นการยากที่จะกำหนดกลุ่มของบันทึกเนื่องจากมีการประสานกันเป็นพิเศษทั้งหมด หากเล่น A = 440hz และ A '= 880hz เสียงประสานส่วนใหญ่จะทับซ้อนกัน คุณสามารถรับ A = 440hz ได้อย่างง่ายดาย แต่การได้รับ A '= 880hz นั้นยากขึ้น เมื่อคุณคิดถึงคอร์ดการวิ่งเร็วและอื่น ๆ มันอาจเป็นเรื่องยากมากที่จะรับข้อมูลทั้งหมดอย่างแม่นยำ (หมายเหตุ) ในขณะที่ทุกอย่างเป็นไปได้ทางคณิตศาสตร์ แต่ข้อมูลเองก็มีข้อผิดพลาดและความผิดปรกติและมีการกำหนดสมการไว้ในบางกรณี

  3. เสียงรบกวน - สัญญาณรบกวนในสัญญาณสามารถให้ผลลัพธ์ที่น่าเกรงขาม หากเสียงดนตรีเกิดขึ้นก็สามารถทำให้ผลลัพธ์ของคุณ ขั้นตอนวิธีที่ดีกว่านั้นจะต้อง = เวลา + เงิน + ความรู้

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