PDA

View Full Version : FILTRO ELIMINA BANDA IN MATLAB


gela
31-05-2010, 19:08
Buongiorno, devo eliminare un rumore del tipo A*cos(w0*t), causato da effetto Larsen, da un segnale audio. Ipotizzando di conoscere la frequenza fondamentale 'f0'del rumore devo costruire un filtro.
Io avevo pensato ad un gradino+rect+gradino, opportunamente scalati e traslati, con il quale moltiplicare la trasformata di fourier del segnale. Il filtro in codice è questo:
function [y]= filtro2(s, Fs, f0)

N=length(s);
FTs=fftshift(fft(s));
ff=(-Fs/2):Fs/N:((Fs/2)-(Fs/N)); %asse freq
Df=abs(ff(2)-ff(1));

%Filtro
filtro=(gradino(-ff-(f0+Df))+rect(ff/(2*(f0-Df)))+gradino(ff-(f0+Df)));

figure(2)
plot(ff, filtro)
xlabel('f')
ylabel('S(f)')
title('Filtro applicato al segnale')

FTsnr= FTs.*filtro; %tolgo il rumore

%grafici
figure(3);
subplot(2,1,1)
semilogy(ff, abs(FTs))
xlabel('f')
ylabel('S(f)')
title('Trasformata segnale si ingresso al filtro')
subplot(2,1,2)
semilogy(ff, abs(FTsnr))
xlabel('f')
ylabel('S(f)')
title('Trasformata segnale in uscita dal filtro');

y=ifft(ifftshift(FTsnr));

Qusto è il filtro: http://img443.imageshack.us/img443/3673/filtrot.jpg

La trasformata FTsnr (segnale senza rumore)viene identica alla FTs (segnale con rumore) a parte i due impulsi del cos che sono stati eliminati dal filtro.

http://img139.imageshack.us/img139/8672/segnali.jpg

Il mio problema è che sento un tic all'inizio e uno alla fine della riproduzione, ma se la trasformata graficamente è uguale perché non riesco a sentire il segnale?
All'inizio pensavo fosse per questa istruzione "y=ifft(ifftshift(FTsnr));" ma al posto di FTsnr ho provato a mettere FTs e funziona.

Sapete dirmi dov'è il problema?
Grazie

gela
31-05-2010, 21:56
allora, ho provato con la funzione wavwrite e il file di uscita è perfetto, senza il rumore. Dopodichè ho fatto qualche confronto e ho scoperto che l'ultima funzione non mi toglie la parte immaginaria, ho quindi usato la funzione real() e va alla grande senza rumore. Ma come mai l'antitrasformata non mi toglie l'esponenziale immaginario? Ho sbagliato a costruire il filtro?