本文是对鲍长春老师《基于归一化互相关函数的基音检测》的MATLAB复现。

  • 语音信号的产生模型和清浊音特性
    空气从肺部排除行成气流,气流激励升到从嘴唇或鼻孔或同时从嘴唇和鼻孔辐射出来而产生语音。当气流通过声门时,如果声带的张力刚好使声带张弛震荡,产生一股准周期的气流,这一气流激励声道就产生浊音语音。当气流通过声门时,声道的某处发生了收缩而产生一个狭窄的通道,当空气流到达此处时被迫以高速通过紧缩部分而在附近产生气流湍流,这种湍流通过声道便行成清音语音。
    浊音语音信号为周期冲击序列,其周期为。清音语音信号为白噪声序列,满足均值为0,方差为1的高斯分布。
    语音产生的“源-系统”模型(根据发声器官和语音产生过程):

    可实现的数字模型(激励源、声道模型和辐射模型):

  • 检测基音周期的基本原理
    基音是指发浊音时声带振动所引起的周期性,基音周期是声带振动频率的倒数。基音检测是语音处理中一个非常重要的问题,找到一个完善的适用于不同的讲话者、不同要求和环境、准确和可靠的基音检测的方法是语音处理领域最具挑战性的任务之一。目前,大多数基音检测方法都采用的是自相关法。
    对于浊音信号的互相关函数,在基音周期的整数倍位置上出现峰值,而清音的自相关函数没有明显的峰值出现;因此检测是否有峰值就可判断是清音或浊音,检测峰值的位置就可以提取基音周期值。

  • 程序框图

  • 读入语音信号
    已知语音数据文件是经8KHz采样频率采样的信号。

clear;clc;
fid=fopen('female.dat');
x1=fread(fid,16000,'short');
figure;plot(x1);title('读信号');
grid

采用fread函数以二进制数据读入数据。设定信号长度为16000,精度为16位整数型。语音信号图如下:

  • 语音信号分帧
    设20ms的语音信号为一帧,计算出帧长为160个样点,并设置帧移为160。用矩形窗作为分帧的窗函数。为方便后续计算,对分帧后的矩阵作转置,计算出帧数。
%分帧
wlen=8000*20*10.^(-3); inc=160;          % 给出帧长和帧移
win=boxcar(wlen);         % 给出矩形窗
N=length(x1);               % 信号长度
time=(0:N-1)/8000;           % 计算出信号的时间刻度
X=enframe(x1,win,inc);     % 分帧
X=X';
fn=size(X,2);              % 求出帧数
  • 去均值
    当语音信号在分析窗里有非零均值或有非常低的低频噪声出现时,归一化自相关函数在所要求的所有延迟上均产生高的相关,这不利于计算依赖归一化自相关函数进行清浊分类的安静段语音或低频幅度清音语音段。为此,在计算归一化自相关函数时首先要从分析窗数据中减掉均值。利用mean函数可以计算矩阵特定区域的均值。
%去均值
for p=1:89ave=mean(X(:,p));X(:,p)=X(:,p)-ave;for o=1:160XX((p-1)*160+o)=X(o,p);end
end
figure;plot(1:14240,XX,'k'); axis([5000 5400 ,-inf,inf]);xlabel('时间(s)');ylabel('时间波形');title('展开信号');
hold on;
  • 800Hz低通滤波
    为减少高频共振峰和外来高频噪声的影响,对去均值的语音信号进行800Hz低通滤波,以去掉大部分共振峰的影响,又可以当基音频率为最高500Hz时,仍能保持其一二次谐波。依据双线性变换法设计的800Hz5阶椭圆低通滤波器传递函数为:

    默认512点插值,b1和a1为系统传递函数分子和分母的系数向量。构成滤波器并对去均值后的信号矩阵X进行滤波,生成矩阵sf_1。
