bar2st.m
来自「这是一个用于语音信号处理的工具箱」· M 代码 · 共 237 行
M
237 行
disp(' ');
disp('SCRIPT: bar2st.m ***********************************************');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% jmw
% 1/12/94
% 1/5/94
%
% playing with Weinstein, et al., algorithm for parsing based
% upon RMS values of BP filters
% gain calculated from sqrt of res NRG
%
% AS A RESULT, IT IS USED TO: detect voice bars (which look similar
% to nasals in my other algorithms ...
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PLT = 1; % flag to plot results
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% compute freq response
disp('calculating bar ratio ...');
N=256;
start1 = 2;
stop1 = 34;
start2 = 35;
stop2=N;
[m,n]=size(cofa);
bar = zeros(m,1);
e1 = zeros(m,1);
e2 = zeros(m,1);
gain = zeros(m,1);
for i=1:m-1,
if(VUS_voicetype(i)=='v' )
a = range(i,1);
b = range(i,2);
%res_nrg = residue(a:b) * residue(a:b)' ;
%gain(i) = sqrt(res_nrg); % removed 9/30/94 jmw
gain(i) = 1;
[h,w]=freqz(gain(i),cofa(i,:),N);
mag=abs(h);
e1(i)=sqrt(mag(start1:stop1)' * mag(start1:stop1));
e2(i) = sqrt(mag(start2:stop2)' * mag(start2:stop2));
bar(i) = e1(i) /e2(i);
else
;
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% smooth bar ratio
MFO = 5; % old value was 3; % median filter order
s=sprintf('smoothing bar ratio with median filter of order %d ...', MFO);
disp(s);
bar=median1(bar,MFO);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% calculate bar score
bar_score = zeros(1,m);
B_thresh_HI = 30; % empirically determined
B_thresh_LOW = 10;
R = B_thresh_HI - B_thresh_LOW;
B_line_HI = B_thresh_HI * ones(1,14000);
B_line_LOW = B_thresh_LOW * ones(1,14000);
BAR_NOISE_FLOOR = 0.05;
for i=1:m,
if ( bar(i) > B_thresh_HI )
bar_score(i) = 1;
elseif ( bar(i) > B_thresh_LOW )
bar_score(i) = (bar(i)-B_thresh_LOW) / R;
end;
if bar_score(i) < BAR_NOISE_FLOOR
bar_score(i) = 0;
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% segment
seg_cnt = 0;
flg = 1;
for i = 1:m,
if ( bar_score(i) > 0 & flg == 1)
% start new segment
seg_cnt = seg_cnt + 1;
seg_frames(seg_cnt,1) = i;
flg = 0;
elseif ( bar_score(i) > 0 & flg==0)
% continue in current segment
seg_frames(seg_cnt,2) = i;
elseif ( bar_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;
BAR_thresh = 300;
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) < BAR_thresh)
% discard - too short
events = events + 1; % counter of segments eliminated
a=seg_frames(i,1);
b=seg_frames(i,2);
bar_score(a:b) = zeros(1,b-a+1);
end;
end;
end;
s=sprintf('eliminating bar segments less than');
s1 = sprintf(' %d samples: ... %d events',BAR_thresh,events);
s=[s s1];
disp(s);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if (PLT)
titles = 1; % turn off for diss figs
disp('plotting results ...');
h=gcf;
figure(h);
clf;
subplot(311);
plot(signal);
grid;
axis_1=axis;
axis(axis_1);
s=sprintf('%s', name);
if (titles)
title(s);
end;
subplot(312);
stairs(range(:,1),bar);
axis([axis_1(1) axis_1(2) 0 50]);
hold on;
%plot(range(:,1), B_line_LOW, ':');
%plot(range(:,1), B_line_HI, ':');
plot( B_line_LOW, '--');
plot( B_line_HI, '--');
hold off;
grid;
s=sprintf('smoothed bar ratio - order %d median filter', MFO);
if (titles)
title(s);
end;
subplot(313);
stairs(range(:,1), bar_score);
grid on;
axis([axis_1(1) axis_1(2) -0.5 1.5]);
if (titles)
title('(Voice) Bar Score');
end;
drawnow;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% save to disk
s=sprintf('saving ./%s_BARscore to disk ...', name);
disp(s);
s=sprintf('save temp/%s_BARscore bar_score', name);
eval(s);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% clean up time
clear BAR_NOISE_FLOOR bar_score range
clear BAR_thresh cofa res_nrg
clear B_line_HI e1 residue
clear B_line_LOW e2 s1
clear B_thresh_HI events seg_cnt
clear B_thresh_LOW file_string seg_frames
clear MFO flg signal
clear N gain start1
clear PLT h start2
clear R i stop1
clear VUS_voicetype m stop2
clear a mag voicetype
clear axis_1 n w
clear b
clear bar power titles
s=sprintf('clear %s',name);
eval(s);
clear s
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?