这是语音信号的数字处理课程的课程作业,这里采用了自相关法对基音周期进行估计。语料采样率:8kHz;量化精度为16bits/sample;
1、 算法描述
本次实验选择了自相关方法对基音周期进行估计。算法主要包括以下几个步骤
- 预处理:包括语料读取和分帧、滤波。
- 阈值设定:对每帧数据选择合适的阈值进行设定
- 削波处理:提高检测准确性
- 互相关求基音频率:通过求解互(自)相关得到基音周期的检测值。
本实验准备使用MATLAB软件完成基音检测任务,具体步骤实现如下
- 下载语音工具箱voicebox,并导入MATLAB中。
- 使用readwav读取预料,enframe完成分帧,fir1设计低通滤波器滤波。
- 采用MAX函数分别取前60点最大值和最后60点最大值,选择其中较小的乘以0.68作为阈值。
- 对信号进行中心削波和三电平量化得到f_c,f_3。
- 求这两个信号的互相关值(或者分别求自相关)。取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). 削波带来了什么影响?不同的削波方式之间的差异是什么。
削波可以使得在基音周期位置呈现大的峰值,获得更良好的性能。三电平削波可以简化自相关运算,然而其性能却没有中心削波好。
时间: 2024-10-10 02:39:22