【发布时间】: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