Mercurial > hg > pmhd
view 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 |
line wrap: on
line source
function y= stpt(x,w,N,H,t) M=length(w); % Window size pin=0; % Start pointer pend=length(x)-M; % End pointer y=zeros(1,length(x)); % Inicial. output npeaks=0; % Number of peaks w=w./sum(w); % Analy. Windw. Norm. w_out=hanning(M)'; % Synthesis window. w_out=w_out./sum(w_out); % Synth. Windw. Norm. while(pin<pend) % Until the end... %---Analysis x_w=x(pin+1:pin+M).*w(1:M); % Windowing signal fftbuffer=[x_w, zeros(1,N-M)]; % Zero-padding fftbuffer=circshift(fftbuffer,[0,-(M-1)/2]);% Zero-phase shift X=fft(fftbuffer,N); % FFT Xmag=20*log10(abs(X(1:N/2+1))); % Magnitude in dBs Xphase=unwrap(angle(X(1:N/2+1))); % Phase %---Transformation Xmag and Xphase 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. npeaks=npeaks+length(ploc); pphase=Xphase(ploc); % Save phase values pmag=Xmag(ploc); % Save mag. values %plot_peaks(Xmag,Xphase,ploc,t); % Plotting peaks Xmag=zeros(1,N/2+1)-1000; % Modifying Xmag... Xphase=zeros(1,N/2+1); % Modifying Xphase... %ploc=round(ploc.*0.96); % Transposition (fx) %ploc=10:10:10*length(ploc); % Harmonics mapping(fx) Xmag(ploc)=pmag; % Add the mag maxs. Xphase(ploc)=pphase; % Add the phase maxs. %---Synthesis Y(1:N/2+1) = 10.^(Xmag/20).*exp(1i.*Xphase);% Generate posit. freq. Y(N/2+2:N) = conj(fliplr(Y(2:N/2))); % Generate negat. freq fftbuffer_out=real(ifft(Y)); % Clean the signal fftbuffer_out=circshift(fftbuffer_out,[0,+(M-1)/2]); % Undo zero-phasing y(pin+1:pin+M)=y(pin+1:pin+M)+H*N*fftbuffer_out(1:M).*w_out; % Overlap-add method pin=pin+H; % Advance pointer end