2010-05-21 30 views
12

Giả sử tôi có tệp WAV. Trong tập tin này, là một loạt các tông màu sine chính xác trong khoảng thời gian 1 giây. Tôi muốn sử dụng thư viện FFTW để trích xuất các tông theo thứ tự. Điều này đặc biệt khó làm? Làm thế nào tôi sẽ đi về điều này?Cách trích xuất các tần số bán chính xác từ tệp WAV bằng cách sử dụng Biến đổi Fourier

Ngoài ra, cách tốt nhất để ghi âm loại này thành tệp WAV là gì? Tôi cho rằng tôi chỉ cần một thư viện âm thanh đơn giản cho đầu ra.

Ngôn ngữ bạn chọn là C

Trả lời

1

Tệp WAV chứa linear pulse code modulated (LPCM) dữ liệu. Điều đó chỉ có nghĩa rằng nó là một chuỗi các giá trị biên độ ở một tỷ lệ mẫu cố định. Một RIFF header được chứa ở đầu tệp để truyền tải thông tin như sampling rate và các bit trên mỗi mẫu (ví dụ: 8 kHz đã ký 16 bit).

Định dạng rất đơn giản và bạn có thể dễ dàng cuộn của riêng bạn. Tuy nhiên, có một số thư viện có sẵn để tăng tốc quá trình như libsndfile. Simple Direct-media Layer (SDL)/SDL_mixerPortAudio là hai thư viện đẹp để phát lại.

Để cho ăn dữ liệu vào FFTW, bạn sẽ cần phải đệm 1 khối thứ hai (xác định kích thước theo tỷ lệ mẫu và bit trên mỗi mẫu). Sau đó chuyển đổi tất cả các mẫu sang điểm nổi IEEE (tức là float hoặc double tùy thuộc vào cấu hình FFTW-- libsndfile có thể làm điều này cho bạn). Tiếp theo tạo một mảng khác để giữ đầu ra miền tần số. Cuối cùng, tạo và thực thi kế hoạch FFTW bằng cách chuyển cả hai bộ đệm đến fftw_plan_dft_r2c_1d và gọi fftw_execute with the returned fftw_plan handle.

+0

Không thực sự là phiên bản 'fftw', nhưng có hay không nó được biên dịch với hỗ trợ nổi, phải không? –

+0

Đúng, đó là vấn đề về cấu hình xây dựng IIRC. Tôi đã không sử dụng FFTW trong nhiều năm. Có lẽ "phiên bản" không phải là từ chính xác nhất mà tôi có thể đã chọn? –

+0

Phần lớn phần mềm DSP âm thanh cho Linux (và các nền tảng khác) sử dụng FFTW yêu cầu FFTW được xây dựng với hỗ trợ nổi và dành nhiều thời gian để xây dựng nội dung này từ nguồn, ít nhất tôi có thể nói rằng Debian có gói cho các bản dựng khác nhau tùy chọn của FFTW mà tất cả có thể được cài đặt đồng thời. Tôi hy vọng điều này sẽ xảy ra với hầu hết các bản phân phối Linux khác. –

22

Để có được power spectrum của một phần của tập tin của bạn:

  • thu thập N mẫu, trong đó N là một sức mạnh của 2 - nếu tỷ lệ mẫu của bạn là 44,1 kHz ví dụ và bạn muốn lấy mẫu xấp xỉ mỗi thứ hai sau đó đi cho biết N = 32768 mẫu.

  • áp dụng window function phù hợp với mẫu, ví dụ: Hanning

  • vượt qua các mẫu cửa sổ để một FFT thói quen - lý tưởng bạn muốn có một FFT thực-to-phức tạp nhưng nếu tất cả các bạn có một phức tạp-to-phức tạp FFT sau đó vượt qua 0 cho tất cả các phần đầu vào tưởng tượng

  • tính toán mức độ bình phương của thùng đầu ra FFT của bạn (tái * tái + im * im)

  • (không bắt buộc) tính 10 * log10 của mỗi cường độ vuông đầu ra bin để có được một giá trị cường độ trong dB

