Mẹo để cải thiện phát hiện cao độ


21

Tôi đang làm việc trên một ứng dụng web đơn giản cho phép người dùng điều chỉnh guitar của mình. Tôi là người mới bắt đầu thực sự trong việc xử lý tín hiệu, vì vậy đừng phán xét quá nhiều nếu câu hỏi của tôi không phù hợp.

Vì vậy, tôi đã quản lý để có được tần số cơ bản bằng thuật toán FFT và tại thời điểm này, ứng dụng có chức năng nào đó. Tuy nhiên, vẫn còn chỗ để cải thiện, ngay bây giờ tôi gửi pcm thô cho thuật toán FFT, nhưng tôi đã nghĩ rằng có thể có một số thuật toán / bộ lọc trước / sau có thể cải thiện việc phát hiện. Bạn có thể đề nghị bất kỳ?

Vấn đề chính của tôi là khi phát hiện một tần số nhất định, nó cho thấy tần số đó trong 1-2 giây và sau đó nhảy sang các tần số ngẫu nhiên khác và quay lại và tiếp tục, ngay cả khi âm thanh liên tục.

Tôi cũng quan tâm đến bất kỳ loại tối ưu hóa nào khác nếu một người có kinh nghiệm với những thứ đó.

Câu trả lời:


20

Tôi đoán các tần số khác mà nó nhận được là hài hòa của cơ bản? Giống như bạn đang phát 100 Hz và thay vào đó, nó chọn ra 200 Hz hoặc 300 Hz? Đầu tiên, bạn nên giới hạn không gian tìm kiếm của mình ở tần số mà một cây đàn có khả năng là. Tìm cơ bản cao nhất bạn có thể cần và giới hạn ở đó.

Autocorrelation sẽ hoạt động tốt hơn FFT trong việc tìm kiếm cơ bản, nếu cơ bản có biên độ thấp hơn sóng hài (hoặc thiếu hoàn toàn, nhưng đó không phải là vấn đề với guitar):

nhập mô tả hình ảnh ở đây

Bạn cũng có thể thử tính trọng số của các tần số thấp hơn để nhấn mạnh cơ bản và giảm thiểu sóng hài, hoặc sử dụng thuật toán chọn đỉnh như thế này và sau đó chỉ chọn tần số thấp nhất.

Ngoài ra, bạn nên để cửa sổ tín hiệu của bạn trước khi áp dụng FFT. Bạn chỉ cần nhân nó với một chức năng cửa sổ , điều chỉnh đầu và cuối của dạng sóng để làm cho phổ tần số sạch hơn. Sau đó, bạn nhận được các gai hẹp cao cho các thành phần tần số thay vì các thành phần rộng.

Bạn cũng có thể sử dụng phép nội suy để có được một đỉnh chính xác hơn. Lấy nhật ký của quang phổ, sau đó đặt một parabola lên cực đại và hai điểm lân cận, và tìm đỉnh thực sự của parabola. Bạn có thể không cần nhiều độ chính xác này, mặc dù.

Dưới đây là ví dụ mã Python của tôi cho tất cả điều này .


Đây là những gì tôi đang tìm kiếm, câu trả lời rất tốt, cảm ơn bạn!
Valentin Radu

2
Nhân với một chức năng cửa sổ được làm thon sẽ thực sự làm mờ đi bất kỳ đường quang phổ nào trong tín hiệu của bạn, do đó làm cho chúng rộng hơn. Mặc dù vậy, thứ nó có thể mua cho bạn là dải động, cho phép bạn xác định, ví dụ, một vạch quang phổ công suất rất thấp với sự hiện diện của âm giao thoa công suất cao.
Jason R

@JasonR đưa ra một thực tế rằng điều này được thiết kế để hoạt động trong môi trường mà xác suất của âm gây nhiễu công suất cao thực sự thấp, bạn có đề nghị không nên sử dụng cửa sổ Hamming không?
Valentin Radu

1
Tôi có thể xác nhận rằng việc sử dụng cửa sổ Hamming giúp tôi tiến gần hơn đến mục tiêu giữ cho bài đọc ổn định. Ngay bây giờ, khi tôi chơi A4, tôi nhận được 440 Hz hầu hết thời gian và chỉ rất hiếm khi tôi có được đọc gần như 650 Hz hoặc hơn. Tôi đoán đó là những hài hòa? Ngoài ra, tôi không thể giúp nhận thấy rằng với tần suất cao hơn, ứng dụng hoạt động hoàn hảo và đối với mức thấp hơn, nó bắt đầu thất bại. Có lẽ bởi vì tôi đang sử dụng FTT để phát hiện thùng tần số cường độ cực đại và cho các tần số thấp hơn không phải lúc nào cũng là cơ bản?
Valentin Radu