b1=[0.008233 -0.004879 0.007632 -0.004879 0.008233];
a1=[1 -3.6868 5.8926 -5.0085 2.2518 -0.4271];
[H,w]=freqz(b1,a1,512);
for r=1:89sf_1(:,r)=filter(b1,a1,X(:,r));
end
plot(1:14240,sf,'b');xlabel('时间(s)');ylabel('幅值');title('椭圆滤波');axis([5000 5400 ,-inf,inf]) %改变横轴范围
hold on;
  • 数值滤波
    经800Hz低通滤波的语音信号,主要去除了第三和第四个高频共振峰及高频噪声的影响,但第一和第二个共振峰有时仍然存在,是的浊音段语音信号的周期性模糊,产生了错误的基音估计。实验发现,若在800Hz低通滤波器之后级联一个宽度N=9的数值滤波器可有效去除这一影响,突出了浊音语音信号的周期性,使基音估计可靠。数值滤波器的传递函数为:

    默认512点插值,b2和a2为系统传递函数分子和分母的系数向量。构成滤波器并对去均值后的信号矩阵sf_1进行滤波,生成矩阵sf_2。下图分别为语音信号预处理图:
b2=[1 1 1 1 1 1 1 1 1];
a2=[9 0 0 0 0 0 0 0 0];
[H,w]=freqz(b2,a2,512);
for r=1:89sf_2(:,r)=filter(b2,a2,sf_1(:,r));
end
plot(1:14240,sf,'r');xlabel('时间(s)');ylabel('幅值');title('数值滤波');axis([5000 5400 ,-inf,inf]) %改变横轴范围
legend('去均值','低通滤波','数值滤波');
  • 计算语音信号短时平均能量ELP
    语音信号短时平均能量由以下等式求得:

由于
是一个极小值,因此在此程序里任取为0.0000000001。在此给出各帧短时平均能量ELP计算代码和结果图:

for i=1 : fnfor z=2:wlenS_LPN(1,1)=sf(1,(1+(i-1)*inc))*sf(1,(1+(i-1)*inc)); S_LPN(1,z)=S_LPN(1,(z-1))+sf(1,(z+(i-1)*inc))*sf(1,(z+(i-1)*inc));endEn(i)=10*log10(S_LPN(1,160)/160+0.0000000001);
end
  • 计算归一化互相关函数NCCF、后处理、清浊判决、基音周期的确定和输出
  • 互相关函数NCCF
    令语音信号表示为s(n),定义波形相关测度为:

    这里ρ(τ)称为归一化互相关函数,并作为基音检测的依据。
  • 后处理

为了避免选择实际基音的倍数作为估计值,可采用如下后处理措施。

在三个基音区域内计算ρ(τ),分别得到各自区域的最大值及对应的延迟,记为ρmax1,ρmax2,ρmax3和T1,T2,T3。三个区域分别为:
区域1:80 ~ 147
区域2:40 ~ 79
区域3:20 ~ 39
按如下方法确定最优基音延迟Topt
Topt = T1
ρmax = ρmax1
if ρmax2 ≥ cρmax
ρmax = ρmax2
Topt = T2
if ρmax3 ≥ cρmax
ρmax = ρmax3
Topt = T3
end
end
c为经验因子,经过测试,发现男性取值为0.92,女性取值为0.94时比较合适。

  • 清浊判决
    利用前面定义的归一化互相关函数可进行有效的清浊判决。
    第一步,确定低通数值滤波后的语音对数能量ELP(dB):

    第二步,确定周期性水平量Zperiod,设前三个峰的平均值:

    则周期性水平量Zperiod定义为:

    第三步,取ELP和Zperiod作为清浊判决。当ELP≤Eth时,语音能量太小直接判决为清音。当ELP>Eth但Zperiod≤Zth时,说明周期性不强判决为清音。如果ELP>Eth,Zperiod>Zth且Topt在允许的基频范围内,判为浊音,并输出对应的最优化基音延迟Topt。通过实验测试,取男性Eth=32.62dB,女性Eth=55.5dB,男性Zth=0.79,女性Zth=0.62时能正确分别清浊音。
  • 基音周期的确定和输出
