码迷,mamicode.com
首页 > 其他好文 > 详细

基音周期估计

时间:2015-06-01 20:14:43      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:

这是语音信号的数字处理课程的课程作业,这里采用了自相关法对基音周期进行估计。语料采样率: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代码如下所示

 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.实验结果

技术分享

技术分享

 

 

技术分享

4.结果分析

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

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

技术分享

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

(2). 为何要分帧?

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

技术分享

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

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

技术分享

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

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

技术分享

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

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

基音周期估计

标签:

原文地址:http://www.cnblogs.com/sea-wind/p/4544702.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!