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

📄 pitch_period.m

📁 清浊音判别方法,用matlab软件开发,如自相关和能量方法等
💻 M
字号:
function [v_s_u,Z_period] = pitch_period(sequence_frame)
% 计算帧序列的平均幅度: 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);
 % 以后是清、浊、无声的判别 ==========================
            S_av = sequence_frame -mean(sequence_frame);          
 
           % 800hz 低通滤波(产生低通滤波器),低通滤波器是否正确,有待验证!
           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 = filter_value_sequence; 
           % 数值滤波 numerical_value
           numerical_value(1:8) = filter_value_sequence (1:8);
           for i = 9:N
               numerical_value(i) = (1/9) * sum(filter_value_sequence((i-8):i));
           end
           % 计算 NCCF
           m_1 = 1;
           for temp_period_1 = 80 : 150
               interfix_period_1(m_1) = ncff_frame(N,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 = 40 : 79
               interfix_period_2(m_2) = ncff_frame(N,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 = 18 : 39
               interfix_period_3(m_3) = ncff_frame(N,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.62
               if (tao_max >= 20)&(tao_max <= 147)
                   v_s_u = 1;
                   Z_period = tao_max;
               else
                   v_s_u = -1;
                   Z_period = tao_max;
               end
           else
               v_s_u = -1;
               Z_period = tao_max;
           end
           
   

⌨️ 快捷键说明

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