2008-09-15 29 views

Trả lời

5

FFTs (Fast-Fourier Transforms) thực sự sẽ được tham gia. FFT cho phép bạn gần đúng bất kỳ tín hiệu analog nào với tổng các sóng sin đơn giản của tần số cố định và biên độ thay đổi. Những gì bạn thực sự sẽ làm là lấy mẫu và phân tích nó thành các cặp tần số -> tần số, và sau đó lấy tần số tương ứng với biên độ cao nhất.

Hy vọng rằng một trình đọc SO khác có thể lấp đầy khoảng trống tôi để lại giữa lý thuyết và mã!

+3

Cách tiếp cận này có vấn đề về độ chính xác nghiêm trọng, đặc biệt trong ngữ cảnh âm nhạc. Khi điểm kết thúc, FFT cho bạn cường độ trong phạm vi tần số; phạm vi lớn hơn kích thước cửa sổ FFT nhỏ hơn (và nhanh hơn).Thậm chí tệ hơn, phạm vi tổng thể là từ 0 đến 44100 Hz (đối với âm thanh sổ đỏ), trong khi một nốt nhạc điển hình hầu như luôn dưới 1000Hz, vì vậy hầu hết độ phân giải bạn bị lãng phí trên các băng tần cao hơn. – MusiGenesis

1

Áp dụng DFT và sau đó lấy được tần suất cơ bản từ kết quả. Googling xung quanh cho thông tin DFT sẽ cung cấp cho bạn những thông tin bạn cần - Tôi sẽ liên kết bạn với một số, nhưng họ khác nhau rất nhiều trong kỳ vọng của kiến ​​thức toán học.

Chúc may mắn.

4

Bộ dò sóng không sử dụng FFT hoặc DFT. Thông thường, họ chỉ cần đếm số không. Bạn có thể không nhận được tần số cơ bản bởi vì một số dạng sóng có nhiều điểm giao cắt bằng không so với các dạng sóng khác nhưng bạn thường có thể nhận được nhiều tần số cơ bản theo cách đó. Đó là đủ để có được lưu ý mặc dù bạn có thể là một hoặc nhiều quãng tám.

Lọc qua thấp trước khi đếm số lần giao cắt ngang không thường có thể loại bỏ số lần vượt quá số không vượt quá. Điều chỉnh bộ lọc thông thấp đòi hỏi một số kiến ​​thức của dải tần số bạn muốn phát hiện mặc dù

+2

Tôi nghi ngờ họ chỉ đếm số không. Có rất nhiều số không vượt qua trên mỗi chu kỳ trong một dạng sóng guitar điển hình. http://www.flickr.com/photos/[email protected]/4180888094/ Họ có thể thực hiện tự tương quan đơn giản. – endolith

+1

Không có điểm giao cắt không thực sự quan trọng đối với bộ chỉnh đơn giản. Hãy nhớ rằng một bộ chỉnh không cần tần số chính xác của cơ bản. Nó cần phải biết ghi chú. Bằng cách đếm số không vượt qua trên mỗi chu kỳ nó có thể khóa trên một quãng tám cao hơn nhưng một Cb vẫn sẽ là một Cb và hai xu quá cao sẽ vẫn là hai xu quá cao. Tự tương quan là tuyệt vời để xử lý nâng cao hơn nhưng nó quá mức cần thiết cho một bộ chỉnh. – Mendelt

4

Một chút đặc biệt hơn:

Nếu bạn bắt đầu với PCM thô trong một mảng đầu vào, những gì bạn có cơ bản là một đồ thị của biên độ sóng vs time.Doing một FFT sẽ biến đổi đó thành một biểu đồ tần số cho các tần số từ 0 đến 1/2 tốc độ lấy mẫu đầu vào. Giá trị của mỗi mục trong mảng kết quả sẽ là 'cường độ' của tần số phụ tương ứng.

Vì vậy, để tìm ra tần số gốc cho một mảng đầu vào có kích thước N lấy mẫu tại S mẫu/giây:

FFT(N, input, output); 
max = max_i = 0; 
for(i=0;i<N;i++) 
    if (output[i]>max) max_i = i; 
