语音信号分析之短时相关函数及matlab程序_matlab短时自相关函数_Hencoff的博客-程序员秘密

技术标签: matlab  算法  c  Speech & Audio  function  工具  

原文:http://wenku.baidu.com/view/b190f202bed5b9f3f90f1c89.html?from=related

      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个样点

      form=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([0length(T) 0 10]);

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

  

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

      figure(3);stem(T1,'.');axis([0length(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个样点

      form=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([0length(T) 0 10]);

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

 

得到的结果为:

                                                                                                                        图 2

 

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

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

            (3)去除野点

运行

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

      figure(3);stem(T1,'.');axis([0length(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

            ②运算量大,效率低下

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

 

 

 

 

 

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Hencoff/article/details/7653568

智能推荐

好用的文献论文管理软件 EndNote X 9.3.3 Mac版_endnote key_「已注销」的博客-程序员秘密

软件介绍EndNote X9 for Mac 破解版是一款专业的学术论文文献管理工具,支持国际期刊的参考文献格式有3776 种,写作模板几百种,涵盖各个领域的杂志。如果您准备写SCI 稿件,非常有必要采用此软件。建立文献库和图片库:收藏,管理和搜索个人文献和图片、表格;定制文稿:直接在Word中格式化引文和图形,利用文稿模板直接书写合乎杂志社要求的文章;引文编排:可以自动帮助我们编辑参考文献的格式。 .........

rabbitmq详解_hmb↑的博客-程序员秘密

整理rabbitmq下载安装、rabbitmq界面、rabbitmq五种模型、rabbitmq并发消费、rabbitmq批量发送,rabbitmq批量消费,rabbitmq延迟队列,ttl队列,死信队列,消息确认,集群搭建等

Unity--Pdf文件转图片_hellemic的博客-程序员秘密

记录下最近做的在Unity中通过转换Pdf文件为图片的方式以显示文档的方法,供以后参考。网上相关的插件不算多,也不算少,我采用的是Github上的PdfiumViewer插件,因为该插件是在C#基础上对pdf文档做显示、放大等常规操作,而我只需要在Unity中显示就行,所以去除了其中大部分功能,因能力问题,去除方式有些粗糙。如有需要,可在这里下载。准备导入pdfium.dll,PdfiumView

ubuntu apt-get update 更新软件_greatriver007的博客-程序员秘密

转自:http://wiki.debian.org.hk/w/Upgrade_software_with_APT进入系统管理员(root)帐户 首先您需要变身成为系统管理员root。大部份Unix/Linux系统都可以在命令模式或终端机(Terminal)打"su"并输入系统管理员root帐户的密码变成root:$ suPassword: ******** # 输入roo

去除使用pivot_table后产生的多重索引_咚咚咚咚咚咚咚咚锵的博客-程序员秘密

参考来源将列中的重复索引删除pro_data.columns = pro_data.columns.droplevel(0)使用reset_index()将行的多重索引去除但是此时name和glass_id仍为索引pro_data = pd.concat([pro_data,pd.DataFrame(data=pro_data.index.tolist(),columns=[p...

随便推点

Effective Python 读书笔记: 第41条: 考虑用concurrent.futures来实现真正的平行计算_天地一扁舟的博客-程序员秘密

# -*- encoding: utf-8 -*-from concurrent.futures import ThreadPoolExecutorfrom concurrent.futures import ProcessPoolExecutorfrom time import time'''第41条: 考虑用concurrent.futures来实现真正的平行计算关键:1...

carpedm20/DCGAN-tensorflow学习笔记(一)_木女Dawn的博客-程序员秘密

最近需要跑DCGAN的python项目,代码在这里: carpedm20/DCGAN-tensorflow 的github地址在自己电脑上跑这个程序时遇到了几个问题:1、我电脑上装了pycharm+python3.6,一般的python程序直接在pycharm里面运行很方便,但这个项目并不能直接在pycharm里面用“Run”来运行,因为download.py和main.py在执行的时候...

SpringBoot整合MongoDB JPA,测试MongoRepository与MongoTemplate用法,简单增删改查+高级聚合_mongorepository jpa_陶攀峰的博客-程序员秘密

源码地址 -> https://github.com/TaoPanfeng/case/tree/master/04-mongo/springboot-mongo一 引入依赖 <dependencies> <!--mongo操作mongo--> <dependency> <groupI...

线程通信的原理_线程通信实验原理_ele的博客-程序员秘密

线程开始运行,拥有自己的的栈空间,就如同一个脚本一样,按照既定的代码一步一步地执行,直到终止。但是,每个运行中的线程,如果仅仅是孤立的运行,那么没有一点儿价值,或者说价值很少。如果多个线程能够相互配合完成工作,这将会带来巨大的价值。volatile 和 synchronized 关键字Java 支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象以及成员...

Qt 封装一个简单的LED(指示灯)控件_qt 指示灯_razor521的博客-程序员秘密

Qt封装一个简单的LED(指示灯)控件1,效果~所以这个简单的LED类可以自定义大小~可以点亮或熄灭,也可以闪烁????️~闪烁的时间间隔可自定义,只需要在设置闪烁状态前调用类的setInterval(msec)函数~有几种预定义的颜色(红、绿、蓝、黄和橘色),也提供自定义颜色的函数~如果还满足不了需要,就得自己扩展了,类很小,这也很方便~工程文件中有这个例子代码,可以当作用法入门,其实只是引入头文件,定义类对象,然后当一个普通控件(如:QPushButton)来用~最简单的方法是把类

推荐文章

热门文章

相关标签