annotate extra/peaks.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 %Hecho con Álvaro
yading@10 2 function y=peaks(x,w,N,H,t)
yading@10 3 %Analysis/sysntesis of a sound using the peaks
yading@10 4 %of the short-time fourier transform
yading@10 5 %x: input sound
yading@10 6 %w: analysis window (odd size)
yading@10 7 %N: FFT size
yading@10 8 %H: hop size
yading@10 9 %t: treshold in negative dB
yading@10 10 %y: output sound
yading@10 11
yading@10 12 %Internal variables
yading@10 13 M=length(w);
yading@10 14 N2=N/2+1;
yading@10 15 soundlength=length(x);
yading@10 16 hM=(M-1)/2;
yading@10 17
yading@10 18 %Pointers
yading@10 19 pin=1+hM;
yading@10 20 pend=soundlength-hM;
yading@10 21
yading@10 22 %Initialize buffers
yading@10 23 fftbuffer=zeros(N,1);
yading@10 24 yw=zeros(M,1);
yading@10 25 y=zeros(soundlength,1);
yading@10 26
yading@10 27 while pin<pend
yading@10 28 xw=x(pin-hM:pin+hM).*w(1:M); %Frame selector
yading@10 29 fftbuffer=zeros(N,1); %Zero-phase windowing
yading@10 30 fftbuffer(1:(M+1)/2)=xw((M+1)/2:M);
yading@10 31 fftbuffer(N-(M-1)/2+1:N)=xw(1:(M-1)/2);
yading@10 32
yading@10 33 X=fft(fftbuffer); %FFT Performance
yading@10 34 mX=20*log10(abs(X(1:N2))); %Compute FFT Magnitude
yading@10 35 pX=phase(X(1:N2)); %Compute FFT Phase
yading@10 36
yading@10 37 ploc=1+find((mX(2:N2-1)>t).*(mX(2:N2-1)>mX(3:N2)).*(mX(2:N2-1)>mX(1:N2-2))); %Peak search (levels above threshold)
yading@10 38 pmag=mX(ploc); %Find the peak magnitude
yading@10 39 pphase=pX(ploc); %Find the peak phase
yading@10 40 % posipeak=length(ploc)/2; %Just positive peaks
yading@10 41
yading@10 42 axis=linspace(0,pi,abs(N2)); %Axis for the whole frequency plotting
yading@10 43 axis_peak=axis(ploc);%Axis for just the peaks plotting
yading@10 44
yading@10 45 subplot(2,1,1); plot(axis,mX); hold on ; %Magnitude plotting
yading@10 46 plot(axis_peak,pmag,'rx');hold off;%Magnitude peaks plot red x’s
yading@10 47 subplot(2,1,2); plot(axis,pX); hold on ;%Phase plotting
yading@10 48 plot(axis_peak,pphase,'rx');hold off;%Phase peaks plot red x’s
yading@10 49 getframe;
yading@10 50 pin=pin+H; %Advance the pointer
yading@10 51 end