首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谐波乘积谱的MATLAB程序

谐波乘积谱的MATLAB程序
EN

Stack Overflow用户
提问于 2013-11-04 10:10:35
回答 1查看 7K关注 0票数 1

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

说我的fft信号是"FFT1“

那么代码将大致类似于

代码语言:javascript
复制
hps1 = downsample(FFT1,2);
hps2 = downsample(FFT1,3);

hps = FFT1.*hps1.*hps2;

这个代码正确吗?我想知道我是否有适当的下采样,因为每个变量有一个不同的长度乘以它们会导致矩阵尺寸误差。我真的需要一些非常快的帮助作为一个项目的工作..。真的很绝望..。提前谢谢..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-04 14:54:22

好的,你不能对每一个下采样的数据做"hps = FFT1.*hps1.*hps2;",你有不同的大小.

我为你们做了一个例子,如何用5次谐波抽取(下采样)来制作一个非常简单的谐波乘积谱(HPS),我只是在正弦信号中测试,在我的测试中得到了非常接近基频的频率。

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

来源:

代码语言:javascript
复制
%[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通常会产生一个错误,显示一个八度的音高,我改变了一点代码,参见上面的:-)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19765486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档