【问题标题】:Analyzing wav files in MATLAB在 MATLAB 中分析 wav 文件
【发布时间】:2013-06-13 04:23:41
【问题描述】:

所以我有这个钢琴录音(.wav 格式)。我可以对整个录音进行FFT 并识别频率。

但是,根据我阅读的一些文章,最好将 wav 文件分解为多个窗口,其中每个窗口都包含一个特定的注释。

为此,我需要首先绘制我的时域信号的“功率包络”(考虑到音符平均能量概念),因此每个音符都会有一个增加和一个减少,并且可以通过检查来确定音符开始局部最小值。

这是引入“窗口”的地方,每个窗口仅包含一个起始点,然后在每个窗口上执行FFT

我在绘制功率包络并将其分解为窗口时遇到了困难。希望对 Matlab 编码提供一些帮助。

我使用的代码非常简单:

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

%声音(波,fs); % 看看它听起来像什么 */

wave = wave.*hamming(length(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 长度的 2 次幂

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 文件的绝对值)与高斯滤波器卷积后,我尝试采用一阶和二阶导数,但是当我尝试绘制它时没有得到输出。

edges=fconv(abs(song),detect);

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

tedges=tedges/max(abs(tedges));

W= 差异(tedge);

Z= diff(W);

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

【问题讨论】:

  • 您能否发布代码以便我们知道您已经尝试过什么?
  • 我已经包含了代码

标签: matlab fft


【解决方案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

【讨论】:

  • 嗨,感谢代码。我不知道这是否听起来有点傻,但我在这里有一个疑问。我必须定义我的“window_length”对吗?假设“window_length”是两个音符开始之间的距离/时间段,我如何在我的代码中定义它,特别是当我不知道开始在随机 wav 文件中发生的确切时间段时?
  • 那么您可以在第一次通过时使用小窗口,使用您正在实施的任何算法找到一个起始点,然后使用那些?你知道你实际上在寻找什么来检测笔记吗?查看短期傅里叶变换:en.wikipedia.org/wiki/Short-time_Fourier_transformperiodogram 的 matlab 实现 - 它们是我上面发布的更深入/高级的版本。
  • 再次感谢您的快速回复。好吧,因为我在绘制功率包络时遇到了麻烦,所以我使用了高斯滤波器,通过快速卷积技术,我得到了时域包络。现在使用微分(diff)我想识别正负峰并将它们之间的时间用作窗口长度。关于如何编写此特定代码的任何帮助??
  • 当然可以,但这不是您在这里要问的。你想做什么?听起来你已经有了音符开始。为什么不直接循环并从note_onset(k):note_onset(k+1)-1 计算您的频谱?
  • 除了我提出的主要问题之外,我现在需要找到我的时域包络的最大峰值,以便我可以将最大峰值指定为音符的开头。正是在这一点上(寻找高峰),我遇到了麻烦。在我的信号(我的 wav 文件的绝对值)与高斯滤波器卷积后,我尝试采用一阶和二阶导数,但是当我尝试绘制它时没有得到输出。为了更清楚地理解,我在上面的问题中包含了我用于此的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 2012-01-13
  • 2012-05-24
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 2013-05-30
相关资源
最近更新 更多