使用自相关算法从语音信号中估计音高

Posted

技术标签:

【中文标题】使用自相关算法从语音信号中估计音高【英文标题】:Estimation of Pitch from Speech Signals Using Autocorrelation Algorithm 【发布时间】:2018-01-05 06:42:39 【问题描述】:

我想使用自相关算法检测语音信号的音高频率。我有一个 MATLAB 代码,但结果是错误的。如果您能解决我的代码中的错误,我将不胜感激。

[y,Fs]=audioread('Sample1.wav'); 
y=y(:,1);
auto_corr_y=xcorr(y); 
subplot(2,1,1);plot(y) 
subplot(2,1,2);plot(auto_corr_y)
[pks,locs] = findpeaks(auto_corr_y);
[mm,peak1_ind]=max(pks);
period=locs(peak1_ind+1)-locs(peak1_ind);
pitch_Hz=Fs/period

感谢您在这件事上的帮助。

【问题讨论】:

为什么结果有误?你得到了什么?你期待什么? 我想检测说话者声音的音高。但它的结果超出了人类的频率限制。 findpeaks 可能发现了太多的峰。你绘制了它找到的峰吗?它们看起来正确吗? hold on; plot(locs,pks,'o'). 我曾经写过一篇关于这个主题的小论文。需要进行许多预处理和后处理才能使用自相关方法获得更高的准确性。当信号中有多个音调时,它也会失败。您可以在这里浏览源和论文:shafq.at/papers/pda_paper_ayan.pdf 【参考方案1】:

看来,您的代码不起作用,因为 Sample1.wav 必须只包含发声记录的短准周期部分。另请注意,音调频率不是随时间恒定的,因此您的估算必须考虑到这一点。

如果您只想估计频率,您可以从语音填充系统中获取 RAPT 方法(请参阅 Windows 的 sfs_rapt.m 包装器)。

【讨论】:

以上是关于使用自相关算法从语音信号中估计音高的主要内容,如果未能解决你的问题,请参考以下文章

短时幅度谱短时幅度谱估计在语音增强方面的MATLAB仿真

语音信号处理1---基本概念

WebRTC回声消除

语音信号语谱图相关

语音信号语谱图相关

MATLAB教程案例40语音信号的共振峰频率倒谱法估计matlab仿真学习