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 |