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 + -
显示快捷键?