⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 v_us_identify.m

📁 清浊音判别方法,用matlab软件开发,如自相关和能量方法等
💻 M
字号:
%  清音、浊音、无声的判别程序
%  M : 一帧语音的平均幅度(已经归一化)
%  Z : 一帧语音的过零率
%  方法:浊音不被切成清音,少量的清音被切成浊音也无妨;
%  清音不被切成无声,少量的无声被切成清音也无妨
%  浊音:V    清音:U     无声:S
%  y :声音信号的抽样点序列,returning the sampled data in y
%  v_u_s : 为 1 表示浊音,为零表示无声,为-1表示清音
% fix():取整函数
% rem():除后取余
function [v_s_u,Z_period,zeros_sum] = v_us_identify(sequence_frame,sequence_frame_noha)
    %Z_period = 0;
% 计算帧序列的平均幅度: M
    N = length(sequence_frame);
    abs_sequence = abs(sequence_frame);
    scope_M = (1/N)*sum(abs_sequence);

% 计算其过零率: zeros_sum
    
    front_sequence = sequence_frame(1:length(sequence_frame)-1);
    back_sequence  = sequence_frame(2:length(sequence_frame));
    result_sf = sign(front_sequence);
    result_sb = sign(back_sequence);
    zeros = abs(result_sf -result_sb);
    zeros_sum = 1/2*sum(zeros);
 % 以后是清、浊、无声的判别 ==========================
    Z_period = 0;
    if zeros_sum >= 100
       v_s_u = -1;
   elseif zeros_sum <= 12
       if scope_M > 0.007
          v_s_u = 1;
          Z_period = 0;
       else
          v_s_u = 0;
       end
   else
       if scope_M > 0.3
           v_s_u = 1;
           Z_period = 0;
       elseif scope_M < 0.007 
           v_s_u = 0;
       else
           % 800hz 低通滤波(产生低通滤波器),低通滤波器是否正确,有待验证!
           S_av = sequence_frame_noha -mean(sequence_frame_noha);          
           N_noha = length(sequence_frame_noha);
           A = [0.008233,-0.004879,0.007632,0.007632,-0.004879,0.008233];% h(z)的分子
           B = [1.0000,-3.6868,5.8926,-5.0085,2.2518,-0.4271];
           filter_value_sequence = filter(A,B,S_av);
    
           % 数值滤波 numerical_value
           numerical_value(1:8) = filter_value_sequence (1:8);
           for i = 9:N_noha
               numerical_value(i) = (1/9) * sum(filter_value_sequence((i-8):i));
           end
           % 计算 NCCF
           m_1 = 1;
           for temp_period_1 = 109 : 206
               interfix_period_1(m_1) = ncff_frame(N_noha,temp_period_1,numerical_value);
               period_1(m_1) = temp_period_1;
               m_1 = m_1 + 1;
           end
           max_interfix_period_1 = max(interfix_period_1);
           index_1 = find(interfix_period_1 == max_interfix_period_1);
           tao_1 = period_1(index_1);
           m_2 = 1;
           for temp_period_2 = 55 : 108
               interfix_period_2(m_2) = ncff_frame(N_noha,temp_period_2,numerical_value);
               period_2(m_2) = temp_period_2;
               m_2 = m_2 + 1;
           end
           max_interfix_period_2 = max(interfix_period_2);
           index_2 = find(interfix_period_2 == max_interfix_period_2);
           tao_2 = period_2(index_2);
           m_3 = 1;
           for temp_period_3 = 25 : 54
               interfix_period_3(m_3) = ncff_frame(N_noha,temp_period_3,numerical_value);
               period_3(m_3) = temp_period_3;
               m_3 = m_3 + 1;
           end
           max_interfix_period_3 = max(interfix_period_3);
           index_3 = find(interfix_period_3 == max_interfix_period_3);
           tao_3 = period_3(index_3);
           % 后处理
           max_interfix = max_interfix_period_1;
           tao_max = tao_1;
           if  max_interfix_period_2 >= 0.96*max_interfix
               max_interfix = max_interfix_period_2;
               tao_max = tao_2;
           end
           if  max_interfix_period_3 >= 0.96*max_interfix
               max_interfix = max_interfix_period_3;
               tao_max = tao_3;
           end 
           % 计算周期性水平量 Z_period
           %Z_period = 0;
           interfix_av = 1/3*(max_interfix_period_1 + max_interfix_period_2 + max_interfix_period_3);
           interfix_period = interfix_av + max_interfix;
           if  interfix_period > 0.903
               if (tao_max >= 27)&(tao_max <= 202)
                   v_s_u = 1;
                   Z_period = tao_max;
               else
                   v_s_u = -1;
               end
           else
               v_s_u = -1;
           end
       end
   end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -