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
|