Ý tưởng của tự tương quan là cung cấp thước đo độ tương tự giữa tín hiệu và chính nó tại một độ trễ nhất định. Có một số cách để tiếp cận nó, nhưng với mục đích phát hiện cao độ / nhịp độ, bạn có thể nghĩ về nó như một thủ tục tìm kiếm. Nói cách khác, bạn bước qua từng mẫu tín hiệu và thực hiện mối tương quan giữa cửa sổ tham chiếu của bạn và cửa sổ bị trễ. Tương quan ở "độ trễ 0" sẽ là mức tối đa toàn cầu vì bạn đang so sánh tham chiếu với bản sao nguyên văn của chính nó. Khi bạn bước về phía trước, mối tương quan sẽ nhất thiết phải giảm, nhưng trong trường hợp tín hiệu định kỳ, đến một lúc nào đó nó sẽ bắt đầu tăng trở lại, sau đó đạt đến mức tối đa cục bộ. Khoảng cách giữa "độ trễ 0" và đỉnh đầu tiên đó cho bạn ước tính cao độ / nhịp độ của bạn. Cách tôi'
Tính toán tương quan mẫu theo mẫu có thể rất tốn kém về mặt tính toán với tỷ lệ mẫu cao, do đó, thường sử dụng phương pháp dựa trên FFT. Lấy FFT của phân đoạn sở thích, nhân nó với liên hợp phức tạp của nó , sau đó lấy FFT nghịch đảo sẽ cung cấp cho bạn sự tự tương quan theo chu kỳ . Trong mã (sử dụng numpy ):
freqs = numpy.fft.rfft(signal)
autocorr = numpy.fft.irfft(freqs * numpy.conj(freqs))
Hiệu quả sẽ là giảm lượng nhiễu trong tín hiệu (không tương thích với chính nó) so với các thành phần định kỳ (tương tự như định nghĩa của chúng). Lặp lại quá trình tự tương quan (tức là phép nhân liên hợp) trước khi thực hiện phép biến đổi nghịch đảo sẽ làm giảm tiếng ồn hơn nữa. Hãy xem xét ví dụ về sóng hình sin trộn với nhiễu trắng. Biểu đồ sau đây cho thấy một sóng hình sin 440hz, cùng một sóng hình sin "bị hỏng" bởi nhiễu, sự tự tương quan theo chu kỳ của sóng nhiễu và sự tự tương quan tuần hoàn kép:
Lưu ý cách đỉnh đầu tiên của cả hai tín hiệu tự tương quan được đặt chính xác ở cuối chu kỳ đầu tiên của tín hiệu gốc. Đó là đỉnh cao mà bạn đang tìm kiếm để xác định tính tuần hoàn (cao độ trong trường hợp này). Tín hiệu tự tương quan đầu tiên vẫn còn hơi "gượng gạo", vì vậy để phát hiện cực đại, một số loại làm mịn sẽ được yêu cầu. Tự động tương quan hai lần trong miền tần số thực hiện cùng một điều (và tương đối nhanh). Lưu ý rằng bằng cách "ngọ nguậy", ý tôi là tín hiệu trông như thế nào khi phóng to, không phải là sự nhúng xảy ra ở trung tâm của âm mưu. Nửa sau của tự động chu kỳ sẽ luôn là hình ảnh phản chiếu của nửa đầu, do đó, kiểu "nhúng" là điển hình. Để rõ ràng về thuật toán, đây là đoạn mã sẽ như thế nào:
freqs = numpy.fft.rfft(signal)
auto1 = freqs * numpy.conj(freqs)
auto2 = auto1 * numpy.conj(auto1)
result = numpy.fft.irfft(auto2)
Việc bạn có cần phải thực hiện nhiều hơn một tự tương quan hay không phụ thuộc vào mức độ nhiễu trong tín hiệu.
Tất nhiên, có nhiều biến thể tinh tế trong ý tưởng này, và tôi sẽ không đi sâu vào tất cả chúng ở đây. Phạm vi bảo hiểm toàn diện nhất mà tôi đã thấy (trong bối cảnh phát hiện cao độ) là trong Xử lý kỹ thuật số tín hiệu lời nói của Rabiner và Schafer.
Bây giờ, liệu tự động tương quan sẽ đủ để phát hiện nhịp độ. Câu trả lời là có hoặc không. Bạn có thể nhận được một số thông tin về nhịp độ (tùy thuộc vào tín hiệu nguồn), nhưng có thể khó hiểu ý nghĩa của nó trong mọi trường hợp. Ví dụ: đây là một âm mưu gồm hai vòng lặp đột phá, tiếp theo là một âm mưu tự tương quan theo chu kỳ của toàn bộ chuỗi:
Để tham khảo, đây là âm thanh tương ứng:
Chắc chắn, có một mũi nhọn đẹp ở giữa tương ứng với điểm vòng lặp, nhưng nó đến từ việc xử lý một đoạn khá dài. Trên hết, nếu đó không phải là một bản sao chính xác (ví dụ nếu có thiết bị với nó), thì cành đó sẽ không sạch như vậy. Autocorrelation chắc chắn sẽ hữu ích trong việc phát hiện nhịp độ, nhưng có lẽ nó sẽ không đủ cho chính vật liệu nguồn phức tạp. Ví dụ, ngay cả khi bạn tìm thấy một đột biến, làm thế nào để bạn biết liệu đó là một biện pháp đầy đủ, hoặc ghi chú quý, một nửa ghi chú, hoặc một cái gì khác? Trong trường hợp này, rõ ràng đó là một biện pháp đầy đủ, nhưng điều đó sẽ không luôn luôn như vậy. Tôi khuyên bạn nên chơi xung quanh bằng cách sử dụng AC trên các tín hiệu đơn giản hơn cho đến khi hoạt động bên trong trở nên rõ ràng, sau đó hỏi một câu hỏi khác về phát hiện nhịp độ nói chung (vì nó "lớn hơn"