INTERPOLAZIONE USANDO LA DFT A questo punto possiamo costruire un interpolatore utilizzando però la DFT, mettendo sempre in evidenza l’effetto del ricampionamento di un fattore non intero e dell’interpolazione su dati non sufficientemente sovracampionati come fatto per gli altri interpolatori. interdft.m %
COSTRUZIONE DI UN CAMPIONATORE CON L'USO DELLA DFT %
Considereremo un segnale generico da introdurre dall'esterno %
può essere inserito anche un fattore non intero di ricampionamento comunque
sempre %
maggiore di 1 e il periodo di campionamento può essere generico clear
all tempo=input('inserisci
l''istante finale MINIMO di rappresentazione del segnale (in sec) : '); f1=input('inserisci
la frequenza di campionamento (in Hz) : '); T1=1/f1; err=0; while
err==0 F=input('inserisci il
nome della function contenente il segnale : ','s');
if
exist(F)==0
disp('LA
FUNZIONE INTRODOTTA NON ESISTE');
else
err=1;
end end valore=input('introduci
il fattore di ricampionamento : '); [N,D]
= rat(valore); n=(tempo/T1)+1; l=fix(n/D); if
n~=l*D
n=l*D;
disp('l''effettiva
finestra temporale in secondi è : '); tempo=(n-1)*T1 end Nz=(N-D)*l; T=1/(100*f1); n=(tempo/T)+1; k=(1:1:n); x=(k-1)*T; y=feval(F,x); x=(k-1)*T*1000; figure plot(x,y,'y'); xlabel('ms'); hold
on T=T1; n=(tempo/T)+1; k=(1:1:n); x=(k-1)*T; y=feval(F,x); x=x*1000; if
length(x)<40
plot(x,y,'r*'); else
plot(x,y,'r'); end hold
off figura=gcf; ff=fft(y); figure freq=[0:f1/n:f1*(1-1/n)]; plot(freq,abs(ff)) xlabel('f
[ Hz ]') title('FFT
del segnale di partenza') if
n<55
hold on
plot(freq,abs(ff),'r+');
hold off end zoom if
(fix(n/2))*2~=n
ffi=[ff(1:1:(n+1)/2),zeros(1,Nz),ff((n+3)/2:1:n)]; else
ffi=[ff(1:1:n/2),zeros(1,Nz),ff((n/2)+1:1:n)]; end freq=[0:(f1*valore)/(n+Nz):f1*valore*(1-1/(n+Nz))]; figure plot(freq,abs(ffi)); if
n*valore<55
hold on
plot(freq,abs(ffi),'r+');
hold off end xlabel('f
[ Hz ]') title('FFT
del segnale in cui sono stati aggiunti gli zeri') zoom yi=ifft(ffi); yi=valore*yi; m=length(yi); xi=[x(1):(x(n)-x(1))/(n+Nz-valore):x(n)*(1+(valore-1)/(n+Nz-valore))]; figure(figura) hold
on if
m<65
plot(xi,real(yi),'b+'); else
plot(xi,real(yi),'b'); end hold
off zoom segnale.m function
f=segnale(x); f=sin(2*pi*200*x)+sin(2*pi*350*x+pi/7)+sin(2*pi*420*x-pi/4);
% la frequenza è in Hz impulso.m function
i=impulso(x) n=length(x); i(n)=0; i(round(n/2))=1; rect1.m function
r=rect1(x) n=length(x); r(n)=0; for
i=round(2*n/5) : round(3*n/5)
r(i)=1; end
rect2.m function
r=rect2(x) n=length(x); r(n)=0; for
i=round(49*n/100) : round(51*n/100)
r(i)=1; end
|