annotate extra/stpt.m @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 function y= stpt(x,w,N,H,t)
yading@10 2 M=length(w); % Window size
yading@10 3 pin=0; % Start pointer
yading@10 4 pend=length(x)-M; % End pointer
yading@10 5 y=zeros(1,length(x)); % Inicial. output
yading@10 6 npeaks=0; % Number of peaks
yading@10 7 w=w./sum(w); % Analy. Windw. Norm.
yading@10 8 w_out=hanning(M)'; % Synthesis window.
yading@10 9 w_out=w_out./sum(w_out); % Synth. Windw. Norm.
yading@10 10 while(pin<pend) % Until the end...
yading@10 11 %---Analysis
yading@10 12 x_w=x(pin+1:pin+M).*w(1:M); % Windowing signal
yading@10 13 fftbuffer=[x_w, zeros(1,N-M)]; % Zero-padding
yading@10 14 fftbuffer=circshift(fftbuffer,[0,-(M-1)/2]);% Zero-phase shift
yading@10 15 X=fft(fftbuffer,N); % FFT
yading@10 16 Xmag=20*log10(abs(X(1:N/2+1))); % Magnitude in dBs
yading@10 17 Xphase=unwrap(angle(X(1:N/2+1))); % Phase
yading@10 18 %---Transformation Xmag and Xphase
yading@10 19 ploc = 1+find((Xmag(2:N/2)>t).*(Xmag(2:N/2)>Xmag(3:N/2+1)).*(Xmag(2:N/2)>Xmag(1:N/2-1))); % Find the local max.
yading@10 20 npeaks=npeaks+length(ploc);
yading@10 21 pphase=Xphase(ploc); % Save phase values
yading@10 22 pmag=Xmag(ploc); % Save mag. values
yading@10 23 %plot_peaks(Xmag,Xphase,ploc,t); % Plotting peaks
yading@10 24 Xmag=zeros(1,N/2+1)-1000; % Modifying Xmag...
yading@10 25 Xphase=zeros(1,N/2+1); % Modifying Xphase...
yading@10 26 %ploc=round(ploc.*0.96); % Transposition (fx)
yading@10 27 %ploc=10:10:10*length(ploc); % Harmonics mapping(fx)
yading@10 28 Xmag(ploc)=pmag; % Add the mag maxs.
yading@10 29 Xphase(ploc)=pphase; % Add the phase maxs.
yading@10 30 %---Synthesis
yading@10 31 Y(1:N/2+1) = 10.^(Xmag/20).*exp(1i.*Xphase);% Generate posit. freq.
yading@10 32 Y(N/2+2:N) = conj(fliplr(Y(2:N/2))); % Generate negat. freq
yading@10 33 fftbuffer_out=real(ifft(Y)); % Clean the signal
yading@10 34 fftbuffer_out=circshift(fftbuffer_out,[0,+(M-1)/2]);
yading@10 35 % Undo zero-phasing
yading@10 36 y(pin+1:pin+M)=y(pin+1:pin+M)+H*N*fftbuffer_out(1:M).*w_out;
yading@10 37 % Overlap-add method
yading@10 38 pin=pin+H; % Advance pointer
yading@10 39 end