在MATLAB中分析wav文件

时间:2013-06-17 08:53:30

标签: matlab fft

所以我有这个钢琴录音(.wav格式)。我能够在整个录音中做FFT并识别频率。

然而,根据我读过的一些文章,如果将wav文件分解为窗口,其中每个窗口将包含一个特定注释,则最佳。

为此,我需要首先绘制我的时域信号的“功率包络”(考虑音符平均能量概念),因此每个音符将有一个增加和一个减少,音符开始可以通过检查当地最低点。

这是引入“窗口”的地方,其中每个窗口只包含一个开始,然后在每个窗口上执行FFT

我很难绘制功率范围并将其分解为窗口。非常感谢Matlab编码的一些帮助。

我使用的代码非常简单:

  

[wave,fs] = wavread('c scale fast.wav'); %将文件读入内存* /

     

%声音(波,FS); %看到它听起来像* /

     

wave = wave。*汉明(长度(波));

     

t = 0:1 / fs :(长度(波)-1)/ fs; %并获得采样频率* /

     

图(2);

      subplot(2,1,1);
      plot(t,wave);
      title('Wave File');
      ylabel('Amplitude');
      xlabel('Length (in seconds)');
     

L =长度(波浪);

     

NFFT = 2 ^ nextpow2(L); %y的长度的下一次幂

     

Y = fft(波,NFFT)/ L;

     

f = fs / 2 * linspace(0,1,NFFT / 2 + 1);

     

%绘制单面振幅谱。

   subplot(2,1,2);
   plot(f,2*abs(Y(1:NFFT/2+1))) 
   title('Single-Sided Amplitude Spectrum of y(t)')
   xlabel('Frequency (Hz)')
   ylabel('|Y(f)|')

在我的信号(我的wav文件的绝对值)与高斯滤波器卷积后,我尝试采用第一和第二导数,但是当我尝试绘制它时我没有得到输出。

  

边缘= fconv(ABS(歌曲),检测);

     

tedges =边缘(P / 2:N + P / 2-1);

     

tedges = tedges / MAX(ABS(tedges));

     

W = diff(tedge);

     

Z = diff(W);

当我尝试绘制W和Z时,我得不到我需要的输出。换句话说,我的图表是空的。我无法弄清楚我在这里做错了什么......

1 个答案:

答案 0 :(得分:1)

有用:http://blogs.mathworks.com/videos/2009/12/31/basics-finding-a-subset-of-a-matrix/

基本流程:

for v=1:window_length:length(data)
    data_subsection=data(v:v+window_length);
    subsection_fft = fft(data_subsection);
    plot(...);
end