2010-08-05 87 views
1

昨天我完成了用于检测随时间显示的音轨的音频能量的代码,我最终将其用作我的音频缩略图项目的一部分。在MATLAB中计算音频音调?

但是我还想要一种能够检测出随时间显示的曲目的音高的方法,所以我有两个选项可供我的研究使用。

[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命令,但是我所得到的结果都是关于不平衡方程的错误。

帮助将是非常赞赏,即使它只是一个正确的方向一般指针。谢谢。

+0

您可能希望附上确切的错误消息,以便我们了解如何解决您的问题。 abs(fft(y(startSample:endSample)))对我来说是一种有效的方法,不应该导致“不平衡的方程式”。 – YYC 2010-08-05 16:49:14

回答

1

确定间距是lot比仅应用DFT更复杂。它还取决于来源的性质 - 例如,不同的算法适用于演讲与乐器。如果这是一首音乐曲目,正如你的问题似乎暗示的那样,那么你很可能不太好运,因为没有明确的方式来确定多个乐器一起演奏的单个音高值(你甚至可以定义音高这个上下文?)。也许你可以更具体地说明你正在尝试做什么 - 也许功率谱比确定任意音调更有用?

+0

我正在寻找可用于从流行歌曲中提取音频功能的方法。理想情况下,我需要可用于开发合唱检测算法的有形数据。 – Velocity 2010-08-05 16:45:18

+0

好的 - 你有很大的R&D任务在你面前 - 你可能需要将时域数据转换到频域,然后做一些特征提取,以获得歌曲的重要特征到某种特征空间。就我所知,这里有专有算法,但在公有领域没有任何算法。 – 2010-08-05 17:53:07

+0

在这种情况下定义“音高”的一种方法是计算频谱质心。 – FakeDIY 2013-03-14 16:02:01