root = S/2.0 * max_i/N ; 
+0

Tôi thích sự đơn giản ngắn gọn nhưng nghi ngờ một vấn đề với vòng lặp for. Đầu ra chắc chắn sẽ không có cùng kích thước với đầu vào – Waslap

+0

Nó chính xác cùng kích thước. Làm một FFT là một sự cân bằng - bạn có thể có độ phân giải tần số tốt (nhiều thùng đầu ra) chỉ bằng cách phân tích một khoảng thời gian lớn. Nếu hạn chế phân tích đến một thời điểm rất chính xác (cỡ mẫu đầu vào nhỏ), bạn sẽ có độ phân giải thấp trong miền tần số. – AShelly

17

Ngoài ra còn có các thuật toán khác mà theo thời gian, không tần số dựa. Tự tương quan là một thuật toán tương đối đơn giản để phát hiện quảng cáo chiêu hàng. Tham chiếu: http://cnx.org/content/m11714/latest/

Tôi đã viết C# triển khai tự tương quan và các thuật toán khác có thể đọc được. Kiểm tra http://code.google.com/p/yaalp/.

http://code.google.com/p/yaalp/source/browse/#svn/trunk/csaudio/WaveAudio/WaveAudio Liệt kê các tệp và PitchDetection.cs là tệp bạn muốn.

(Dự án là GPL; vì vậy hãy hiểu các điều khoản nếu bạn sử dụng mã).

+2

Tôi muốn bỏ phiếu cho câu trả lời này nhiều lần. FFTs là một giải pháp khủng khiếp cho vấn đề này; nó giống như lái xe tăng đến cửa hàng tạp hóa. Chắc chắn, nó thật tuyệt, nhưng nó thực sự không phải là cách tốt nhất. Tự tương quan thường được coi là giải pháp RIGHT cho vấn đề này; viz Autotune/Melodyne/Singstar/bạn tên nó. Không vượt qua các giải pháp dựa trên chỉ áp dụng khi bạn có kiến ​​thức cụ thể về hành vi hermonic. Tự tương quan có thể được thực hiện rất hiệu quả. –

+5

Whoa, cái gì? Tôi không đồng ý. Một giải pháp miền tần số hoàn toàn không phải là một giải pháp khủng khiếp. Phổ sản phẩm hài hòa hoặc phương pháp cepstral rất dễ thực hiện và hợp lý mạnh mẽ. Tự tương quan không phải là * thường * coi là giải pháp RIGHT bằng bất kỳ phương tiện nào; nó là một trong nhiều giải pháp hợp lệ. Đúng, mặc dù: không vượt qua không phải là một chỉ số đáng tin cậy của sân. –

+1

Tự tương quan thường tốn nhiều tính toán hơn FFT. Chúng tôi thường sử dụng FFT để tự tương quan, vì thực tế là vì nó nhanh hơn. Sử dụng tự tương quan ngây thơ khi bạn có thể làm điều đó với FFT giống như lái xe tăng qua tường của cửa hàng tạp hóa thay vì sử dụng cửa trước. – endolith

19

FFT có thể giúp bạn tìm ra tần số ở đâu, nhưng không thể cho bạn biết chính xác tần số là gì. Mỗi điểm trong FFT là một "bin" tần số, vì vậy nếu có một đỉnh trong FFT của bạn, tất cả những gì bạn biết là tần suất bạn muốn ở đâu đó trong thùng đó, hoặc phạm vi tần số.

Nếu bạn muốn nó thực sự chính xác, bạn cần một FFT dài với độ phân giải cao và rất nhiều thùng (= rất nhiều bộ nhớ và rất nhiều tính toán). Bạn cũng có thể đoán mức cao thực sự từ một FFT có độ phân giải thấp bằng cách sử dụng quadratic interpolation trên phổ nhật ký, hoạt động hiệu quả đáng ngạc nhiên. Nếu chi phí tính toán là quan trọng nhất, bạn có thể cố gắng đưa tín hiệu vào một biểu mẫu mà bạn có thể đếm số lần giao cắt bằng không, và sau đó bạn càng đếm, thì số đo của bạn càng chính xác hơn.

