基音周期提取2-基于线性相关系数的Matlab实现
基音周期提取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实现的更多相关文章
- 小梅哥FPGA数字逻辑设计教程——基于线性序列机的TLC5620型DAC驱动设计
基于线性序列机的TLC5620型DAC驱动设计 目录 TLC5620型DAC芯片概述: 2 TLC5620型DAC芯片引脚说明: 2 TLC5620型DAC芯片详细介绍: 3 TLC ...
- pandas通过皮尔逊积矩线性相关系数(Pearson's r)计算数据相关性
皮尔逊积矩线性相关系数(Pearson's r)用于计算两组数组之间是否有线性关联,举个例子: a = pd.Series([1,2,3,4,5,6,7,8,9,10]) b = pd.Series( ...
- 【线性表基础】基于线性表的简单算法【Java版】
本文描述了基于线性表的简单算法及其代码[Java实现] 1-1 删除单链表中所有重复元素 // Example 1-1 删除单链表中所有重复元素 private static void removeR ...
- Spearman Rank(斯皮尔曼等级)相关系数及MATLAB实现
转自:http://blog.csdn.net/wsywl/article/details/5859751 Spearman Rank(斯皮尔曼等级)相关系数 1.简介 在统计学中,斯皮尔曼等级相关系 ...
- 用mplayer从视频中按周期提取帧
使用方法:extract file time step folder time 设置时间长度 step 设置周期 均以秒(s)为单位 贡献:1. 从视频文件中周期性提取图片:2. Windows下批处 ...
- Pearson(皮尔逊)相关系数及MATLAB实现
转自:http://blog.csdn.net/wsywl/article/details/5727327 由于使用的统计相关系数比较频繁,所以这里就利用几篇文章简单介绍一下这些系数. 相关系数:考察 ...
- 7-4线性分组码的matlab程序
补充一点,关于生成矩阵G和校验矩阵H的关系:生成矩阵G是4*7矩阵,分为两块,前4列组成的4*4矩阵为单位矩阵,后3列组成的4*3矩阵我称它监督矩阵,校验矩阵是3*7矩阵,前4列组成的3*4矩阵是监督 ...
- 基于TCP/IP的Matlab Modbus与M340 PLC通讯
本人原创,代码拿出来供大家交流学习经验,勿作他用. 废话不多说,代码直接上. 1.创建链接 function link = connect_create(client_addr,port) %**** ...
- WebRTC中的NetEQ
NetEQ使得WebRTC语音引擎能够快速且高解析度地适应不断变化的网络环境,确保了音质优美且缓冲延迟最小,其集成了自适应抖动控制以及丢包隐藏算法. WebRTC和NetEQ概述 WebRTC Web ...
随机推荐
- Linux驱动学习之什么是驱动?
一.什么是驱动? 1: 驱动一词的字面意思 2: 物理上的驱动 3: 硬件中的驱动 4: linux内核驱动.软件层面上的驱动广义上是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序. ...
- 在做基于LBS应用的一些随笔
公司做了一个基于LBS的APP,在做服务端的时候出现了一些注意事项,还是记录下把. 首先是关于坐标: 弧长公式:L=nπr/180°或l=|α|r.地球半径大致是6400千米.以纬度0.000001为 ...
- java--UDP屏幕广播代码
1.发送端的代码 这里广播的地址只写了一个 package com.udp.broadcast; import java.awt.Robot; import java.awt.image.Buffer ...
- 调用别人提供的WebService
在开发过程中,许多时候需要使用到别人提供的WebService接口,使用其中的方法. 在调用别人提供的接口时,会得到接口使用的文档,其中包括接口的网络地址及方法作用等. 找到WebService的ws ...
- alphaRGB 转 RGB、16位
struct xColor { BYTE b, g, r, a; }; struct RGBColor { BYTE b, g, r; }; //void operator <<(RGBC ...
- 将搜狗词库.scel格式转化为.txt格式
由于项目中要用到词库,而下载的搜狗词库是.scel格式,所以就用python脚本将搜狗词库.scel格式文件转化为.txt格式文件. #!/bin/python # -*- coding: utf-8 ...
- python出输出字符串方式:
python出输出字符串方式: >>> who='knights' >>> what='NI' >>> print ('we are the',w ...
- (转)如何在一台电脑上开启多个tomcat 和配置让系统识别哪个具体的tomcat
大家基本上都只在一台电脑上面启动一个Tomcat,而启动多个Tomcat会提示报错等相关故障.而假如调试负载均衡及集群的时候,需要在一台电脑上面开启多个Tomcat,那么怎么开启呢? 方法/步骤 首先 ...
- git clone google代码库
git clone https://chromium.googlesource.com/chromium/src 发现有将近7G,但是速度太慢,老是失败,提示信息先后是"The remot ...
- lnode满,维护记录
df 17% 正常 df -i 100% inode耗尽. | uniq -c 查出占用lnode最大的目录是 /var/spool/exim4/input 居然有15W多个小文件 exim4是邮件 ...