view extra/peakseaker.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=peaks(x,w,N,H,t) 
%Analysis/sysntesis of a sound using the peaks 
%of the short-time fourier transform 
%x: input sound 
%w: analysis window (odd size) 
%N: FFT size 
%H: hop size 
%t: treshold in negative dB 
%y: output sound 
  
%Internal variables 
M=length(w); 
N2=N/2+1; 
soundlength=length(x); 
hM=(M-1)/2; 
 
%Pointers 
pin=1+hM; 
pend=soundlength-hM; 
  
%Initialize buffers 
fftbuffer=zeros(N,1); 
yw=zeros(M,1); 
y=zeros(soundlength,1); 
 
while pin<pend 
    xw=x(pin-hM:pin+hM).*w(1:M);           %Frame selector 
    fftbuffer=zeros(N,1);                  %Zero-phase windowing 
    fftbuffer(1:(M+1)/2)=xw((M+1)/2:M); 
    fftbuffer(N-(M-1)/2+1:N)=xw(1:(M-1)/2); 
     
    X=fft(fftbuffer);           %FFT Performance 
    mX=20*log10(abs(X(1:N2)));  %Compute FFT Magnitude 
    pX=phase(X(1:N2));     %Compute FFT Phase 
     
   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) 
    pmag=mX(ploc);              %Find the peak magnitude 
    pphase=pX(ploc);            %Find the peak phase 
    posipeak=length(ploc)/2;    %Just positive peaks 
 
    axis=linspace(0,pi,abs(N2));    %Axis for the whole frequency plotting 
    axis_peak=axis(ploc(1:num_peak));%Axis for just the peaks plotting 
  
    subplot(2,1,1); plot(axis,mX); hold off ; %Magnitude plotting 
    plot(axis_peak,pmag(1:posipeak),'rx');%Magnitude peaks plot red x’s 
    subplot(2,1,2); plot(axis,pX); hold off ;%Phase plotting 
    plot(axis_peak,pphase(1:posipeak),'rx');%Phase peaks plot red x’s 
 
    pin=pin+H;                  %Advance the pointer 
end