Mặc dù vậy, không có cách nào trong số này sẽ hoạt động nếu fundamental is missing. :)

Tôi đã phác thảo một vài thuật toán khác nhau here và FFT nội suy thường chính xác nhất (mặc dù điều này chỉ hoạt động when the fundamental is the strongest harmonic - nếu không bạn cần thông minh hơn) (mặc dù điều này chỉ hoạt động for waveforms with one crossing per cycle). Cả hai điều kiện này đều không điển hình.

Hãy nhớ rằng các partials trên tần số cơ bản là không phải là sóng hài hoàn hảo trong nhiều nhạc cụ, như piano hoặc guitar. Mỗi phần là actually a little bit out of tune hoặc inharmonic. Vì vậy, các đỉnh tần số cao hơn trong FFT sẽ không chính xác trên bội số nguyên của cơ bản, và hình dạng sóng sẽ thay đổi một chút từ một chu kỳ sang chu kỳ tiếp theo, điều này sẽ ném ra sự tự tương quan.

Để có được sự đọc tần số thực sự chính xác, tôi muốn nói để sử dụng tự tương quan để đoán cơ bản, sau đó tìm giá trị thực bằng cách sử dụng phép nội suy bậc hai. (Bạn có thể thực hiện tự tương quan trong miền tần số để lưu chu kỳ CPU.) Có rất nhiều gotchas, và phương pháp đúng để sử dụng thực sự phụ thuộc vào ứng dụng của bạn.

+1

Cũng như các nguyên tắc cơ bản còn thiếu, đó cũng là vấn đề cộng hưởng cảm thông để đối phó với tín hiệu từ các nhạc cụ có dây. Đặc biệt trong kịch bản điều chỉnh nhạc cụ cho guitar, các chuỗi không được điều chỉnh tại bất kỳ thời điểm nào được mở và nếu gần với sân điều chỉnh có phần tách rời trùng với chuỗi đã phát. – marko

3

Retrieval tần số cơ bản trong một tín hiệu âm thanh PCM là một nhiệm vụ khó khăn, và sẽ có rất nhiều điều để nói về nó ...

Dù sao, thường là phương pháp dựa vào thời gian không phù hợp với tín hiệu chuông đa âm, bởi vì một sóng phức tạp được đưa ra bởi tổng các thành phần điều hòa khác nhau do nhiều tần số cơ bản có tốc độ không qua mà chỉ phụ thuộc vào thành phần tần số thấp nhất ... Cũng trong miền tần số FFT không phải là phương pháp phù hợp nhất, vì tần số khoảng cách giữa các ghi chú theo thang tỷ lệ mũ, chứ không phải tuyến tính. Điều này có nghĩa là độ phân giải tần số không đổi, được sử dụng trong phương pháp FFT, có thể không đủ để giải quyết các ghi chú tần số thấp hơn nếu kích thước của cửa sổ phân tích trong miền thời gian không đủ lớn.

Một phương pháp phù hợp hơn sẽ là biến đổi Q không đổi, được áp dụng sau một quá trình lọc và khử thấp qua 2 (tức là giảm một nửa tần số lấy mẫu) của tín hiệu, để thu được các băng con có độ phân giải tần số khác nhau. Bằng cách này, tính toán DFT được tối ưu hóa. Vấn đề là độ phân giải thời gian cũng thay đổi và tăng cho các băng con thấp hơn.

Cuối cùng, nếu chúng ta đang cố gắng ước lượng tần số cơ bản của một ghi chú, phương pháp FFT/DFT là ok. Mọi thứ thay đổi theo ngữ cảnh đa âm, trong đó các phần của âm thanh khác nhau chồng lên nhau và tổng hợp/hủy biên độ của chúng phụ thuộc vào chênh lệch pha của chúng, và vì vậy một phổ quang phổ có thể thuộc về các nội dung hài khác nhau (thuộc các nốt khác nhau). Tương quan trong trường hợp này không mang lại kết quả tốt ...

Các vấn đề liên quan