zoukankan      html  css  js  c++  java
  • 基音周期估计

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

    clip_image002

    clip_image004

    clip_image010

    4.结果分析

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

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

    image

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

    (2). 为何要分帧?

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

    image

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

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

    image

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

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

    image

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

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

  • 相关阅读:
    数据库性能优化
    AutoDetectChangesEnabled及AddRange解决EF插入的性能问题
    实体框架 5 性能注意事项
    使用JS传递数组型数据回服务器
    Code First配合Entity Framework Power Tools Beta 4使用
    HighChart 体验之旅 (后台传递JSON参数和数据的方法)
    System.Transactions事务超时设置
    ASP.NET站点部署相关
    js 字符串转化成数字
    发布.net 4.0的站点到IIS7.5下时无法访问
  • 原文地址:https://www.cnblogs.com/sea-wind/p/4544702.html
Copyright © 2011-2022 走看看