1、引言

人在发浊音时,气流通过声门使声带产生张弛振荡式振动,产生一股准周期脉冲气流,这一气流激励声道就产生浊音,又称有声语音,它携带着语音中的大部分能量。这种声带振动的频率称为基频,相应的周期就称为基音周期( Pitch) ,它由声带逐渐开启到面积最大(约占基音周期的50% )、逐渐关闭到完全闭合(约占基音周期的35% )、完全闭合(约占基音周期的15% )三部分组成。

当今主流的基音周期检测技术主要有时域的自相关法、频域的倒谱法、时频结合的小波变换分析方法以及在其基础上的衍生算法。本文所采用的方法是自相关法

2.设计思路

(1)自相关函数

对于离散的语音信号x(n),它的自相关函数定义为:

R(k)=Σx(n)x(n-k),

如果信号x(n))具有周期性,那么它的自相关函数也具有周期性,而且周期与信号x(n)的周期性相同。自相关函数提供了一种获取周期信号周期的方法。在周期信号周期的整数倍上,它的自相关函数可以达到最大值,因此可以不考虑起始时间,而从自相关函数的第一个最大值的位置估计出信号的基音周期,这使自相关函数成为信号基音周期估计的一种工具。

(2)短时自相关函数

语音信号是非平稳的信号,所以对信号的处理都使用短时自相关函数。短时自相关函数是在信号的第N个样本点附近用短时窗截取一段信号,做自相关计算所得的结果

Rm(k)=Σx(n)x(n-k)

式中,n表示窗函数是从第n点开始加入。

3、程序代码

function pitch

x=wavread('E:\luyin\wkxp.wav');%读取声音文件

figure(1);

stem(x,'.');                   %显示声音信号的波形

n=160;                         %取20ms的声音片段,即160个样点

for m=1:length(x)/n;           %对每一帧求短时自相关函数

for k=1:n;

Rm(k)=0;

for i=(k+1):n;

Rm(k)=Rm(k)+x(i+(m-1)*n)*x(i-k+(m-1)*n);

end

end

p=Rm(10:n);                %防止误判,去掉前边10个数值较大的点

[Rmax,N(m)]=max(p);        %读取第一个自相关函数的最大点

end                            %补回前边去掉的10个点

N=N+10;

T=N/8;                         %算出对应的周期

figure(2);stem(T,'.');axis([0 length(T) 0 10]);

xlabel('帧数(n)');ylabel('周期(ms)');title('各帧基音周期');

T1= medfilt1(T,5);             %去除野点

figure(3);stem(T1,'.');axis([0 length(T1) 0 10]);

xlabel('帧数(n)');ylabel('周期(ms)');title('各帧基音周期');

4、运行结果与分析

(1)

运行

x=wavread('E:\luyin\wkxp.wav');%读取声音文件

figure(1);

stem(x,'.');                   %显示声音信号的波形

得到的波形如下

图1

原来的声音文件时长为t=5s,采样率为8kHZ。故总共有5*8k=40000个采样点(如图所示)。

图中的三个波形分别对应a,o,e

(2)

运行

n=160;%取20ms的声音片段,即160个样点

for m=1:length(x)/n;           %对每一帧求短时自相关函数

for k=1:n;

Rm(k)=0;

for i=(k+1):n;

Rm(k)=Rm(k)+x(i+(m-1)*n)*x(i-k+(m-1)*n);

end

end

p=Rm(10:n);                %防止误判,去掉前边10个数值较大的点

[Rmax,N(m)]=max(p);        %读取第一个自相关函数的最大点

end                            %补回前边去掉的10个点

N=N+10;

T=N/8;                         %算出对应的周期

figure(2);stem(T,'.');axis([0 length(T) 0 10]);

xlabel('帧数(n)');ylabel('周期(ms)');title('各帧基音周期');

得到的结果为:

图2

由第一步可知40000个样点,一共有250帧(每帧160个样点),对应着图中的横坐标

由图中可以看出基音周期大约为7ms.但是图中存在太多的野点,为此,需要对此进行进一步的处理,即去除野点

(3)去除野点

运行

T1= medfilt1(T,5);%去除野点

figure(3);stem(T1,'.');axis([0 length(T1) 0 10]);

xlabel('帧数(n)');ylabel('周期(ms)');title('各帧基音周期');

运行结果如下

图3

5、设计中遇到的问题与心得

(1)设计中遇到的问题:

由于每一帧做短时自相关时,Rm(k)开始的几个点的值比第一个周期的峰值还大,因此无法正常提取出第一个峰值对应的点。开始程序的运行结果如下:

图4

于是经过和同学讨论之后决定舍弃Rm开始几个值较大的点,于是运行结果就正常了

图5

(2)心得体验:

短时自相关函数法基音检测的主要原理是通过比较原始信号和它移位后的信号之间的类似性来确定基音周期,如果移位距离等于基音周期,那么两个信号具有最大类似性。基于自相关函数的算法是基音周期估计的常用方法,特别适用于噪声环境下的基音提取。自相关函数在基音周期处表现为峰值,相邻两个峰值之间的间隔即为一个基音周期。

但是短时自相关函数法也存在以下缺点:

①倍频现象

通常情况下,基波分量往往不是最强的分量,丰富的谐波成分使语音信号的波形变得非常复杂,给基音检测带来了困难,经常发生基频估计结果为其实际基音频率的二次倍频或二次分频的情况。加之还有清浊混杂等情况,使基音检测成为一大难题。

如图5 ( a)是一帧语音信号,图4 ( b)是这帧语音信号的自相关函数,可以看出自相关函数在基音周期处表现为峰值,这些峰值点之间的间隔的平均值就是基音周期,如图6 ( b)所示可以看出自相关函数检测出的基音周期是原始信号基音周期的一半,这是由于谐波峰值点(箭头所示)的影响,这就是上述缺点中所说的倍频现象。

图6

图7

②运算量大,效率低下

无论是对随机的语音信号还是对离散的信号进行处理,只要是使用自相关函数对信号进行周期估计,必然涉及大量的乘法运算。虽然经过实验证明,自相关函数法是一种简单而且有效的方法,但是大量的乘法运算严重影响算法的效率。然而从估计基音周期的角度看,短时自相关函数所包含的信息许多是多余的,真正能反映基音周期性的只是少数几个峰,而其余的大多数峰都是由于声道的谐振特性引起的。为此,可以用三电平削波法来突现反映基音周期的信息,同时压缩与共无关的信息。三电平法具体的方法就不在此详细说明了。

