Tự động tương quan trong phân tích âm thanh


11

Tôi đang đọc về Autocorrelation , nhưng tôi không chắc tôi hiểu chính xác nó hoạt động như thế nào và tôi nên mong đợi sản lượng nào. Tôi có đúng không khi nghĩ rằng tôi nên nhập tín hiệu của mình vào chức năng AC và có đầu vào cửa sổ trượt. Mỗi cửa sổ (ví dụ 1024 mẫu) sẽ tạo ra một hệ số từ -1 đến 1. Dấu hiệu chỉ đơn giản là nếu đường lên hoặc xuống và giá trị cho biết mức độ tương quan mạnh như thế nào. Để đơn giản, giả sử tôi không có sự trùng lặp và chỉ di chuyển cửa sổ 1024 mẫu mỗi lần. Trong mẫu 44100, tôi có nhận được 43 hệ số không và tôi có cần giữ tất cả chúng không?

Hãy nói rằng tôi thực hiện điều này trong tín hiệu 200 giây, mang lại cho tôi 8600 hệ số. Làm thế nào tôi có thể sử dụng các hệ số này để phát hiện sự lặp lại và đến lượt mình, nhịp độ? Tôi có nên tạo một số loại mạng thần kinh để nhóm chúng lại không, hay đó là quá mức cần thiết?

Cảm ơn vì bất kì sự giúp đỡ.


4
Giả sử mẫu của bạn là . Bạn có thể cho chúng tôi biết chức năng AC của bạn trả về những gì? Các câu trả lời có thể có thể là: "Nó trả về " hoặc "Nó trả về số trong đó "hoặc" Nó trả về số trong đó ". Tất cả ba câu trả lời được đề xuất đều tương thích với khái niệm tự tương quan. 1024x[1],x[2],,x[1024]i=11024(x[i])21024R[k]R[k]=i=11024kx[i]x[i+k]1024R[k]R[k]=i=11024kx[i]x[i+k]+i=1kx[1024k+i]x[i]
Dilip Sarwate

Này Dilip, cảm ơn vì sự giúp đỡ. Tôi chưa thực hiện chức năng AC, tôi chỉ cố gắng tìm hiểu lý thuyết trước. Phương trình đầu tiên có vẻ là dễ nhất nhưng dữ liệu cần phải được chuẩn hóa trước?
XSL

1
Dưới đây là một ví dụ: gist.github.com/255291#L62
endolith

Câu trả lời:


23

Ý 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:

Tự động hóa

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:

Tự động đột phá

Để 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"


2
Đợi đã, đó có phải là tự tương quan của tín hiệu âm thanh không? Điều đó chắc chắn không hữu ích cho việc phát hiện tiến độ của bất cứ thứ gì ngoại trừ các vòng kỹ thuật số. Việc tự động tương quan của một số đường bao RMS nói chung sẽ hoạt động tốt hơn nhiều, tốt nhất là cho nhiều dải tần riêng biệt.
leftaroundabout

1
Autocorrelation của STFT theo hướng thời gian hoạt động khá tốt, miễn là âm nhạc có một số loại nhịp. Điều này về cơ bản giống như chạy tự động tương quan nhiều dải tần số và sau đó tổng hợp chúng lại với nhau.
endolith

2
@leftroundabout Phải, có bất kỳ số lượng điều cần phải được thực hiện để phát hiện nhịp độ (trước, xử lý bài) bên cạnh tự động tương quan. Tôi chủ yếu trả lời câu đầu tiên của câu hỏi của OP (nghĩa là "tự động hóa hoạt động như thế nào"), sau đó đề nghị anh ta hỏi một câu hỏi khác về phát hiện nhịp độ, vì các quy trình khác sẽ được tham gia.
datageist

@endolith bạn có ý gì ở đây Autocorrelation of the STFT in the time direction? Cụ thể là phần định hướng thời gian
popctrl 11/03/19

1
@popctrl Có nghĩa là tính toán tự động tương quan của mỗi hàng của STFT
endolith

3

Âm thanh như bạn muốn sử dụng autocorrelation để phát hiện nhịp. Bạn có thể làm điều này, nhưng tôi khuyên bạn nên giảm âm lượng lớn. Bạn đang tìm kiếm tín hiệu trong khoảng từ 1 đến 3 Hz (60 bpm đến 180 bpm) vì vậy bạn không cần hoặc muốn độ phân giải 44100 hz. Một tự động tương quan được tính toán và chuẩn hóa đúng là 1.0 ở độ trễ 0 (tín hiệu hoàn toàn tương quan với chính nó). Đối với tín hiệu định kỳ, ac giảm xuống dưới 0, sau đó quay trở lại trong một đỉnh ở độ trễ tương ứng với tần số cơ bản, với các đỉnh nhỏ hơn ở sóng hài. Bạn phải chọn một phạm vi hợp lý để tìm kiếm đỉnh này. Đối với tiếng ồn, sự tự tương quan giảm xuống và về cơ bản là các đường thẳng nằm trong khoảng không. Theo nguyên tắc thông thường, nếu bạn có đỉnh> 0,5 trong ac bình thường, bạn có tín hiệu định kỳ.


1

Tương quan tự động chỉ đơn giản là tương quan chéo của tín hiệu với chính nó. Một cách dễ dàng để tính toán nó là thực hiện tích chập giữa tín hiệu gốc và phiên bản lật thời gian của tín hiệu. Nếu bạn có tín hiệu dài 1000 mẫu, thì tương quan tự động của nó có các mẫu khác không 1999 (2 * N-1). Chỉ có 1000 mẫu trong số đó là duy nhất vì tương quan tự động (đối với tín hiệu thực) luôn luôn đối xứng về thời gian, tức là ac [n] = ac [-n].

Các tín hiệu liên tục cần được chia thành các phân đoạn hữu hạn. Điều này tương tự với Biến đổi Fourier: về mặt kỹ thuật, bạn cần tích hợp từ -inf thành + inf nhưng chia nó thành các phân đoạn (với sự chồng chéo và / hoặc cửa sổ khi cần) cũng mang lại kết quả hữu ích. Lựa chọn chiều dài cửa sổ, hình dạng và chồng chéo tùy thuộc vào ứng dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.