基音周期提取2-基于线性相关系数的Matlab实现

基音周期提取结果



图1 基音提取结果

算法说明

线性相关系数

也称“皮尔逊积矩相关系数”(Pearson product-moment correlation coefficient)

通常用γ或ρ表示,是用来度量两个变量之间的相互关系(线性相关),取值范围在[-1,+1]之间。

γ>0为正相关,γ<0为负相关,γ=0表示不相关。γ的绝对值越大,相关程度越高。

r=1时为完全正相关;如两者呈负相关则r为负值,而r=-1时为完全负相关。
通常|r|大于0.75时,认为两个变量有很强的线性相关性。



图2 线性相关系数计算公式

式中x,y为两个向量,这里理解为两帧语音的采样序列。当x,y为相邻的两帧数据,且帧长等于基音周期时,其相关系数为最大值(最接近1)。

Matlab应用编程

Matlab中可用corrcoef(x,y)函数计算相关系数。
%inx:     输入的语音采样数据
%Pos: 查找Pos点处的基音周期
%minpth: 基音周期最小值对应的采样点数
%maxpth: 基音周期最大值对应的采样点数
%plotfig: 为1时绘制计算过程曲线图
%
%out: 以不同样点数作为期音周期的相似系数,其最大值点就对应基音周期
function [out] = findPitchCorrcoef(inx,Pos,minpth,maxpth,plotfig)
[line,row] = size(inx);
out = 0;
if(line<Pos+ceil(maxpth))
return;
end
if(Pos<ceil(maxpth))
return;
end
out=zeros(ceil(maxpth),1);
for i=floor(minpth):ceil(maxpth)
xa = inx(Pos-i:Pos); %以i为帧长,Pos点为分界,取其前后两帧数据
xb = inx(Pos+1:Pos+1+i);
if(max(abs(xa))<0.05) %为减小计算量,幅度小于0.05时认为是噪音,不作计算
continue;
end
if(max(abs(xb))<0.05)
continue;
end
corrcoefxab = corrcoef(xa,xb);
out(i)=corrcoefxab(2,1);
end if(plotfig == 1) %绘计算过程曲线
figure;
subplot(2,1,1);
plot(inx,'.-');
grid on;
subplot(2,1,2);
plot(out,'*-');
grid on;
end



图3 基音计算过程曲线

由图3可以看出,在帧长为42点时(8K采样,对应190.5Hz),相邻两帧语音具有最大相似系数0.9359。而且帧长41点和43点时对应的相似系数小于0.7,对比可知:

基于线性相关系数的基音周期计算,具有优秀的分辨能力

图3右侧对50Hz的工频噪音作基音提取,帧长158点对应50.6Hz也非常准确。

改变findPitchCorrcoef函数的Pos参数并取输出最大值对应的帧长,即可计算语音数据在各点处的基音周期。如图1。