1
@mindnoise: 660 Hz không phải là sóng hài của 440 Hz, nhưng nó là sóng hài của 220 Hz, hoặc một phần năm hoàn hảo trên 440. Có thể là một chuỗi khác cộng hưởng hoặc méo tiếng hay gì đó? Sẽ dễ dàng hơn rất nhiều để tìm ra các vấn đề như thế này nếu bạn có thể vẽ FFT và xem xét nó. Có, tần số thấp có thể được lọc và giảm so với tần số cao hơn, bằng hiệu ứng cơ học hoặc bởi mạch tương tự của bạn.
endolith

12

Cao độ không giống như thùng tần số cường độ cực đại của FFT. Sân là một hiện tượng tâm lý âm thanh của con người. Âm cao độ có thể có một âm cơ bản bị thiếu hoặc rất yếu (phổ biến trong một số âm thanh của giọng nói, piano và guitar) và / hoặc rất nhiều âm bội mạnh mẽ trong phổ của nó lấn át tần số cao độ (nhưng vẫn được con người nghe thấy như nốt đó) . Vì vậy, bất kỳ máy dò tần số cực đại FFT (thậm chí bao gồm cả một số cửa sổ và nội suy) sẽ không phải là một phương pháp ước lượng cường độ mạnh mẽ.

Câu hỏi stackoverflow này bao gồm một danh sách một số phương pháp ước tính cao độ khác nhau có thể tạo ra kết quả tốt hơn.

THÊM: Nếu bạn đang làm điều này cho âm thanh guitar, lưu ý rằng dây đàn guitar thấp nhất thực sự có thể tạo ra âm bội hơi không điều hòa, khiến cho việc ước tính cao độ thậm chí còn khó khăn hơn, vì tai người có thể nghe thấy tần số cao hơn liên quan đến bội số phụ của âm bội , thay vì tần số rung cơ bản thực tế của chuỗi.

THÊM # 2: Điều này được hỏi thường xuyên đến nỗi tôi đã viết một bài đăng blog dài hơn về chủ đề này: http://www.mUSEpaw.com/2012/04/musical-pitch-is-not-just-fft-frequency.html


chỉ cần truy cập (và nhận xét) blog mà bạn vừa giới thiệu.
robert bristow-johnson

5

Tôi đã dành nhiều năm để nghiên cứu phát hiện cao độ trên âm nhạc đa âm - như phát hiện các nốt của độc tấu guitar trong bản ghi mp3. Tôi cũng đã viết một phần trên Wikipedia trong đó mô tả ngắn gọn về quy trình (xem phần phụ "Phát hiện cao độ" trong liên kết bên dưới).

Khi một phím duy nhất được nhấn trên một cây đàn piano, những gì chúng ta nghe thấy không chỉ là một tần số rung động âm thanh, mà là một hỗn hợp của nhiều rung động âm thanh xảy ra ở các tần số khác nhau liên quan đến toán học. Các yếu tố của hỗn hợp rung động này ở các tần số khác nhau được gọi là sóng hài hoặc hạt. Chẳng hạn, nếu chúng ta nhấn phím Trung C trên đàn piano, các tần số riêng của sóng hài tổng hợp sẽ bắt đầu ở mức 261,6 Hz là tần số cơ bản, 523 Hz sẽ là sóng hài bậc 2, 785 Hz sẽ là sóng hài bậc 3, 1046 Hz sẽ là sóng hài bậc 3 là sóng hài bậc 4, v.v ... Các sóng hài sau này là bội số nguyên của tần số cơ bản, 261,6 Hz (ví dụ: 2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046).

Tôi sử dụng Biến đổi logarit DFT đã sửa đổi để lần đầu tiên phát hiện các sóng hài có thể bằng cách tìm tần số có mức cực đại (xem sơ đồ bên dưới). Do cách tôi thu thập dữ liệu cho Nhật ký DFT đã sửa đổi của mình, tôi KHÔNG phải áp dụng Chức năng cửa sổ cho tín hiệu, cũng như không thêm và chồng lấp . Và tôi đã tạo ra DFT để các kênh tần số của nó được đặt theo logarit để phù hợp trực tiếp với tần số mà các sóng hài được tạo bởi các nốt trên guitar, saxophone, v.v.

