Search code examples
matlabaudiofftwavpcm

Frequency : Decibel plot using FFT in MATLAB


I am trying to use MATLAB to import a WAV file and create the type of diagram shown below. I am basically trying to pull frequency information and plot it according to decibels. Here is the code I am working with, but it doesn't seem to pull the frequency information correctly:

[x fs]=wavread('filename.wav');
dt=1/fs;%% time interval

X=fft(x);
df=1/(length(x)*dt); %% frequency interval
f=(1:length(X))*df;%% frequency vector

%% frequency domain plot, freq in hertz
figure
plot(f,abs(X))

Frequency:Decibel Diagram

Please help! Thank you!


Solution

  • In your code "X" contains the waveform information, not the frequency information. To get the frequency information of the soundfile you could use the FFT function. I use this (more elaborate, but still simple) code for what you want to do:

    [FileName,PathName]=uigetfile('*.wav');
    [y, Fs, nbits] = wavread(fullfile(PathName,FileName));
    length_y=length(y);
    
    NFFT = 2^nextpow2(length_y); % Next power of 2 from length of y
    fft_y=fft(y,NFFT)/length_y;
    f = Fs/2*linspace(0,1,NFFT/2+1);
    
    semilogy(f,abs(fft_y(1:length(f))));
    title('Single-Sided Amplitude Spectrum of y(t)')
    xlabel('Frequency (Hz)')
    ylabel('|Y(f)|')
    

    I hope this is useful to you. The plot will not be in steps like the one you have shown, but that can also be achieved - using the "stairs" plot function.