2010-04-02 5 views
6

Devo implementare un filtro medio su un set di dati, ma non ho accesso agli strumenti di elaborazione del segnale. C'è un modo per farlo senza usare un ciclo for? Ecco il codice che ho a lavorare:Filtro medio in MATLAB senza loop o toolbox di elaborazione dei segnali

x=0:.1:10*pi;  
noise=0.5*(rand(1,length(x))-0.5); 
y=sin(x)+noise;  %generate noisy signal 
a=10;    %specify moving window size 
my=zeros(1,length(y)-a); 
for n=a/2+1:length(y)-a/2 
    my(n-a/2)=mean(y(n-a/2:n+a/2));  %calculate mean for each window 
end 
mx=x(a/2+1:end-a/2);     %truncate x array to match 

plot(x,y) 
hold on 
plot(mx,my,'r') 

EDIT:

Dopo l'implementazione di una soluzione di Merv, il built-in metodo del filtro in ritardo rispetto al segnale originale. C'è un modo per aggirare questo? alt text

risposta

5

Utilizzare il built-in funzione di FILTER

%# generate noisy signal 
x = sin(0:.1:10*pi); 
x = x + 0.5*(rand(1,length(x))-0.5); 

%# moving average smoothing 
window = 15; 
h = ones(window,1)/window; 
y = filter(h, 1, x); 

%# plot 
subplot(211), plot(x), ylim([-1 1]), title('noisy') 
subplot(212), plot(y), ylim([-1 1]), title('filtered') 

Per risolvere il problema lag, provare qualcosa di simile:

s = ceil(window/2); 
yy = y(s:end); 
n = length(x); 
plot(1:n, x, 'b'), hold on, plot(1:n-s+1, yy,'r'), hold off 
legend({'noisy' 'filtered'}) 

alt text http://img171.imageshack.us/img171/4510/45062995.png