Hiện đã nghỉ hưu, tôi đã quyết định phát hành mã nguồn cho công cụ phát hiện cao độ của mình trong một ứng dụng trình diễn miễn phí có tên là PitchScope Player . PitchScope Player có sẵn trên web và bạn có thể tải xuống tệp thực thi cho Windows để xem thuật toán của tôi hoạt động trên tệp mp3 bạn chọn. Liên kết dưới đây với GitHub.com sẽ dẫn bạn đến mã nguồn đầy đủ của tôi, nơi bạn có thể xem cách tôi phát hiện các sóng hài với một biến đổi DFT logarit tùy chỉnh, sau đó tìm các hạt (sóng hài) có tần số thỏa mãn mối quan hệ số nguyên chính xác xác định một ' sân cỏ'.

Thuật toán phát hiện cao độ của tôi thực sự là một quá trình gồm hai giai đoạn: a) Trước tiên, ScalePitch được phát hiện ('ScalePitch' có 12 giá trị cao độ có thể có: {E, F, F #, G, G #, A, A #, B, C, C #, D , D #}) b) và sau khi ScalePitch được xác định, thì Octave được tính bằng cách kiểm tra tất cả các sóng hài cho 4 ghi chú Octave-Candidate có thể. Thuật toán được thiết kế để phát hiện cao độ nổi trội nhất (một nốt nhạc) tại bất kỳ thời điểm nào trong một tệp MP3 đa âm. Điều đó thường tương ứng với các nốt của một bản nhạc cụ. Những người quan tâm đến mã nguồn C ++ cho thuật toán Phát hiện sân khấu 2 giai đoạn của tôi có thể muốn bắt đầu tại hàm Estimate_ScalePitch () trong tệp SPitchCalc.cpp tại GitHub.com.

https://github.com/CreativeDetector/PitchScope_Player

https://en.wikipedia.org/wiki/Transcrip_(music)#Pitch_detection

Dưới đây là hình ảnh của một DFT logarit (được tạo bởi phần mềm C ++ của tôi) trong 3 giây của một bản ghi ta guitar trên bản ghi mp3 đa âm. Nó cho thấy cách các giai điệu xuất hiện cho các nốt riêng lẻ trên guitar, trong khi chơi solo. Đối với mỗi ghi chú trên DFT logarit này, chúng ta có thể thấy nhiều sóng hài của nó kéo dài theo chiều dọc, bởi vì mỗi sóng hài sẽ có cùng độ rộng thời gian. Sau khi Octave của ghi chú được xác định, sau đó chúng tôi biết tần suất của Nguyên tắc cơ bản.

nhập mô tả hình ảnh ở đây

Sơ đồ bên dưới trình bày thuật toán Phát hiện Octave mà tôi đã phát triển để chọn ghi chú Octave-Candidate chính xác (nghĩa là Cơ bản chính xác), khi ScalePitch cho ghi chú đó đã được xác định. Những ai muốn xem phương thức đó trong C ++ nên truy cập hàm Calc_Best_Octave_Candidate () bên trong tệp có tên FundCandidCalcer.cpp, được chứa trong mã nguồn của tôi tại GitHub.

nhập mô tả hình ảnh ở đây


James, máy phát hiện sân DFT của bạn có phát hiện các ghi chú với phần cơ bản bị thiếu (hoặc yếu) không?
robert bristow-johnson

Có, thuật toán Phát hiện sân khấu 2 giai đoạn của tôi sẽ phát hiện các ghi chú, ngay cả khi tín hiệu có "thiếu (hoặc yếu) cơ bản" - đó là một thế mạnh lớn của quy trình 2 giai đoạn này. Nguyên tắc cơ bản được xác định trong giai đoạn thứ hai khi Phát hiện Octave được thực hiện theo độ rộng thời gian mà bạn thấy để ghi chú trên sơ đồ DFT logarit. Vì chức năng Phát hiện sân này hoạt động trong sự nhầm lẫn của tín hiệu mp3 đa âm, nó sẽ phát hiện các ghi chú bị thiếu nhiều sóng hài, bao gồm cả Nguyên tắc cơ bản. Tôi vừa thêm vào Trả lời này một sơ đồ thứ hai giải thích thuật toán Phát hiện Octave của tôi.
James Paul Millard
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.