วิธีจัดการกับพื้นฐานขั้นต่ำเมื่อใช้ AMDF สำหรับการแยกพิทช์?


11

ฉันกำลังใช้ฟังก์ชั่นค่าความแตกต่างเฉลี่ยเพื่อประเมินความถี่พื้นฐานของสัญญาณเสียงแบบกึ่งระยะเวลา AMDF หมายถึง

Dn=1Nnk=nN1|SkSkn|

ที่ไหน Nคือความยาวของสัญญาณ ฟังก์ชั่นนี้แสดงขั้นต่ำเมื่อสัญญาณถูกเลื่อนด้วยจำนวนเท่ากับระยะเวลา

นี่คือรหัสที่ฉันใช้เพื่อแยก pitch (ใน Matlab):

 a = amdf(f);
 a = a/max(a);
 [p l] = findpeaks(-a, 'minpeakprominence', 0.6);
 pitch = round(sample_freq/l(1);

อย่างไรก็ตามฉันกำลังจัดการกับสัญญาณเสียงที่ความถี่พื้นฐานต่ำมาก:

สเปกตรัมของสัญญาณเสียง

เป็นผลให้เกิดปัญหาการเสแสร้งเกิดขึ้น: ขั้นต่ำที่ตรวจพบสอดคล้องกับครึ่งเวลาของสัญญาณ (เช่นฮาร์โมนิที่สอง):

AMDF ของสัญญาณด้านบน

ฉันพยายามที่จะสกัดจุดสูงสุดที่ใหญ่ที่สุดและไม่ใช่แค่ครั้งแรก แต่บางครั้งปัญหานี้ยังคงอยู่ ฉันจะปรับปรุงโค้ดและ / หรือฟังก์ชั่น AMDF เพื่อจัดการกับพื้นฐานขั้นต่ำได้อย่างไร


จิตวิทยา - อะคูสติกและการรับรู้ของมนุษย์มีอิทธิพลต่อการรับรู้ระดับความไม่แน่นอนและระดับแปดเสียง มันอาจต้องมีการทดลองเพื่อกำหนดภายใต้เงื่อนไขที่จุดสูงสุดของ AMDF ที่ใหญ่ที่สุดสร้างความแตกต่างในการได้ยิน
hotpaw2

ความถี่ของคุณต่ำแค่ไหน มีตัวอย่างให้ฉันฟังบ้างไหม?
ederwander

คำตอบ:


10

นี่คือสิ่งที่เราเรียกว่าในพิซเซจพิตช์การตรวจจับพิซซาว่า " ปัญหาระดับแปดเสียง "

ก่อนอื่นฉันจะเปลี่ยน AMDF เป็น ASDF และฉันจะไม่ลดขนาดหน้าต่างเมื่อความล่าช้าเพิ่มขึ้น (นอกจากนี้ฉันกำลังเปลี่ยนสัญกรณ์เป็นสิ่งที่ฉันคิดว่าเป็นแบบแผนมากขึ้น "x[n]"เป็นสัญญาณไม่ต่อเนื่อง)

ฟังก์ชันความแตกต่างกำลังสองเฉลี่ย (ASDF) ของ x[n] ในละแวกของกลุ่มตัวอย่าง x[n0] คือ:

Qx[k,n0]1Nn=0N1(x[n+n0N+k2]  x[n+n0N+k2+k])2

เป็นfloor()ฟังก์ชั่นและถ้าเป็นเช่นนั้น{2}kk2=k+12=k2

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

ดังนั้นให้พิจารณา"autocorrelation" ที่มีความยาว จำกัด(ในละแวกของตัวอย่าง ) ที่กำหนดจาก ASDF:x[n0]

Rx[k,n0]=Rx[0,n0]12Qx[k,n0]

ที่ไหน

Rx[0,n0]1Nn=0N1(x[n+n0N2])2

ตั้งแต่และสำหรับ lags ทั้งหมดนั่นหมายความว่าสำหรับ lagsทั้งหมดQx[0,n0]=0Qx[k,n0]0kRx[k,n0]Rx[0,n0]k

สมมติว่าหนึ่งนาทีที่เป็นคาบที่มีจุด (และเกิดขึ้นเป็นจำนวนเต็ม) ดังนั้นx[n]PP

x[n+P]=x[n]n

และ และสำหรับจำนวนเต็มใด ๆ ของช่วงเวลา (คือจำนวนเต็ม) ดังนั้นคุณจะได้จุดสูงสุดที่และที่เท่ากับพหุคูณอื่น ๆ ของหากเป็นคาบ ถ้าคือไม่ได้เป็นระยะอย่างสมบูรณ์แบบในสิ่งที่เราอาจคาดหวังเป็นยอดเขาที่ใหญ่ที่สุดที่สูงสุดอีก ( แต่ขนาดเล็กกว่าเล็กน้อย) ที่ (ซึ่งเป็นเวลาที่เรากำลังมองหา) และยอดความก้าวหน้าขนาดเล็กสำหรับหลายขนาดใหญ่ของPQx[mP,n0]=0Rx[mP,n0]=Rx[0,n0]Rx[k,n0]mk=0kPx[n]x[n]k=0k=PP

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

เหตุผลที่สองและปัญหาที่ยากมากขึ้นเป็นที่ของsubharmonics พิจารณาว่าคุณกำลังฟังโทนเสียงเป็นระยะที่ดีที่ A-440 Hz และดูเหมือน A ที่มี 9 semitones อยู่ตรงกลาง C ตอนนี้สมมติว่ามีบางคนเพิ่มเสียงที่แอมพลิจูดขนาดเล็กมาก (เช่นลง 60 dB) A -220? สิ่งที่ดูเหมือนและทางคณิตศาสตร์ในช่วงเวลาที่ "เป็นจริง" คืออะไร?


การเลือกจุดสูงสุด"ที่เหมาะสม"สำหรับช่วงเวลานั้น

สมมติว่าคุณเรียกใช้บันทึกย่อของคุณผ่านตัวกรองปิดกั้น DC เพื่อให้ค่าเฉลี่ยของเป็นศูนย์ ปรากฎว่าทำให้ค่าเฉลี่ยของ autocorrelationสำหรับทุกเป็นศูนย์ (หรือใกล้กับถ้ามีขนาดใหญ่) นั่นหมายความว่าจะต้องรวม (มากกว่า ) ให้มีค่าประมาณศูนย์ซึ่งหมายความว่ามีพื้นที่มากเกินกว่าศูนย์ดังต่อไปนี้x[n]Rx[k,n0]n0NRx[k,n0]k

โอเคดังนั้นหมายถึงพลังของในบริเวณรอบ ๆและต้องไม่เป็นลบ ไม่เกินแต่สามารถมีขนาดใหญ่เท่าเมื่อเป็นระยะ ถ้า[N] ดังนั้นถ้ามีคาบเป็นคาบด้วยจุดและคุณมีจุดยอดหนึ่งอยู่ห่างกันโดยและคุณมีความคิดว่ายอดเขาเหล่านั้นสูงแค่ไหน และถ้าส่วนประกอบ DC ของเป็นศูนย์นั่นหมายความว่าอยู่ระหว่างยอดเขาจะต้องมีค่าลบRx[0,n0]x[n]n=n0Rx[k,n0]Rx[0,n0]x[n]Rx[P,n0]=Rx[0,n0]x[n+P]=x[n]x[n]PPRx[k,n0]

ถ้าเป็น "quasi-periodic" หนึ่งรอบของจะดูเหมือนวงจรที่อยู่ติดกัน แต่ไม่เหมือนวงจรของไกลออกไปตามสัญญาณ นั่นหมายถึงจุดสูงสุดครั้งแรกจะสูงกว่าสองที่หรือสามn_0] เราสามารถใช้กฎนี้เพื่อเลือกยอดสูงสุดและคาดว่ายอดสูงสุดจะเป็นยอดแรกเสมอ แต่เนื่องจากไม่สามารถได้ยินคำแปรญัตติบางครั้งก็ไม่เป็นเช่นนั้น บางครั้งครั้งที่สองหรืออาจจะเป็นยอดเขาที่สามคือโอ้ดังนั้นสูงกว่าเล็กน้อย นอกจากนี้เนื่องจากช่วงเวลาน่าจะไม่ใช่จำนวนตัวอย่างจำนวนเต็ม แต่มีในx[n]x[n]x[n]Rx[P,n0]Rx[2P,n0]Rx[3P,n0]PkRx[k,n0]อยู่เสมอจำนวนเต็มดังนั้นยอดที่แท้จริงมีแนวโน้มที่จะอยู่ในระหว่างค่าจำนวนเต็มของkแม้ว่าคุณจะทำการสอดแทรกที่จุดยอดที่ราบรื่น (ซึ่งฉันแนะนำและการแก้ไขกำลังสองนั้นดีพอ) และความสูงของมันอยู่ระหว่างจำนวนเต็มแก้ไขของคุณอาจทำให้จุดสูงสุดสูงขึ้นหรือต่ำกว่าที่เป็นจริงเล็กน้อย ดังนั้นการเลือกจุดสูงสุดที่สูงที่สุดอาจส่งผลให้เกิดการเลือกวินาทีที่สูงกว่าจุดสูงสุดแรก (หรือกลับกัน) เมื่อคุณต้องการอีกจุดหนึ่งkk

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

