2012-07-03 28 views
6

Tôi tự hỏi nếu tôi đang sử dụng Fourier Transformation trong MATLAB đúng cách. Tôi muốn có tất cả các biên độ trung bình cho các tần số trong một bài hát. Với mục đích thử nghiệm, tôi đang sử dụng a free mp3 download of Beethovens "For Elise" mà tôi đã chuyển đổi thành tệp sóng đơn sóng 8 kHz sử dụng Audacity.Tôi có đang sử dụng phép biến đổi Fourier đúng không?

mã MATLAB của tôi là như sau:

clear all % be careful 

% load file 
% Für Elise Recording by Valentina Lisitsa 
% from http://www.forelise.com/recordings/valentina_lisitsa 
% Converted to 8 kHz mono using Audacity 
allSamples = wavread('fur_elise_valentina_lisitsa_8khz_mono.wav'); 


% apply windowing function 
w = hanning(length(allSamples)); 
allSamples = allSamples.*w; 


% FFT needs input of length 2^x 
NFFT = 2^nextpow2(length(allSamples)) 


% Apply FFT 
fftBuckets=fft(allSamples, NFFT); 
fftBuckets=fftBuckets(1:(NFFT/2+1)); % because of symetric/mirrored values 


% calculate single side amplitude spectrum, 
% normalize by dividing by NFFT to get the 
% popular way of displaying amplitudes 
% in a range of 0 to 1 
fftBuckets = (2*abs(fftBuckets))/NFFT; 

% plot it: max possible frequency is 4000, because sampling rate of input 
% is 8000 Hz 
x = linspace(1,4000,length(fftBuckets)); 
bar(x,fftBuckets); 

Kết quả sau đó trông như thế này: enter image description here

  1. ai đó có thể vui lòng cho tôi biết nếu mã của tôi là chính xác? Tôi đặc biệt thắc mắc về các đỉnh xung quanh 0.
  2. Để bình thường hóa, tôi có phải chia cho NFFT hoặc length(allSamples) không?
  3. Đối với tôi điều này không thực sự trông giống như một biểu đồ thanh, nhưng tôi đoán điều này là do nhiều giá trị tôi âm mưu?

Cảm ơn mọi gợi ý!

+1

Bạn đã xem trang này chưa: Sử dụng FFT để lấy các ô phân tích phổ đơn giản] (http://www.mathworks.com/support/tech-notes/1700/1702.html). Nó có một ví dụ với nhiều lời giải thích – Amro

Trả lời

6
  1. Phụ thuộc vào định nghĩa của bạn về "đúng". Điều này đang làm những gì bạn dự định, tôi nghĩ, nhưng nó có thể không phải là rất hữu ích. Thay vào đó, tôi khuyên bạn nên sử dụng 2D spectrogram vì bạn sẽ nhận được thông tin về nội dung tần suất theo thời gian.

  2. Không có cách nào chính xác để chuẩn hóa đầu ra FFT; có nhiều quy ước khác nhau (xem ví dụ: thảo luận here). Nhận xét trong mã của bạn nói rằng bạn muốn một phạm vi từ 0 đến 1; nếu giá trị đầu vào của bạn nằm trong khoảng từ 1 đến 1, thì chia cho số lượng thùng sẽ đạt được điều đó.

  3. Vâng, chính xác!

Tôi cũng muốn giới thiệu âm mưu trục y trên thang điểm từ logarit (trong decibels), vì đó là khoảng bao tai con người giải thích ầm ĩ.

2

Hai điều đó nhảy ra nhìn tôi:

  1. Tôi không chắc chắn lý do tại sao bạn đang bao gồm (index = 1) thành phần DC trong cốt truyện của bạn. Không phải là một vấn đề lớn, nhưng tất nhiên là bin không chứa dữ liệu tần số
  2. Tôi nghĩ rằng việc chia cho length(allSamples) có nhiều khả năng chính xác hơn chia cho NFFT. Lý do là nếu bạn muốn thành phần DC bằng với giá trị trung bình của dữ liệu đầu vào, chia cho length(allSamples) là điều đúng đắn cần làm.

Tuy nhiên, như Oli đã nói, bạn thực sự không thể nói chuẩn hóa "chính xác" là gì cho đến khi bạn biết chính xác những gì bạn đang cố gắng tính toán. Tôi có xu hướng sử dụng FFTs để ước tính phổ điện, vì vậy tôi muốn các đơn vị như "DAC/rt-Hz", mà sẽ dẫn đến một bình thường khác hơn nếu bạn muốn một cái gì đó như "DAC/Hz". Cuối cùng, không có thay thế cho suy nghĩ về chính xác những gì bạn muốn có được ra khỏi FFT (bao gồm cả đơn vị), và làm việc cho chính mình những gì bình thường chính xác nên được (bắt đầu từ định nghĩa của FFT nếu cần thiết)..

Bạn cũng nên lưu ý rằng fft của MATLAB không yêu cầu sử dụng độ dài mảng là sức mạnh của 2 (mặc dù làm như vậy có thể dẫn đến FFT chạy nhanh hơn). Bởi vì không đệm sẽ giới thiệu một số chuông, bạn cần phải suy nghĩ về việc đó là điều phải làm cho ứng dụng của bạn.

Cuối cùng, nếu định kỳ/phổ công suất thực sự là những gì bạn muốn, MATLAB cung cấp các chức năng như periodogram, pwelch và các tính năng khác có thể hữu ích.

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