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