谐波积谱的MATLAB程序

谐波积谱的MATLAB程序,matlab,audio,signal-processing,pitch,pitch-tracking,Matlab,Audio,Signal Processing,Pitch,Pitch Tracking,有人能告诉我如何使用MATLAB实现谐波积谱,从而在存在谐波的情况下找到音符的基频吗??我知道我应该对信号进行多次下采样(当然是在执行fft之后),然后将它们与原始信号相乘 假设我的fft信号是“FFT1” 那么代码大致如下 hps1 = downsample(FFT1,2); hps2 = downsample(FFT1,3); hps = FFT1.*hps1.*hps2; 这个代码正确吗???我想知道我是否正确地进行了下采样,因为每个变量都有不同的长度乘以它们会导致矩阵维数错误。。我真

有人能告诉我如何使用MATLAB实现谐波积谱,从而在存在谐波的情况下找到音符的基频吗??我知道我应该对信号进行多次下采样(当然是在执行fft之后),然后将它们与原始信号相乘

假设我的fft信号是“FFT1”

那么代码大致如下

hps1 = downsample(FFT1,2);
hps2 = downsample(FFT1,3);

hps = FFT1.*hps1.*hps2;
这个代码正确吗???我想知道我是否正确地进行了下采样,因为每个变量都有不同的长度乘以它们会导致矩阵维数错误。。我真的需要一些真正的快速帮助,因为它的项目工作。。。真的很绝望。。。。 Thanx提前…

好的,您不能执行
“hps=FFT1.*hps1.*hps2;”
对于每个下采样数据,您是否有不同的大小

我给你们举了一个例子,如何使用5次谐波抽取(下采样)生成一个非常简单的谐波积谱(HPS),我只是在正弦信号中进行测试,我在测试中得到了非常接近基频的频率

这段代码只显示了如何计算算法的主要步骤,很可能您需要改进它

资料来源:

%[x,fs] = wavread('ederwander_IN_250Hz.wav');

CorrectFactor = 0.986;
threshold = 0.2;

%F0 start test
f  = 250;
fs = 44100;

signal= 0.9*sin(2*pi*f/fs*(0:9999)); 
x=signal';

framed = x(1:4096);

windowed = framed .* hann(length(framed));

FFT = fft(windowed, 4096);

FFT = FFT(1 : size(FFT,1) / 2);

FFT = abs(FFT);

hps1 = downsample(FFT,1);
hps2 = downsample(FFT,2);
hps3 = downsample(FFT,3);
hps4 = downsample(FFT,4);
hps5 = downsample(FFT,5);

y = [];

for i=1:length(hps5)

      Product =   hps1(i)  * hps2(i) * hps3(i) * hps4(i) * hps5(i);
      y(i) = [Product];
end

[m,n]=findpeaks(y, 'SORTSTR', 'descend');

Maximum = n(1);

 %try fix octave error
if (y(n(1)) * 0.5) > (y(n(2))) %& ( ( m(2) / m(1) ) > threshold )

    Maximum  = n(length(n));

end

F0 =  ( (Maximum / 4096) * fs ) * CorrectFactor 

plot(y)

HPS通常会生成一个错误,将音高向上显示一个八度,我对代码做了一些更改,请参见上文:-)

不清楚您在问什么。你应该更具体我想在执行STFT后对音频信号进行谐波积频谱分析,以便在存在谐波时获得正确的基频。我不熟悉HPS,所以我需要一些帮助来编写一个MATLAB代码来实现它…非常感谢。。不过我还是有点怀疑。我认为最初的FFT数据是由2,3等进行下采样的。。但是,在代码中使用
hps3=downsample(hps2,3)对已经下采样的信号进行下采样。。有点困惑。。。你为什么要用“校正因子”?看看这里,你可以在这张图片中看到,abs(FFT)以/1、/2、/3、/N的方式进行了下采样,是的,我刚刚在已经下采样的位置测试了下采样,但是你可以用FFT来做,校正因子只是为了增加正弦测试的结果。谢谢。。我两方面都试试看。。顺便问一下,你是如何得出正确的因子值的??有没有一个数学程序可以遵循??如果我没有使用校正因子,算法还会工作吗?您好,请修改一下上面的代码,校正因子我只通过观察测量,是的,这项工作没有校正因子,您怎么说,我只测试了正弦信号,我相信您需要改进一些东西,我昨天刚刚完成了以下几篇论文:-)谢谢。但遗憾的是,即使你做出了更正,我也觉得不太合适:(