昨天,我完成了用于检测随时间显示的轨道的音频能量的代码,我最终将其用作我的音频缩略图项目的一部分。
然而,我还想要一种可以检测随时间显示的曲目音高的方法,因此我有两个选项作为我的研究基础。
[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 命令一样简单,但我得到的只是有关不平衡方程的错误。
非常感谢您的帮助,即使它只是正确方向的一般指示。谢谢。
确定音高是lot比仅仅应用 DFT 更复杂。它还取决于源的性质 - 例如,不同的算法适用于语音和乐器。如果这是一首音乐曲目,正如您的问题似乎暗示的那样,那么您可能不走运,因为没有明显的方法来确定一起演奏的多个乐器的单个音高值(您甚至如何定义pitch在这种情况下?)。也许您可以更具体地说明您想要做什么 - 也许功率谱比尝试确定任意音调更有用?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)