BANCO DI FILTRI Con questo programma verrà dimensionato un banco di filtri come combinazione di un filtro polifase e FFT. Il procedimento seguito consiste nello scomporre lo spettro di un generico segnale in un numero di canali da noi fissato a priori, utilizzando un opportuno filtro passabasso e sottocampionando sia la risposta all’impulso del segnale che del filtro per il numero di canali considerati. La risposta all’impulso del filtro è introdotta utilizzando una workspace ossia un file di dati di MATLAB ( hanno estensione ‘mat’ ). banco.m %
PROGETTO DI UN BANCO DI FILTRI ( decomposizione multicanale del segnale )
%
La risposta all'impulso del filtro passabasso verrà introdotta dall'esterno %
Lo spettro del segnale introdotto quindi sarà suddiviso in un numero di
blocchi pari %
a quelli richiesti dalle nostre specifiche per cui non ci sarà alcuna
elaborazione %
del segnale in queste bande clear
all err=0; while
err==0
disp('inserisci il nome
del file (.mat) contenente i campioni '); H=input('della risposta
all''impulso del filtro passabasso : ','s');
H=[H,'.mat'];
if exist(H)==0
disp('LA
WORKSPACE INTRODOTTA NON ESISTE');
else
err=1;
end end load(H); N=length(h); strN=int2str(N); disp(['la
risposta all''impulso del filtro è composta da ',strN,'
campioni']); err=0; while
err==0
M=input('introduci
il numero di canali : '); if M>N disp('Il
numero di canali richiesto è troppo elevato! ');
else
err=1;
end end if
floor(N/M)~=ceil(N/M)
h=[h',zeros(1,M-mod(N,M))]; disp('ATTENZIONE : il
rapporto tra la lunghezza della risposta all''impulso '); disp('
del filtro e il numero di canali non è un numero intero! ');
N=length(h); end K=N/M; 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 f=feval(F); L=length(f); [H,w]=freqz(h,1,L); figure plot(w/(2*pi),abs(H)) xlabel('f/fc') set(gcf,'color',[1,1,1]); title('spettro
del filtro utilizzato') axis([min(w/(2*pi))
max(w/(2*pi)) 0 max(abs(H))]) for
m=1:M
for k=0:K-1
hh(k+1)=h(k*M+m);
end
pass1=[zeros(1,m-1)
f];
for k=0:floor((L-1)/M)
ff(k+1)=pass1(k*M+1);
end
pass2=conv(ff,hh);
lung=length(ff);
convol(:,m)=pass2(1:lung)';
clear
ff hh end for
i=1:lung
dft(i,:)=fft(convol(i,:)); end for
i=1:M spettro(:,i)=abs(fft(dft(:,i)))*M; end mas=max(max(spettro)); freq=(-1/(2*M):1/(M*lung):(1/(2*M))*(1-1/(M*lung)))+1/M; for
i=1:M
figure
freq=freq-1/M; plot(freq,[spettro(ceil(lung/2)+1:lung,i)' spettro(1:floor(length(spettro)/2)+1,i)']) xlabel('f/fc')
set(gcf,'color',[1,1,1]);
stri=int2str(i); title(['spettro del
segnale nella banda ',stri])
axis([min(freq)
max(freq) 0 mas]) fine=[spettro(ceil(lung/2)+1:lung,i)' spettro(1:floor(length(spettro)/2)+1,i)'
fine]; end figure freq=((1/(2*M))-1:1/(M*lung):(1/(2*M))*(1-1/(M*lung))); plot(freq,fine) xlabel('f/fc') set(gcf,'color',[1,1,1]); title('spettro
del segnale rimettendo insieme tutte le bande')
function
vet=sinus1; tempo=500e-3; T=5/50010; f1=500; f2=1500; f3=2500; f4=3500; f5=4500; campioni=tempo/T; k=(1:1:campioni); xf=(k-1)*T; yf=(sin(2*pi*f1*xf)+0.8*sin(2*pi*f2*xf)+0.6*sin(2*pi*f3*xf)+...
0.4*sin(2*pi*f4*xf)+0.2*sin(2*pi*f5*xf)); vet=yf; figure plot(xf,yf); xlabel('sec'); set(gcf,'color',[1,1,1]); title('grafico
del segnale nel tempo'); zoom ff=abs(fft(yf)); figure freq=[-1/2:1/campioni:(1/2)*(1-1/campioni)]; plot(freq,[ff(ceil(campioni/2):campioni)
ff(1:floor(campioni/2))]); xlabel('f/fc'); set(gcf,'color',[1,1,1]); title('spettro del segnale'); function
r=triang; f=5000;
tempo=500e-3; T=1/10000; campioni=(tempo/T)+1; k=(1:campioni); x=(k-(length(k)+1)/2)*T; for
i=1:length(x)
if i~=(length(k)+1)/2
y(i)=2*(sin(pi*f*x(i))./(pi*(T^-1)*x(i))).^2;
end end y((length(k)+1)/2)=2*(f*T)^2; r=y; figure plot(x*1000,y); xlabel('ms'); set(gcf,'color',[1,1,1]); title('grafico
del segnale nel tempo'); ff=abs(fft(r)); figure freq=[-1/2:1/campioni:(1/2)*(1-1/campioni)]; plot(freq,[ff(ceil(campioni/2):campioni)
ff(1:floor(campioni/2))]); xlabel('f/fc'); set(gcf,'color',[1,1,1]); title('spettro
del segnale'); workspace utilizzate ( filtri passabasso ) (scaricare
i seguenti file con estensione .MAT) 1) Basso1_4.mat : banda passante compresa tra f1 = 0 Hz e f2 = 0,125·fc Hz Il filtro viene utilizzato per la scomposizione in 4 canali dello spettro di un generico segnale. All’interno della workspace è presente un vettore di 204 elementi.
2) Basso1_5.mat : banda passante compresa tra f1 = 0 Hz e f2 = 0,1·fc Hz Il filtro viene utilizzato per la scomposizione in 5 canali dello spettro di un generico segnale. All’interno della workspace è presente un vettore di 205 elementi.
Entrambi realizzati con un filtro FIR in cui è usata una finestra rettangolare. 3) Basso2_4.mat : banda passante compresa tra f1 = 0 Hz e f2 = 0,125·fc Hz Il filtro viene utilizzato per la scomposizione in 4 canali dello spettro di un generico segnale. All’interno della workspace è presente un vettore di 204 elementi.
4) Basso2_5.mat : banda passante compresa tra f1 = 0 Hz e f2 = 0,1·fc Hz Il filtro viene utilizzato per la scomposizione in 5 canali dello spettro di un generico segnale. All’interno della workspace è presente un vettore di 205 elementi.
Entrambi realizzati con un filtro FIR in cui è usata una finestra di Hamming. 5)
Basso3_5.mat : banda passante compresa tra
f1 = 0 Hz e
f2 = 0,1·fc Hz
Il filtro viene utilizzato per la scomposizione in 5 canali dello spettro di un generico segnale. All’interno
della workspace è presente un vettore di 205 elementi. Realizzato con un filtro FIR a fase lineare secondo l’approssimazione di Chebyshev, utilizzando l’algoritmo di Remez: la banda di transizione fissata è compresa tra ft1 = 0,095 · fc Hz e ft2 = 0,105 · fc Hz ed inoltre il valore del ripple fissato nella banda passante e arrestata è lo stesso.
ALTRO ESEMPIO: vedere che filtro è il seguente file .MAT
|