คุณทำอย่างนั้นโดยการคูณพร้อมกับฟังก์ชั่นการลดลงของเพื่อให้สูงสุดที่จะลดลงโดยมีปัจจัยบางอย่างที่สัมพันธ์กับจุดสูงสุดเหมือนที่ P ปรากฎว่าฟังก์ชั่นพลังงาน (ไม่ใช่เลขชี้กำลัง) ทำเช่นนั้น คำนวณดังนั้นRx[k,n0]kk=2Pk=P

kα Rx[k,n0]

ดังนั้นถ้าเป็นคาบอย่างสมบูรณ์แบบด้วยระยะเวลาและไม่สนใจประเด็นการแก้ไขสำหรับไม่ใช่จำนวนเต็มดังนั้นx[n]PP

Rx[2P,n0]=Rx[P,n0]

แต่

(2P)αRx[2P,n0]=(2P)αRx[P,n0]<PαRx[P,n0]

ปัจจัยที่จุดสูงสุดสำหรับระดับเสียงต่ำกว่าหนึ่งคู่จะลดลงคืออัตราส่วน

(2P)αRx[2P,n0]PαRx[P,n0]=(2P)αPα=2α

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

2α=0.99

นั่นคือวิธีที่สอดคล้องกับน้ำหนักหรือยกเลิกการเน้นหรือแต้มต่อสูงสุดที่สอดคล้องกับสนามเสียงต่ำหนึ่งคู่ด้านล่าง

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


