前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基音周期估计

基音周期估计

作者头像
sea-wind
发布2019-09-11 16:17:39
8390
发布2019-09-11 16:17:39
举报
文章被收录于专栏:海风海风

这是语音信号的数字处理课程的课程作业,这里采用了自相关法对基音周期进行估计。语料采样率:8kHz;量化精度为16bits/sample;

1、 算法描述

本次实验选择了自相关方法对基音周期进行估计。算法主要包括以下几个步骤

  • 预处理:包括语料读取和分帧、滤波。
  • 阈值设定:对每帧数据选择合适的阈值进行设定
  • 削波处理:提高检测准确性
  • 互相关求基音频率:通过求解互(自)相关得到基音周期的检测值。

本实验准备使用MATLAB软件完成基音检测任务,具体步骤实现如下

  1. 下载语音工具箱voicebox,并导入MATLAB中。
  2. 使用readwav读取预料,enframe完成分帧,fir1设计低通滤波器滤波。
  3. 采用MAX函数分别取前60点最大值和最后60点最大值,选择其中较小的乘以0.68作为阈值。
  4. 对信号进行中心削波和三电平量化得到f_c,f_3。
  5. 求这两个信号的互相关值(或者分别求自相关)。取20-160点中的最大值,如果大于0值处1/4,认为是基音周期,否则认为基音周期为0.

2. 实验代码

MATLAB代码如下所示

代码语言:javascript
复制
 1 %% 基音检测-语音信号的数字处理作业
 2 % 本代码实现了语音信号的基音检测功能,采用了自相关方法处理。
 3 %
 4 % * 作者:
 5 % * 日期:2015-04-15
 6 % 
 7 
 8 %% 预处理
 9 %% 
10 % 清空工作区
11 clc;clear all;close all;        
12 %%
13 % 读取预料,同时对其进行低通滤波(900Hz)和分帧
14 [y,fs,wmode,fidx]=readwav('MaoYiSheng.wav','p',-1,-1);
15 f=enframe(y,160);       %分析帧长:20ms(160样点)
16 lpf_900 = fir1(39,900/fs);
17 f_l = conv2(f,lpf_900,'same');
18 figure;plot(f_l(5,:));xlabel('n');ylabel('幅值');title('语音信号波形(低通滤波)');
19 %% 阈值设定
20 %% 
21 % 对每帧预料进行阈值选择
22 f_l_max = [max(abs(f_l(:,1:60)),[],2) max(abs(f_l(:,101:160)),[],2)];
23 CL = 0.68*min(f_l_max,[],2);    
24 figure; stem(CL);xlabel('帧序号');ylabel('阈值大小');title('阈值分布');
25 CL = repmat(CL,1,160);
26 %% 削波处理
27 %%
28 % 三电平量化
29 f_3 = zeros(size(f));
30 f_3(f>CL) = 1;
31 f_3(f<-CL) = -1;
32 figure;plot(f_3(5,:));xlabel('n');ylabel('幅值');title('语音信号波形(三电平量化)');
33 %%
34 % 中心削波
35 f_c = zeros(size(f));
36 f_c(f>CL) = f(f>CL) - CL(f>CL);
37 f_c(f<-CL) = f(f<-CL) + CL(f<-CL);
38 figure;plot(f_c(5,:));xlabel('n');ylabel('幅值');title('语音信号波形(中心削波)');
39 %% 互相关求基音频率
40 % 互相关 (采用卷积计算)
41 f_3_inv = f_3(:,end:-1:1);
42 f_c_inv = f_c(:,end:-1:1);
43 for n = 1:45
44     f_xcorr(n,:) = conv(f_c(n,:),f_c_inv(n,:));
45 end
46 f_xcorr = f_xcorr(:,160:319);
47 %% 
48 % 找出最大值位置
49 [f_xcorr_max,f_postition] = max(f_xcorr(:,21:160),[],2);
50 f_postition = f_postition+20;
51 noPitch = f_xcorr_max<f_xcorr(:,1)/4;   % 清音检测
52 pitchFrequence = fs./f_postition;       % 基音频率
53 pitchFrequence(noPitch==1) = 0;
54 figure;stem(pitchFrequence);xlabel('帧序号');ylabel('基音频率(Hz)');
55 title('基音频率检测');grid on;

3.实验结果

clip_image002
clip_image002
clip_image004
clip_image004
clip_image010
clip_image010

4.结果分析

以下将通过几个问题,具体对基音检测进行分析。

(1). 为何要通过低通滤波?

image
image

通过对比滤波器和波形,可以发现滤波之前有很多高频分量,而这些高频分量会对基音检测带来不利影响,选择合适的低通滤波器能消除这一影响,更好体现低频特性。

(2). 为何要分帧?

语音只有短期的平稳特性,譬如对整个语料做谱估计结果如下图所示,这样的信号是完全无法辨别基音频率的

image
image

(3). 为何要分前后段求最大幅度?

如下图所示,如果我们只求一次最大幅度,那么前面的波形就完全消失了。基音估计每帧要有两个周期,而幅度是会改变的,如果我们求最大值,那么阈值选择很有可能是不合适的。

image
image

(4). 互(自)相关求解的是什么?

互(自)相关求解的是波形之间的相似程度,也就是说对于周期信号在相邻周期时间下的互(自)相关值会很大。

image
image

(5). 削波带来了什么影响?不同的削波方式之间的差异是什么。

削波可以使得在基音周期位置呈现大的峰值,获得更良好的性能。三电平削波可以简化自相关运算,然而其性能却没有中心削波好。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-06-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、 算法描述
  • 2. 实验代码
  • 3.实验结果
  • 4.结果分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档