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