Bây giờ bạn có phổ công suất của mình, bạn chỉ cần xác định (các) đỉnh, điều này khá đơn giản nếu bạn có tỷ lệ S/N hợp lý. Lưu ý rằng độ phân giải tần số được cải thiện với lớn hơn N. Đối với ví dụ trên, tỷ lệ mẫu 44,1 kHz và N = 32768 độ phân giải tần số của mỗi thùng là 44100/32768 = 1,35 Hz.

+0

Lưu ý rằng chức năng cửa sổ 'Hanning' sẽ bôi nhọ đầu vào trên một số thùng; 1,35 Hz được đề xuất là khá lạc quan. [Như Wikipedia ghi chú] (http://en.wikipedia.org/wiki/Window_function#Comparison_of_windows), nó có thể trong thực tế có ý nghĩa không cửa sổ ở tất cả. – MSalters

+0

Cửa sổ Hann hoặc Hamming có xu hướng là các chức năng cửa sổ đa năng có ích nhất. Cả hai đều đưa ra một sự thỏa hiệp hợp lý trong đó độ lớn và tần số của một đỉnh sẽ khá đáng tin cậy (không giống như trường hợp không có cửa sổ) và đỉnh cũng sẽ có độ sắc nét hợp lý. Nếu bạn đang tìm kiếm để xác định các đỉnh riêng biệt mà rất gần nhau mặc dù sau đó có lẽ có sự lựa chọn tốt hơn cho chức năng cửa sổ. Sử dụng không có cửa sổ nào cả (tức là chức năng cửa sổ hình chữ nhật) thường chỉ có ý nghĩa nếu bạn nhìn vào các thành phần sắp xếp chính xác với tần số bin. –

2

Về cơ bản bạn quan tâm đến việc estimating a Spectrum -assuming bạn đã trải qua giai đoạn đọc WAV và chuyển đổi nó thành tín hiệu thời gian rời rạc.

Trong số các phương pháp khác nhau, cơ bản nhất là Biểu đồ định kỳ, số tiền cần thực hiện Chuyển đổi Fourier rời rạc có cửa sổ (với FFT) và giữ độ lớn bình phương của nó. Điều này tương ứng với câu trả lời của Phao-lô. Bạn cần một cửa sổ trải dài qua một vài giai đoạn của tần số thấp nhất mà bạn muốn phát hiện. Ví dụ: nếu sinusoids của bạn có thể thấp đến 10 Hz (khoảng thời gian = 100ms), bạn nên lấy một cửa sổ 200ms o 300ms hoặc hơn (hoặc nhiều hơn). Tuy nhiên, periodogram có một số disadvantages, mặc dù nó đơn giản để tính toán và đó là quá đủ nếu độ chính xác cao là không cần:

Các periodogram liệu không phải là một tốt ước tính quang phổ do phổ thiên vị và thực tế là phương sai ở tần số đã cho không giảm vì số lượng mẫu được sử dụng trong việc tăng tính toán .

Biểu đồ có thể hoạt động tốt hơn bằng cách lấy trung bình một số cửa sổ, với lựa chọn chiều rộng(). Và có rất nhiều phương pháp khác để ước tính phổ (mô hình AR).

Thực ra, bạn không thực sự quan tâm đến việc ước tính phổ đầy đủ, nhưng chỉ là vị trí của một tần số duy nhất. Điều này có thể được thực hiện tìm kiếm một đỉnh của một phổ ước tính (thực hiện như giải thích), nhưng cũng bởi cụ thể hơn và mạnh mẽ (và phức tạp) methods (Pisarenko, thuật toán MUSIC). Họ có lẽ sẽ là quá mức cần thiết trong trường hợp của bạn.

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