for m=2: fn
%取一帧 if En(1,m)>32.62for tao=20:39        %对于不同的延迟taorxx3(1,1)=sf(1+(m-1)*inc)*sf(1-tao+(m-1)*inc);s_n(1,1)=sf(1+(m-1)*inc)*sf(1+(m-1)*inc);s_n_tao3(1,1)=sf(1-tao+(m-1)*inc)*sf(1-tao+(m-1)*inc);for j=2:wlen   %分别计算分子和分母rxx3(1,j)=rxx3(j-1)+sf(j+(m-1)*inc)*sf(j-tao+(m-1)*inc);  %分子s_n(1,j)=s_n(j-1)+sf(j+(m-1)*inc)*sf(j+(m-1)*inc);s_n_tao3(1,j)=s_n_tao3(j-1)+sf(j-tao+(m-1)*inc)*sf(j-tao+(m-1)*inc);endRxx3(1,tao-19)=rxx3(1,160)/((s_n(1,160)*s_n_tao3(1,160))^0.5);end[Rxx_tao_max3,index3]=max(Rxx3);  %最大互相关函数峰值=Rxx_tao-max、延迟tao=indexfor tao=40:79        %对于不同的延迟taorxx2(1,1)=sf(1+(m-1)*inc)*sf(1-tao+(m-1)*inc);s_n_tao2(1,1)=sf(1-tao+(m-1)*inc)*sf(1-tao+(m-1)*inc);for j=2:wlen   %分别计算分子和分母           rxx2(j)=rxx2(j-1)+sf(j+(m-1)*inc)*sf(j-tao+(m-1)*inc);  %分子s_n_tao2(j)=s_n_tao2(j-1)+sf(j-tao+(m-1)*inc)*sf(j-tao+(m-1)*inc);endRxx2(tao-39)=rxx2(160)/((s_n(160)*s_n_tao2(160))^0.5);       end[Rxx_tao_max2,index2]=max(Rxx2);  %最大互相关函数峰值=Rxx_tao-max、延迟tao=indexfor tao=80:147        %对于不同的延迟taorxx1(1,1)=sf(1+(m-1)*inc)*sf(1-tao+(m-1)*inc);s_n_tao1(1,1)=sf(1-tao+(m-1)*inc)*sf(1-tao+(m-1)*inc);for j=2:wlen   %分别计算分子和分母rxx1(j)=rxx1(j-1)+sf(j+(m-1)*inc)*sf(j-tao+(m-1)*inc);  %分子s_n_tao1(j)=s_n_tao1(j-1)+sf(j-tao+(m-1)*inc)*sf(j-tao+(m-1)*inc);endRxx1(tao-79)=rxx1(160)/((s_n(160)*s_n_tao1(160))^0.5);       end[Rxx_tao_max1,index1]=max(Rxx1); %最大互相关函数峰值=Rxx_tao-max、延迟tao=index%最优基因延迟ToptRxx_tao_max=Rxx_tao_max1;Topt=index1+79;c=0.92;if (Rxx_tao_max2>=c*Rxx_tao_max)Rxx_tao_max=Rxx_tao_max2;Topt=index2+39;endif (Rxx_tao_max3>=c*Rxx_tao_max)Rxx_tao_max=Rxx_tao_max3;Topt=index3+19;endP_max(1,m)=Rxx_tao_max;%清浊判决P_avr=(Rxx_tao_max1+Rxx_tao_max2+Rxx_tao_max3)/3;     %前三个峰的平均值Z_period=Rxx_tao_max+P_avr;       %周期性水平量if (Z_period>0.79) %Topt在允许的基频范围内Topt_tao(1,m)=Topt;elseTopt_tao(1,m)=0;endelse Topt_tao(1,m)=0;end
end
figure;plot(1:97,Topt_tao)     % 画出基音周期
title('基音周期');ylabel('基音周期值'); xlabel('帧数');
axis([0 100,0 120]) %改变横轴范围
hold on;

基于归一化互相关函数的语音基音周期检测相关推荐

  1. 基音周期检测acf算法及matlab仿真,基音周期检测算法研究及在语音合成中的应用...

    摘要: 语音信号的基音周期是描述激励源的重要特征参数之一,准确的检测语音信号的基音周期对高质量的语音分析与合成,语音压缩编码,语音识别等都具有重要意义.本文讨论了几种常用的基音周期检测方法以及小波变换 ...

  2. python自相关函数提取基音周期_Python语音基础操作--4.2基音周期检测

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  3. 倒谱基音周期matlab,Matlab基于倒谱和EMD的语音基音周期的提取.doc

    Matlab基于倒谱和EMD的语音基音周期的提取 Matlab基于倒谱和EMD的语音基音周期的提取 在语音信号处理中,常用的语音特性是基于Mel频率的倒谱系数(MFCC)以及一些语音信号的固有特征,如 ...

  4. 基音周期 检测 matlab,语音信号基音周期检测的matlab程序

    <语音信号基音周期检测的matlab程序>由会员分享,可在线阅读,更多相关<语音信号基音周期检测的matlab程序(2页珍藏版)>请在人人文库网上搜索. 1.function ...

  5. 倒谱法的基因周期检测matlab,Matlab在基音周期检测教学中的应用研究

    朱徐来 摘要:基音周期是<语音信号处理>中的重点和难点,基音周期作为语音信号的重要参数,在语音编码.语音合成和语音识别等方面,有着非常重要的作用.本文采用Matlab对基因周期进行仿真分析 ...

  6. 倒谱法的基因周期检测matlab,两种基音周期检测方法

    很好很强大@! 基音周期中两种算法 常用的基音周期检测方法-自相关函数法.倒谱法.平均幅度差函数法都属于非基于事件基音检测方法,都先将语音信号分为长度一定的语音帧,然后对每一帧语音求平均基音周期,它们 ...

  7. 【语音分析】短时自相关基音周期检测+LPC预测增益计算【含Matlab源码 1517期】

    ⛄一.案例简介 1 实验要求 1.录一段声音,内容为"间隔读出数字0-4",转为单声道.8khz.wav格式: 2.每帧帧长20ms160个样点,使用汉明窗hamming加窗: 3 ...

  8. 【数字语音处理】Part3 语音信号的短时时域分析:短时平均、短时自相关、语音端点检测、基音周期估值

    Part3 语音信号的短时时域分析 一.帧和加窗的概念 二.短时平均能量 三.短时平均幅度函数 四.短时平均过零率 五.短时自相关分析 六.基于能量和过零率的语音端点检测 七.基音周期估值 八.总结 ...

  9. 语音信号处理之(二)基音周期估计(Pitch Detection)

    语音信号处理之(二)基音周期估计(Pitch Detection) zouxy09@qq.com http://blog.csdn.net/zouxy09 这学期有<语音信号处理>这门课, ...

最新文章

  1. 交换机短路_弱电工程中最常用的网络设备,网络交换机的种类有哪些
  2. POJ1915 BFS双向BFS
  3. SpringCloud 应用在 Kubernetes 上的最佳实践 —— 高可用(容量评估)
  4. 数据结构pta选择判断复习
  5. Mysql8秒级加字段_MySQL8.0大表秒加字段,是真的吗?
  6. main函数之前的事(略)
  7. 24. flock() 函数
  8. java arraylist对象_Java中ArrayList的对象引用问题
  9. MySQL Audit 审计
  10. 天嵌TQ_E9卡片电脑移植飞思卡尔yocto L4.1.15_1.0.0_ga 第四篇 新版kernel(L4.1.15-r)移植
  11. 分享一款好用的ssh工具
  12. 数理统计之 置信区间(置信度)
  13. VeryCD上的EIOffice 2009简介
  14. html点击链接直接加微信群,微信给文字加链接代码分享(原来微信超链接是这样加的)...
  15. python 框架 scrapy_python之框架篇(scrapy)
  16. BugKu社工-进阶收集
  17. 真实生活的记录:我三年的外企生涯(2) 出处:天涯虚拟社区
  18. 遗传算法的交叉算子:部分匹配交叉(PMX)、有序交叉(OX)、循环交叉(CX)、两点交叉等讲解
  19. 嵌入式C语言自我修养:从芯片、编译器到操作系统(附送书籍)
  20. IDEA配置Struts2框架搭建

热门文章

  1. 自媒体剪辑视频都在用的6个音效素材网站。
  2. 基于控制台的五子棋小游戏(简易)
  3. unity标准材质,emission的设置
  4. 完整的系统帮助类Utils
  5. 陈 好 性 感 写 真 ,难得一见哦[贴图]
  6. 七夕了,给你的那个TA画上一箭倾心吧~
  7. R(A+B)<=R(A)+R(B): R(AB)<=min(R(A)+R(B)): A为m×n矩阵,r(A)=n,则AX=0只有零解。设矩阵A为m×n的秩R(A)=m;Ax=b 有解;
  8. javaweb环境搭建—— 误删mysql服务(sc delete mysql)
  9. IEEE trans模板格式中的分栏及左下角作者信息脚注的添加方法(Word 2010)
  10. ABP文档 - Web Api 控制器