基音周期提取2-基于线性相关系数的Matlab实现的更多相关文章

  1. 小梅哥FPGA数字逻辑设计教程——基于线性序列机的TLC5620型DAC驱动设计

    基于线性序列机的TLC5620型DAC驱动设计 目录 TLC5620型DAC芯片概述:    2 TLC5620型DAC芯片引脚说明:    2 TLC5620型DAC芯片详细介绍:    3 TLC ...

  2. pandas通过皮尔逊积矩线性相关系数(Pearson's r)计算数据相关性

    皮尔逊积矩线性相关系数(Pearson's r)用于计算两组数组之间是否有线性关联,举个例子: a = pd.Series([1,2,3,4,5,6,7,8,9,10]) b = pd.Series( ...

  3. 【线性表基础】基于线性表的简单算法【Java版】

    本文描述了基于线性表的简单算法及其代码[Java实现] 1-1 删除单链表中所有重复元素 // Example 1-1 删除单链表中所有重复元素 private static void removeR ...

  4. Spearman Rank(斯皮尔曼等级)相关系数及MATLAB实现

    转自:http://blog.csdn.net/wsywl/article/details/5859751 Spearman Rank(斯皮尔曼等级)相关系数 1.简介 在统计学中,斯皮尔曼等级相关系 ...

  5. 用mplayer从视频中按周期提取帧

    使用方法:extract file time step folder time 设置时间长度 step 设置周期 均以秒(s)为单位 贡献:1. 从视频文件中周期性提取图片:2. Windows下批处 ...

  6. Pearson(皮尔逊)相关系数及MATLAB实现

    转自:http://blog.csdn.net/wsywl/article/details/5727327 由于使用的统计相关系数比较频繁,所以这里就利用几篇文章简单介绍一下这些系数. 相关系数:考察 ...

  7. 7-4线性分组码的matlab程序

    补充一点,关于生成矩阵G和校验矩阵H的关系:生成矩阵G是4*7矩阵,分为两块,前4列组成的4*4矩阵为单位矩阵,后3列组成的4*3矩阵我称它监督矩阵,校验矩阵是3*7矩阵,前4列组成的3*4矩阵是监督 ...

  8. 基于TCP/IP的Matlab Modbus与M340 PLC通讯

    本人原创,代码拿出来供大家交流学习经验,勿作他用. 废话不多说,代码直接上. 1.创建链接 function link = connect_create(client_addr,port) %**** ...

  9. WebRTC中的NetEQ

    NetEQ使得WebRTC语音引擎能够快速且高解析度地适应不断变化的网络环境,确保了音质优美且缓冲延迟最小,其集成了自适应抖动控制以及丢包隐藏算法. WebRTC和NetEQ概述 WebRTC Web ...

随机推荐

  1. Linux驱动学习之什么是驱动?

    一.什么是驱动? 1: 驱动一词的字面意思 2: 物理上的驱动 3: 硬件中的驱动 4: linux内核驱动.软件层面上的驱动广义上是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序. ...

  2. 在做基于LBS应用的一些随笔

    公司做了一个基于LBS的APP,在做服务端的时候出现了一些注意事项,还是记录下把. 首先是关于坐标: 弧长公式:L=nπr/180°或l=|α|r.地球半径大致是6400千米.以纬度0.000001为 ...

  3. java--UDP屏幕广播代码

    1.发送端的代码 这里广播的地址只写了一个 package com.udp.broadcast; import java.awt.Robot; import java.awt.image.Buffer ...

  4. 调用别人提供的WebService

    在开发过程中,许多时候需要使用到别人提供的WebService接口,使用其中的方法. 在调用别人提供的接口时,会得到接口使用的文档,其中包括接口的网络地址及方法作用等. 找到WebService的ws ...

  5. alphaRGB 转 RGB、16位

    struct xColor { BYTE b, g, r, a; }; struct RGBColor { BYTE b, g, r; }; //void operator <<(RGBC ...

  6. 将搜狗词库.scel格式转化为.txt格式

    由于项目中要用到词库,而下载的搜狗词库是.scel格式,所以就用python脚本将搜狗词库.scel格式文件转化为.txt格式文件. #!/bin/python # -*- coding: utf-8 ...

  7. python出输出字符串方式:

    python出输出字符串方式: >>> who='knights' >>> what='NI' >>> print ('we are the',w ...

  8. (转)如何在一台电脑上开启多个tomcat 和配置让系统识别哪个具体的tomcat

    大家基本上都只在一台电脑上面启动一个Tomcat,而启动多个Tomcat会提示报错等相关故障.而假如调试负载均衡及集群的时候,需要在一台电脑上面开启多个Tomcat,那么怎么开启呢? 方法/步骤 首先 ...

  9. git clone google代码库

    git clone  https://chromium.googlesource.com/chromium/src 发现有将近7G,但是速度太慢,老是失败,提示信息先后是"The remot ...

  10. lnode满,维护记录

    df  17% 正常 df -i 100% inode耗尽. | uniq -c 查出占用lnode最大的目录是 /var/spool/exim4/input 居然有15W多个小文件 exim4是邮件 ...