📄 v_us_identify.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 + -