python自相关函数提取基音周期_自相关函数法基音周期提取(matlab版)相关推荐

  1. python 进程生命周期_计算客户生命周期价值的python解决方案

    python 进程生命周期 By Lisa Cohen, Zhining Deng, Shijing Fang, and Ron Sielinski 由丽莎·科恩,志宁邓,石井方和罗恩Sielinsk ...

  2. python文本分析 提取数据含义_从文本字符串中提取数据进行分析

    需求 在进行数据分析的时候,有时候会碰到需要从文本字符串中提取需要的数据来进行分析的情况,这种需求在网络爬虫数据分析非常常见. 比如,需要下列表格"基础薪资规则"字段中提取阶梯单量 ...

  3. python微信机器人部署服务器_玩法收藏/云服务器/零基础微信机器人实践( Python )...

    最近想做个微信机器人,主要是为了个人方便.在腾云阁发现这个教程,得到了一些启发.(修改转载已取得腾讯云授权) 技术路径和实现思路 首先编程语言使用了 Python , Python 语法简洁.第三方扩 ...

  4. python人力成本数据测算_历史数据法进行人力成本分析

    历史数据法进行人力成本分析 人力成本分析是人力成本控制和降低的基础性工作,有以下几种分析方法: 一.历史数据法一 关于人力成本,有这样一个常用的公式:工资率 = 工资总额÷销售额. 这里只是把工资列为 ...

  5. 批量提取文件创建时间_不要眨眼!批量提取文件名,只需30秒

    私信回复关键词[工具]~ 获取Excel高效小工具合集!让你的Excel效率开挂~ 众所周知,「复制粘贴」可以解决 Excel 中出现的大多数问题. 那我们为什么还要学习 Excel 相关技巧??? ...

  6. apk提取加密素材_从apk包中提取unity资源

    使用本方法来提取资源有个前提就是资源没有被加密,这个问题会在后面进行研究.而且这个方式目前是在Windows平台下使用的. 以青蛙旅行这款游戏为例,先准备好其apk包,然后对其进行解压.这里有两种方式 ...

  7. python积木编程软件下载_积木编程软件-积木编程官方版下载-红软网

    积木编程安卓版下载,积木编程APP是一款在手机上学习更多的编程知识打造的便捷平台.在软件中也是拥有非常丰富的专业编程知识,我们能够学习到最基础的编程知识,每天计划一点学习的计划,为我们带来更多的编程知 ...

  8. python建模与仿真控制系统_清华大学出版社-图书详情-《MATLAB控制系统设计与仿真》...

    前言 MATLAB是MathWorks公司推出的一套高性能的数值计算和可视化软件,它集数值计算.符号计算和图形可视化于一体,构成了一个方便且界面友好的用户环境.随着它的版本不断升级,其功能越来越强大, ...

  9. matlab周期三角信号,信号与系统实验(MATLAB版)实验10周期信号的合成与分解.ppt...

    一. 实验目的  (1) 在理论学习的基础上,通过本实验熟悉信号的合成.分解原理,加深对傅里叶级数的理解;  (2) 了解和认识吉布斯现象 (Gibbs).二. 实验原理 任何具有确定性的信号 ...

最新文章

  1. Dialog、Toast、Snackbar,你真的了解它们吗?
  2. 路,链(迹),割的概念
  3. vue 手写一个时间选择器
  4. Android开发之Activity转场动画
  5. c#获取电脑硬件信息参数说明(主板篇 Win32_BaseBoard )
  6. linux命令head
  7. unity创建一个简单对象的开销_Unity下简单对象池的创建与使用
  8. c语言malloc calloc,C语言内存管理:malloc、calloc、free的实现
  9. 中小学生Python课应该学什么
  10. 如何启动一个新的cmd窗口并在其内执行命令
  11. 时间序列深度学习:状态 LSTM 模型预测太阳黑子(二)
  12. 还贷的那些事VI——自由贷的设想
  13. 产品综合评价模型——基于商品评论建立的产品综合评价模型(2)
  14. 发票识别OCR和发票扫描仪
  15. 概率论第六章——矩估计
  16. c语言共阴极数码管数字6,共阴数码管 显示数字 C语言程序
  17. 联想服务器怎么接显示器,联想笔记本连接显示器 联想笔记本外接显示器怎么设置...
  18. php 微信公众号图片外链,如何制作微信图文链接?微信图文链接生成
  19. 1104-捷径(DP)
  20. 百度地图如何在html中显示图片,在网页中插入百度地图(实例)

热门文章

  1. SQL语句在Mysql中是如何被执行的?
  2. mfc改计算机名称,VC获取并修改计算机屏幕分辨率(MFC)
  3. PPT文件如何解决不能打印的问题
  4. 服务器丢包都有哪些原因?
  5. excel文件下载下来损坏 js_java – React excel文件下载损坏
  6. (转)CTA大佬Winton创始人:人工智能会颠覆传统投资吗?
  7. ubuntu 12.10起用g++4.7 编译C++11
  8. 失传万年的PS合成进阶宝典(一)
  9. 【图片新闻】低空穿越的美军MC-130J突击队II特种作战运输机
  10. h5打开麦克风权限录音_微信H5录音实现