ความสัมพันธ์อัตโนมัติในการวิเคราะห์เสียง


11

ฉันกำลังอ่านข้อมูลเกี่ยวกับAutocorrelationแต่ฉันไม่แน่ใจว่าฉันเข้าใจอย่างแน่ชัดว่ามันทำงานอย่างไรและควรคาดหวังอะไรจากผลลัพธ์ ฉันคิดถูกแล้วว่าฉันควรป้อนสัญญาณของฉันไปยังฟังก์ชัน AC และมีอินพุตหน้าต่างแบบเลื่อน แต่ละหน้าต่าง (ตัวอย่าง 1024 ตัวอย่าง) จะส่งออกสัมประสิทธิ์ระหว่าง -1 ถึง 1 เครื่องหมายจะระบุว่าเส้นตรงขึ้นหรือลงและค่าจะระบุว่าค่าสหสัมพันธ์นั้นแข็งแกร่งแค่ไหน สำหรับความเรียบง่ายสมมติว่าฉันไม่มีเหลื่อมกันและเพียงแค่ย้ายหน้าต่าง 1024 ตัวอย่างทุกครั้ง ในตัวอย่าง 44100 ฉันจะได้ 43 สัมประสิทธิ์และฉันจำเป็นต้องรักษาทั้งหมดหรือไม่

ให้บอกว่าฉันทำสิ่งนี้เพื่อสัญญาณ 200 วินาทีให้ค่าสัมประสิทธิ์ 8600 กับฉัน ฉันจะใช้สัมประสิทธิ์เหล่านี้เพื่อตรวจสอบการทำซ้ำและในทางกลับกันความเร็วได้อย่างไร ฉันควรสร้างเครือข่ายประสาทบางอย่างเพื่อจัดกลุ่มพวกเขาหรือว่า overkill นั้น?

ขอบคุณสำหรับความช่วยเหลือ


4
สมมติว่าคุณตัวอย่างมี[1024] คุณสามารถบอกเราได้ว่าฟังก์ชั่น AC ของคุณส่งคืนอย่างไร คำตอบที่เป็นไปได้อาจเป็น: "มันส่งกลับ " หรือ "มันจะส่งกลับหมายเลขR [ k ]โดยที่R [ k ] = 1024 - k i = 1 x [ ผม] x [ ฉัน+ k ] "หรือ" มันกลับ1024หมายเลขR [ k ]ที่x [ 1 ] , x [ 2 ] , , x [ 1024 ] 1024 i = 1 ( x [ i ] ) 2 10241024x[1],x[2],...,x[1024]Σผม=11024(x[ผม])21024R[k]R[k]=Σผม=11024-kx[ผม]x[ผม+k]1024R[k] "คำตอบที่แนะนำทั้งสามนี้เข้ากันได้กับ แนวคิดเรื่องความสัมพันธ์อัตโนมัติR[k]=Σผม=11024-kx[ผม]x[ผม+k]+Σผม=1kx[1024-k+ผม]x[ผม]
Dilip Sarwate

เฮ้ดิลลิปขอบคุณสำหรับความช่วยเหลือ ฉันยังไม่ได้ใช้ฟังก์ชั่น AC ฉันแค่พยายามทำให้สมองของฉันรอบ ๆ ทฤษฎีก่อน สมการแรกดูเหมือนจะง่ายที่สุด แต่ข้อมูลจำเป็นต้องทำให้เป็นมาตรฐานก่อนหรือไม่
XSL

1
นี่คือตัวอย่าง: gist.github.com/255291#L62
endolith

คำตอบ:


23

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

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

freqs = numpy.fft.rfft(signal)
autocorr = numpy.fft.irfft(freqs * numpy.conj(freqs))

ผลที่ได้คือการลดปริมาณเสียงรบกวนในสัญญาณ (ซึ่งไม่เกี่ยวข้องกับตัวเอง) เทียบกับองค์ประกอบตามระยะเวลา (ซึ่งคล้ายกับตัวเองตามคำนิยาม) ทำซ้ำความสัมพันธ์อัตโนมัติ (เช่นการคูณด้วยคอนจูเกต) ก่อนที่จะทำการแปลงผกผันจะช่วยลดเสียงรบกวนได้มากขึ้น ลองพิจารณาตัวอย่างของคลื่นไซน์ที่ผสมกับเสียงสีขาว เนื้อเรื่องต่อไปนี้แสดงให้เห็นว่าคลื่นไซน์ 440hz, คลื่นไซน์เดียวกัน "เสียหาย" ด้วยเสียง, วงจรออโตคอร์เรชั่นของวงจรที่มีเสียงรบกวนของคลื่นที่มีเสียงดัง

