基音周期提取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. Python2.7如何安装numhttp://www.cnblogs.com/yuanzm/p/4089856.htmlpy

    numpy是python一个函数库,做数据挖掘是很好的.但是一般是不带这个函数库的,所以接下来我要讲下如何安装这个函数库, 首先有一种方法是: 傻瓜式安装法:https://sourceforge.n ...

  2. C# WebBrowser 网页缩放的方法

    1.引用COM:MicroSoft Internet Controls 2. 核心代码如下: private void button2_Click(object sender, EventArgs e ...

  3. Eclipse中调试Android技巧

    Android eclipse中程序调试 一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的. 步骤如下. 1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键 ...

  4. Oracle Cursor

    1.概念 游标:从字面来理解就是游动的光标.用数据库语言来描述,游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了.将游标放置到某行后,即可对该行数据进行操作, ...

  5. linux driver编译环境搭建和命令

    首先将ubuntu14.04的内核升级到内核3.18.12. 其次,Ubuntu14.04上驱动编译命令 $ sudo make -C ~/linux-3.18.12/ M=`pwd` modules ...

  6. TCP/IP协议工作原理简述

    TCP/IP协议工作原理简述 // */ // ]]>   TCP/IP协议工作原理简述 Table of Contents 1 概要 2 应用层 3 传输层 4 网络层 5 链路层 1 概要 ...

  7. Linux下高cpu占有率的调试方案

    1.用top命令查看哪个进程占用CPU高 gateway网关进程14094占用CPU高达891%,这个数值是进程内各个线程占用CPU的累加值.   2.用top -H -p pid命令查看进程内各个线 ...

  8. 4. Prototype(原型)

    意图: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性: 当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者 为了避免创建一个与产品类层次平行的工厂类层次时:或者 当 ...

  9. updateEasyuiTab

    //tabContainer:easyui-tabs或者id,title名称 this.updateEasyuiTab = function (tabContainer, outTitle, outU ...

  10. ubuntu与win10互换硬盘

    实例:将sdb上的ubuntu转移至sda,将sda上的win转移至sdb1. 备份资料2. 制作老毛桃PE盘3. 格式化sda4. dd if=/dev/sdb of=/dev/sda ,将sdb克 ...