www.pudn.com > audioProcessingtoolbox.rar > frame2clarity.m


function clarity = frame2clarity(frameMat, fs, method); 
% frame2clarity: Frame (or frame matrix) to clarity 
%	Usage: clarity = frame2clarity(frameMat, fs, method); 
%			frameMat: a column vector of a frame, or a matrix where each column is a frame 
%			fs: sampling rate 
%			method: 'acf', 'nsdf', or 'amdf' 
% 
%	For example: 
%		waveFile='二十四橋明月夜.wav'; 
%		[y, fs, nbits]=wavReadInt(waveFile); 
%		frameSize=512; overlap=0; 
%		frameMat=buffer2(y, frameSize, overlap); 
%		frameMat=frameZeroMean(frameMat, 2); 
%		frameNum=size(frameMat, 2); 
%		clarity1=frame2clarity(frameMat, fs, 'acf'); 
%		clarity2=frame2clarity(frameMat, fs, 'nsdf'); 
%		clarity3=frame2clarity(frameMat, fs, 'amdf'); 
%		time=(1:length(y))/fs; 
%		frameTime=frame2sampleIndex(1:frameNum, frameSize, overlap)/fs; 
%		subplot(2,1,1); plot(time, y); axis tight; ylabel('Amplitude'); title(waveFile); 
%		subplot(2,1,2); plot(frameTime, [clarity1; clarity2; clarity3]', '.-'); axis tight; ylabel('Clarity'); grid on 
%		legend('method=acf', 'method=nsdf', 'method=amdf'); 
 
%	Roger Jang, 20070417 
 
if nargin<1, selfdemo; return; end 
if nargin<2, method=1; end 
 
[frameSize, frameNum]=size(frameMat); 
% Zero justification 
for i=1:frameNum 
	frameMat(:,i)=frameMat(:,i)-mean(frameMat(:,i)); 
end 
 
minPitch=30; 
maxPitch=84; 
index1=round(fs/pitch2freq(maxPitch)); 
index2=min(round(fs/pitch2freq(minPitch)), frameSize); 
 
clarity=zeros(1, frameNum); 
switch method 
	case 'acf' 
		for i=1:frameNum 
			frame=frameMat(:,i); 
			acf=frame2acfMex(frame, length(frame), 2); 
			maxAcf=max(acf(index1:index2)); 
			clarity(i)=maxAcf/acf(1); 
		end 
	case 'nsdf' 
		for i=1:frameNum 
			frame=frameMat(:,i); 
			nsdf=frame2nsdfMex(frame, length(frame), 2); 
			clarity(i)=max(nsdf(index1:index2)); 
		end 
	case 'amdf' 
		for i=1:frameNum 
			frame=frameMat(:,i); 
			amdf=frame2smdfMex(frame, length(frame), 2); 
			minAmdf=min(amdf(index1:index2)); 
			maxAmdf=max(amdf(index1:index2)); 
			clarity(i)=1-minAmdf/maxAmdf; 
		end 
	otherwise 
		error('Unknown method!'); 
end 
 
 
% ====== Self demo 
function selfdemo 
waveFile='二十四橋明月夜.wav'; 
[y, fs, nbits]=wavReadInt(waveFile); 
frameSize=512; overlap=0; 
frameMat=buffer2(y, frameSize, overlap); 
frameMat=frameZeroMean(frameMat, 2); 
frameNum=size(frameMat, 2); 
clarity1=frame2clarity(frameMat, fs, 'acf'); 
clarity2=frame2clarity(frameMat, fs, 'nsdf'); 
clarity3=frame2clarity(frameMat, fs, 'amdf'); 
time=(1:length(y))/fs; 
frameTime=frame2sampleIndex(1:frameNum, frameSize, overlap)/fs; 
subplot(2,1,1); plot(time, y); axis tight; ylabel('Amplitude'); title(waveFile); 
subplot(2,1,2); plot(frameTime, [clarity1; clarity2; clarity3]', '.-'); axis tight; ylabel('Clarity'); grid on 
legend('method=acf', 'method=nsdf', 'method=amdf');