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


function [localMinIndex, localMinValue, allLocalMinIndex]=amdf2ppc(amdf, fs, nbits, PP, plotOpt) 
% amdf2ppc: AMDF to pitch period candidates (PPC) 
%	Usage: localMinIndex=amdf2ppc(amdf, fs, PP, plotOpt) 
%			amdf: AMDF from integer-based wave input 
 
%	Roger Jang, 20040524 
 
if nargin<1, selfdemo; return; end 
if nargin<2, fs=8000; end 
if nargin<3, nbits=8; end 
if nargin<4, PP=ptParamSet(fs, nbits); end 
if nargin<5, plotOpt=0; end 
 
if isempty(PP), PP=ptParamSet(fs, nbits); end 
PP.dpUseLocalOptim=1; 
 
PP.minPeriod=round(PP.fs/pitch2freq(PP.maxPitch)); 
PP.maxPeriod=round(PP.fs/pitch2freq(PP.minPitch)); 
 
% ====== 找出 pitch period candidate 的點 
if PP.dpUseLocalOptim			% Method 1: Use local minima as the PPC (primary pitch candidates) 
	allLocalMinIndex=localMinMex(amdf); 
	localMinIndex=allLocalMinIndex; localMinValue=amdf(localMinIndex); 
	if isempty(localMinIndex), amdf2ppcPlot(amdf, localMinIndex, allLocalMinIndex, PP, plotOpt); return; end 
else					% Method 2: Use all possible points as the PPC! 
	allLocalMinIndex=1:length(amdf); 
	localMinIndex=allLocalMinIndex; 
	localMinValue=amdf; 
end 
%fprintf('length(localMinIndex)=%d\n', length(localMinIndex)); 
 
% ====== 拿掉小於 PP.minPeriod 或大於 PP.maxPeriod 的 localMinIndex 
index=find(localMinIndex-1PP.maxPeriod); 
localMinIndex(index)=[];  localMinValue=amdf(localMinIndex); 
if isempty(localMinIndex), amdf2ppcPlot(amdf, localMinIndex, allLocalMinIndex, PP, plotOpt); return; end 
 
% ====== 只保留 PP.ppcNum 個 localMinIndex 
%localMinValue=amdf(localMinIndex); 
%[junk, index]=sort(localMinValue); 
%if length(index)>PP.ppcNum 
%	localMinIndex=localMinIndex(index(1:min(PP.ppcNum,length(index)))); 
%end 
%localMinValue=amdf(localMinIndex); 
 
% 進行倍頻轉換:將可能是倍頻的AMDF值降低 
%threshold=round(max(amdf)/2); 
%amdfDeduct=round(max(amdf)/16); 
%amdfDeduct=0; 
%for i=1:length(localMinIndex) 
%	for j=1:length(localMinIndex) 
%		if localMinValue(i)