vfric2st.m
来自「这是一个用于语音信号处理的工具箱」· M 代码 · 共 252 行
M
252 行
disp(' ');
disp('SCRIPT: vfric2st.m ***********************************************');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% vfric2st.m
% program to detect voiced fricatives.
%
% algorithm by jmw. It isn't the best, but hey !
%
% jmw 2/4/94
% 1/12/94
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PLT = 1; % flag to determine plotting
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
file_string = sprintf('temp/%s.mat', name);
s=sprintf('loading ./%s from hard disk ...',file_string);
disp(s);
s=sprintf('load %s', file_string);
eval(s);
signal = eval(name);
file_string = sprintf('temp/%s_Data.mat', name);
s=sprintf('loading ./%s from hard disk ...',file_string);
disp(s);
s=sprintf('load %s', file_string);
eval(s);
file_string = sprintf('temp/%s_SONscore.mat', name);
s=sprintf('loading ./%s from hard disk ...',file_string);
disp(s);
s=sprintf('load %s', file_string);
eval(s);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% calculate freq response
disp('calculating mean frequency w/ preemphasis...');
[m,n]=size(cofa); % get size
N=256; % number of points in freqz
meanfrq=zeros(m,1);
stddevfrq = zeros(m,1);
for i=1:m,
if(VUS_voicetype(i) ~= 's')
[h,w]=freqz([1],cofa(i,:),N);
mag=abs(h);
% filter freq response with differentiator (preemphasis)
f= ones(N,1);
for j=1:N,
f(j) = (j-1) * 5000/N;
end;
mag = mag .* f;
total_mag = sum(mag);
% measure meanfrq of freq response
meanfrq(i)=( (mag'/total_mag) * (5000*w/pi));
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% smooth results
MFO = 3; % median filter order
s=sprintf('smoothing with median filter of order %d ...', MFO);
disp(s);
meanfrq=median1(meanfrq,MFO);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% calculate fric score
HF_thresh_HI = 3200; % from Weinstein, Zue, et. al. paper
HF_thresh_LOW = 2400;
R = HF_thresh_HI - HF_thresh_LOW;
hf_score = zeros(1,m);
for i=1:m,
if (meanfrq(i) > HF_thresh_HI )
hf_score(i) = 1;
elseif (meanfrq(i) > HF_thresh_LOW )
hf_score(i) = ( meanfrq(i) - HF_thresh_LOW ) / R;
else
hf_score(i) = 0;
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% calculate voiced fricative score
disp('calculating voiced fricative score ...');
[m,n] = size(cofa);
vfr_score = zeros(1,m);
SON_DECISION_THRESH = 0.5; % empirically determined (halfway point)
for i=1:m,
if (VUS_voicetype(i)=='v')
% voiced - continue processing
if (son_score(i) < SON_DECISION_THRESH )
% non sonorant
vfr_score(i) = 1;
else
% use HF score instead (sonorant)
vfr_score(i) = hf_score(i);
end;
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% segment
old_vfr_score = vfr_score;
seg_cnt = 0;
flg = 1;
for i = 1:m,
if ( vfr_score(i) > 0 & flg == 1)
% start new segment
seg_cnt = seg_cnt + 1;
seg_frames(seg_cnt,1) = i;
flg = 0;
elseif ( vfr_score(i) > 0 & flg==0)
% continue in current segment
seg_frames(seg_cnt,2) = i;
elseif ( vfr_score(i) == 0 & flg==0 )
% segment just ended on previous frame - reset flag
seg_frames(seg_cnt,2) = i-1;
flg = 1;
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% and discard segments that are tooooo short
events = 0;
VFRIC_thresh = 150;
if ( seg_cnt >0)
% segments do exist
for i=1:seg_cnt,
a=range(seg_frames(i,1),1);
b=range(seg_frames(i,2),2);
if ( (b-a) < VFRIC_thresh)
% discard - too short
events = events + 1; % counter of segments eliminated
a=seg_frames(i,1);
b=seg_frames(i,2);
vfr_score(a:b) = zeros(1,b-a+1);
end;
end;
end;
s=sprintf('eliminating voiced fricative segments less than');
s1 = sprintf(' %d samples: ... %d events',VFRIC_thresh,events);
s=[s s1];
disp(s);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% plot results
if (PLT)
titles = 1; % turn off for diss figs
disp('plotting results ...');
h=gcf;
figure(h);
clf;
subplot(311)
plot(signal);
a=axis;
grid on;
s=sprintf('%s', name);
if (titles)
title(s);
end;
subplot(312);
%stairs(range(:,1), old_vfr_score);
stairs(range(:,1), hf_score);
axis([a(1) a(2) -0.5 1.5]);
grid on;
if (titles)
title('Unadjusted Voiced Fricative Score');
end;
subplot(313);
stairs(range(:,1), vfr_score);
axis([a(1) a(2) -0.5 1.5]);
grid on;
if (titles)
title('Final Voiced Fricative Score');
end;
drawnow;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% save to disk
s=sprintf('saving ./%s_VFRscore to disk ...', name);
disp(s);
s=sprintf('save temp/%s_VFRscore vfr_score', name);
eval(s);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% clean up time
clear HF_thresh_HI m
clear HF_thresh_LOW mag
clear MFO meanfrq
clear N n
clear PLT
clear R power
clear SON_DECISION_THRESH range
clear VFRIC_thresh residue
clear VUS_voicetype s1
clear a seg_cnt
clear b seg_frames
clear cofa signal
clear events son_score
clear f stddevfrq
clear file_string total_mag
clear flg vfr_score
clear h titles
clear hf_score voicetype
clear i w
clear j old_vfr_score
s=sprintf('clear %s', name);
eval(s);
clear s
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?