yading@11: function [y,yh,ys,fr0] = hpsmodel(x,fs,w,N,t,nH,minf0,maxf0,f0et,maxhd,stocf) yading@11: %=> analysis/synthesis of a sound using the sinusoidal harmonic model yading@11: % x: input sound, fs: sampling rate, w: analysis window (odd size), yading@11: % N: FFT size (minimum 512), t: threshold in negative dB, yading@11: % nH: maximum number of harmonics, minf0: minimum f0 frequency in Hz, yading@11: % maxf0: maximim f0 frequency in Hz, yading@11: % f0et: error threshold in the f0 detection (ex: 5), yading@11: % maxhd: max. relative deviation in harmonic detection (ex: .2) yading@11: % stocf: decimation factor of mag spectrum for stochastic analysis yading@11: % y: output sound, yh: harmonic component, ys: stochastic component yading@11: yading@11: %x=tanh(10*x); yading@11: yading@11: M = length(w); % analysis window size yading@11: Ns = 1024; % FFT size for synthesis yading@11: H = 256; % hop size for analysis and synthesis yading@11: N2 = N/2+1; % half-size of spectrum yading@11: soundlength = length(x); % length of input sound array yading@11: hNs = Ns/2; % half synthesis window size yading@11: hM = (M-1)/2; % half analysis window size yading@11: pin = max(hNs+1,1+hM); % initialize sound pointer to middle of analysis window yading@11: pend = soundlength-max(hM,hNs); % last sample to start a frame yading@11: fftbuffer = zeros(N,1); % initialize buffer for FFT yading@11: yh = zeros(soundlength+Ns/2,1); % output sine component yading@11: ys = zeros(soundlength+Ns/2,1); % output residual component yading@11: w = w/sum(w); % normalize analysis window yading@11: sw = zeros(Ns,1); yading@11: ow = triang(2*H-1); % overlapping window yading@11: ovidx = Ns/2+1-H+1:Ns/2+H; % overlap indexes yading@11: sw(ovidx) = ow(1:2*H-1); yading@11: bh = blackmanharris(Ns); % synthesis window yading@11: bh = bh ./ sum(bh); % normalize synthesis window yading@11: wr = bh; % window for residual yading@11: sw(ovidx) = sw(ovidx) ./ bh(ovidx); yading@11: sws = H*hanning(Ns); % synthesis window for stochastic yading@11: yading@11: i = 0; yading@11: while pint) .* (mX(2:N2-1)>mX(3:N2)) ... yading@11: .* (mX(2:N2-1)>mX(1:N2-2))); % find peaks yading@11: [ploc,pmag,pphase] = peakinterp(mX,pX,ploc); % refine peak values yading@11: f0 = f0detection(mX,fs,ploc,pmag,f0et,minf0,maxf0); % find f0 yading@11: fr0(i)=f0; yading@11: hloc = zeros(nH,1); % initialize harmonic locations yading@11: hmag = zeros(nH,1)-100; % initialize harmonic magnitudes yading@11: hphase = zeros(nH,1); % initialize harmonic phases yading@11: hf = (f0>0).*(f0.*(1:nH)); % initialize harmonic frequencies yading@11: hi = 1; % initialize harmonic index yading@11: npeaks = length(ploc); % number of peaks found yading@11: while (f0>0 && hi<=nH && hf(hi)