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');