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)