【问题标题】:Calculating audio pitch in MATLAB?在 MATLAB 中计算音频音高?
【发布时间】:2010-08-05 15:38:53
【问题描述】:

昨天我完成了用于检测随时间显示的曲目的音频能量的代码,我最终将把它用作我的音频缩略图项目的一部分。

但是,我还想要一种可以检测随时间显示的曲目音高的方法,因此我有 2 个选项可以作为我研究的基础。

[y, fs, nb] = wavread('Three.wav');                  %# Load the signal into variable y

frameWidth = 441;                                    %# 10 msec
numSamples = length(y);                              %# Number of samples in y
numFrames = floor(numSamples/frameWidth);            %# Number of full frames in y
energy = zeros(1,numFrames);                         %# Initialize energy

for frame = 1:numFrames                              %# Loop over frames
  startSample = (frame-1)*frameWidth+1;              %# Starting index of frame
  endSample = startSample+frameWidth-1;              %# Ending index of frame
  energy(frame) = sum(y(startSample:endSample).^2);  %# Calculate frame energy
end

这是能量法的正确代码,经过研究,我发现我需要使用离散时间傅里叶变换来找到循环中每一帧的当前音高。

我认为该过程就像修改代码的最后几行以包含用于计算离散傅里叶变换的“fft”MATLAB 命令一样简单,但我得到的只是关于不平衡方程的错误。

我们将不胜感激,即使它只是一个正确方向的一般指针。谢谢。

【问题讨论】:

  • 您可能需要附上确切的错误消息,以便我们了解如何解决您的问题。 abs(fft(y(startSample:endSample))) 在我看来是一种有效的方法,不应导致“不平衡方程”。

标签: matlab estimation waveform pitch fft


【解决方案1】:

确定音高很多比仅仅应用 DFT 更复杂。它还取决于源的性质——例如,不同的算法适用于语音和乐器。如果这是一个音乐曲目,正如您的问题所暗示的那样,那么您可能不走运,因为没有明显的方法可以确定一起演奏的多个乐器的单个音高值(您甚至如何定义 pitch 在这种情况下?)。也许您可以更具体地说明您要做什么 - 也许功率谱比尝试确定任意音高更有用?

【讨论】:

  • 我正在寻找可以用来从流行歌曲中提取音频特征的方法。理想情况下,我需要有形数据,可用于开发合唱检测算法。
  • 好吧——好吧,你有相当大的研发任务摆在你面前——你可能需要将时域数据转换为频域,然后进行某种特征提取以获取歌曲进入某种特征空间。有这方面的专有算法,但据我所知,公共领域没有。
  • 在这种情况下定义“音高”的一种方法是计算光谱质心。
  • ...在评论问题之前,我真的需要阅读问题的日期! :D
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
相关资源
最近更新 更多