1
เพื่อตอบคำถามสุดท้ายของคุณ: หากคุณเพิ่มแอมพลิจูด 220 เฮิร์ตแล้วระดับเสียงจะเท่ากับ 220 เฮิร์ตซโดยที่ 440 เฮิร์ตซ์เป็นฮาร์โมนิกแรกหลังจากพื้นฐาน (การพูดทางคณิตศาสตร์) กรณีของฉันคล้ายกัน แต่ก็มีฮาร์โมนิกที่สูงกว่าดังนั้นพื้นฐานที่ขาดหายไปนั้นไม่ได้เป็นปัญหาจากมุมมองของการรับรู้ ฉันไม่เข้าใจว่าการแทนที่ AMDF ด้วย ASDF สามารถแก้ปัญหาระดับแปดเสียงได้อย่างไร
firion

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

ลองคำนวณและพล็อตสำหรับน้ำเสียงที่คุณได้ทำกับ AMDF ควรมีลักษณะคล้ายกับ AMDF คว่ำ Rx[k,n0]
robert bristow-johnson

หากคุณไม่มีฮาร์โมนิกที่สูงกว่าอื่น ๆ แต่มีเพียง 440 Hz และเสียง 220 Hz นั้นต่ำพอคุณจะได้ยินเสียง 440 Hz เหนือระดับหนึ่ง (ฉันไม่รู้ว่าอันไหน) คุณจะได้ยินเสียง 220 Hz และเสียง 220 Hz
firion

มีเหตุผลที่ฉันพูด -60 เดซิเบล ตอนนี้คุณต้องการให้เครื่องตรวจจับพิทช์พูดว่ามันคือ 220 Hz หรือโน้ต 440 Hz หรืออย่างอื่น?
robert bristow-johnson

0

Heuristically ความถี่พื้นฐานของคำพูดที่เปล่งออกมาจะอยู่ในช่วง [70, 400] Hz ดังนั้นขั้นตอนแรกคือการใช้ตัวกรอง bandpass เพื่อแยกวงนั้นโดยประมาณ

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


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