www.pudn.com > voiceprocessingtoolbox.rar > cepstrum.m


function out=hps(frame, plotOpt) 
% hps: Harmonic product spectrum method for pitch tracking 
 
if nargin<1; selfdemo; return; end 
if nargin<2; plotOpt=0; end 
 
frameSize=length(frame); 
frame2=frame.*hamming(length(frame));		% 乘上 hamming window 
%frame2 = [frame2; zeros(frameSize, 1)];	% Zero-padding to increase the resolution of spectrum 
powerSpec=abs(fft(frame2)); 
lastIndex=round(frameSize/2)+1; 
powerSpec=powerSpec(1:lastIndex); 
cepstrum=abs(fft(log(powerSpec))); 
index2=round(powerSpec/2)+1; 
cepstrum=cepstrum(1:index2); 
 
if plotOpt 
	plotNum=3; 
	subplot(plotNum,1,1); 
	plot(1:length(frame), frame, '.-'); axis tight; 
	title('Frame'); 
	 
	subplot(plotNum,1,2); 
	h=plot(1:length(powerSpec), powerSpec, 'g-', 1:length(powerSpec), powerSpec, 'k.'); 
	set(h(1), 'linewidth', 2); 
	set(gca, 'xlim', [1, lastIndex]); 
	title('Power spectrum');	 
	 
	subplot(plotNum,1,3); 
	plot(1:length(cepstrum), cepstrum); 
end 
 
% ====== Self demo 
function selfdemo 
waveFile = 'soo.wav'; startIndex=round(16538); frameSize=512; 
%waveFile='清華大學資訊系.wav'; startIndex=7452; frameSize=256; 
 
[y, fs, nbits] = wavread(waveFile); 
y = y*(2^nbits/2); 
time=(1:length(y))/fs; 
 
endIndex=startIndex+frameSize-1; 
frame = y(startIndex:endIndex); 
 
plot(time, y); title(waveFile); axis tight 
ylim=get(gca, 'ylim'); 
line([time(startIndex), time(startIndex)], ylim, 'color', 'r'); 
line([time(endIndex), time(endIndex)], ylim, 'color', 'r'); 
 
figure; 
feval(mfilename, frame, 1);