谐波积谱的MATLAB程序
有人能告诉我如何使用MATLAB实现谐波积谱,从而在存在谐波的情况下找到音符的基频吗??我知道我应该对信号进行多次下采样(当然是在执行fft之后),然后将它们与原始信号相乘 假设我的fft信号是“FFT1” 那么代码大致如下谐波积谱的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; 这个代码正确吗???我想知道我是否正确地进行了下采样,因为每个变量都有不同的长度乘以它们会导致矩阵维数错误。。我真
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来做,校正因子只是为了增加正弦测试的结果。谢谢。。我两方面都试试看。。顺便问一下,你是如何得出正确的因子值的??有没有一个数学程序可以遵循??如果我没有使用校正因子,算法还会工作吗?您好,请修改一下上面的代码,校正因子我只通过观察测量,是的,这项工作没有校正因子,您怎么说,我只测试了正弦信号,我相信您需要改进一些东西,我昨天刚刚完成了以下几篇论文:-)谢谢。但遗憾的是,即使你做出了更正,我也觉得不太合适:(