อัต

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

freqs = numpy.fft.rfft(signal)
auto1 = freqs * numpy.conj(freqs)
auto2 = auto1 * numpy.conj(auto1)
result = numpy.fft.irfft(auto2)

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

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


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

Breakoc Autocorrelation

สำหรับการอ้างอิงต่อไปนี้เป็นเสียงที่เกี่ยวข้อง:

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


2
Hang on นั่นคือความสัมพันธ์อัตโนมัติของสัญญาณเสียงเองเหรอ? แน่นอนว่ามันไม่ได้มีประโยชน์มากสำหรับการตรวจจับจังหวะของอะไรนอกจากดิจิตอลลูป ความสัมพันธ์อัตโนมัติของซองจดหมาย RMS บางอันควรจะทำงานได้ดีขึ้นโดยทั่วไปดีกว่าสำหรับคลื่นความถี่หลายความถี่แยกกัน
leftaroundabout

1
อัตของ STFT ในทิศทางที่เวลาทำงานสวยดีตราบใดที่เพลงมีบางชนิดของจังหวะ นี่เป็นสิ่งเดียวกับการทำงานอัตโนมัติความสัมพันธ์ของคลื่นความถี่จำนวนมากแล้วรวมเข้าด้วยกัน
endolith

2
@leftroundabout ใช่มีหลายสิ่งที่จะต้องทำเพื่อการตรวจจับจังหวะ (ก่อนการโพสต์การประมวลผล) นอกเหนือจาก autocorrelation ด้วยตัวเอง ฉันส่วนใหญ่ตอบคำถามประโยคแรกของ OP (เช่น "ทำงานอัตโนมัติสัมพันธ์กันอย่างไร") จากนั้นแนะนำให้เขาถามคำถามอื่นเกี่ยวกับการตรวจจับจังหวะเนื่องจากกระบวนการอื่นจะเกี่ยวข้อง
นัก

@endolith คุณหมายถึงอะไรที่นี่โดยAutocorrelation of the STFT in the time direction? ส่วนทิศทางเวลาโดยเฉพาะ
popctrl

1
@ popctrl หมายถึงการคำนวณความสัมพันธ์อัตโนมัติของแต่ละแถวของ STFT
endolith

3

ดูเหมือนว่าคุณต้องการใช้การเชื่อมโยงอัตโนมัติเพื่อทำการตรวจจับจังหวะ คุณสามารถทำได้ แต่ฉันขอแนะนำให้คุณลองตัวอย่างเสียงของคุณอย่างหนาแน่น คุณกำลังมองหาสัญญาณระหว่าง 1 และ 3 Hz (60 bpm ถึง 180 bpm) ดังนั้นคุณไม่ต้องการหรือต้องการความละเอียด 44100 hz ออโต้คอร์เรชันที่คำนวณอย่างถูกต้องและปกติคือ 1.0 ที่ lag 0 (สัญญาณมีความสัมพันธ์อย่างสมบูรณ์กับตัวเอง) สำหรับสัญญาณเป็นระยะ AC จะลดลงต่ำกว่าศูนย์จากนั้นกลับมาที่จุดสูงสุดที่ความล่าช้าซึ่งสอดคล้องกับความถี่พื้นฐานโดยมียอดเขาขนาดเล็กที่ประสานกัน คุณต้องเลือกช่วงที่เหมาะสมในการค้นหาจุดสูงสุดนี้ สำหรับเสียงรบกวนความสัมพันธ์อัตโนมัติลดลงและโดยทั่วไปจะเป็นแนวราบใน squiggles รอบศูนย์ ตามกฎทั่วไปหากคุณมีจุดสูงสุด> 0.5 ในกระแสสลับปกติคุณจะมีสัญญาณเป็นระยะ


1

ความสัมพันธ์อัตโนมัติเป็นเพียงความสัมพันธ์ข้ามของสัญญาณด้วยตัวเอง วิธีง่าย ๆ ในการคำนวณคือการทำสังวัตนาระหว่างสัญญาณต้นฉบับและรุ่นที่พลิกเวลาของสัญญาณ หากคุณมีสัญญาณที่มีความยาว 1,000 ตัวอย่างกว่าค่าสหสัมพันธ์อัตโนมัติมีตัวอย่างที่ไม่เป็นศูนย์ 1999 (2 * N-1) มีเพียง 1,000 ตัวอย่างเท่านั้นที่ไม่ซ้ำกันเนื่องจากความสัมพันธ์อัตโนมัติ (สำหรับสัญญาณจริง) นั้นมีความสมมาตรในเวลาเสมอนั่นคือ ac [n] = ac [-n]

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

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