DSPRelated.com
Forums

[Fwd: Re: Smoothing Filter]

Started by Jeff Brower December 19, 2002
Craig-

That was wrong; too early. Corrected version below; sorry.

-Jeff sum = 0;

for i=1:L

% add new sample, subtract oldest one

sum = sum + X(i) - X(i-M-1);

% this one "looks ahead"
% sum = sum + X(i+M/2) - X(i-M-1+M/2);

Y(i) = sum / M;

end

-Jeff -------- Original Message --------
Subject: Re: [matlab] Smoothing Filter
Date: Thu, 19 Dec 2002 09:25:26 -0600
From: Jeff Brower <>
Organization: Signalogic
To: Craig Doolittle <>
CC:

Craig-

What you are doing is a running sum, sometimes called a "boxcar filter". Try
this:

for i=1:L

sum = 0;

for i=1:M % M is running sum length

sum = sum + X(i+M/2) - X(i-M/2); % M/2 integer division

end

Y(i) = sum / M;

end

I didn't deal carefully with endpoints or out-of-range indexes, but it should be
faster because it avoids the redundant additions in your code.

Jeff Brower
DSP sw/hw engineer
Signalogic Craig Doolittle wrote:
>
> Hello All,
>
> I am interested in "smoothing" data. I know this is a very simple filter,
> but it is quick and dirty. For a 5 point smoothing function, I would like
> to return Y of data X where:
> Y(n) = { X(n-2) + X(n-1) + X(n) + X(n+1) + X(n+2) } * 1/5
>
> I can do this with a for loop (First method below). This method
> "correctly" handles the boundary conditions in that the end points are not
> moved, and the 2nd point is averaged with the one point before and after, etc.
>
> Using filter is much faster than the for loop. However, filter apparently
> only takes previous data.
>
> One method (second method below) is to use filter and get
> F(n) = { X(n-2) + X(n-1) + X(n) } * 1/3
> B(n) = { X(n) + X(n+1) + X(n+2) } * 1/3
> Y(n) = { F(n) + B(n) - X(n)/3 } * (3/5)
>
> Unfortunately, this does not "correctly" handle the boundary conditions as
> shown in the plots.
>
> Is it possible to use something like: filter([1 1 1 1 1]),5,X)
> and use the data in front of X(n) (i.e. X(n-2) + X(n-1) + X(n) + X(n+1) +
> X(n+2) )?
>
> Thanks for any help provided.
>
> Simplified Test Code:
>
> L000;
> X=rand(L,1);
>
> % First Method, For Loop
> No_smooth=5;
> tic
> New_Smoothed=zeros(L,1);
> % First boundary condition points
> for ind=1:floor(No_smooth/2)
> New_Smoothed(ind)=sum(X(1:ind+(ind-1)))/(ind+(ind-1));
> end
> % Middle condition points
> for indl(No_smooth/2):L-floor(No_smooth/2)
>
New_Smoothed(ind)=sum(X(ind-floor(No_smooth/2):ind+floor(No_smooth/2)))/No_smoot\
h;
> end
> % Last boundary condition points
> for ind=L-floor(No_smooth/2)+1:L
> New_Smoothed(ind)=sum(X(ind-(L-ind):L))/(2*(L-ind)+1);
> end
> toc
>
> No_smooth=3;
>
> % Second Method, Filter, Filter backwards, and combine
> tic
> Forward=filter(ones(1,No_smooth),No_smooth,X);
> Backward=filter(ones(1,No_smooth),No_smooth,X(L:-1:1));
> Smoothed=(Forward - X/No_smooth + Backward(L:-1:1)) *
> No_smooth/(2*No_smooth-1);
> toc
>
> subplot(1,2,1)
> plot(X(1:2*No_smooth), ':b')
> hold, plot(Smoothed(1:2*No_smooth), '-r')
> plot(New_Smoothed(1:2*No_smooth), '--m')
> subplot(1,2,2)
> plot(X(L-2*No_smooth:L), ':b')
> hold, plot(Smoothed(L-2*No_smooth:L), '-r')
> plot(New_Smoothed(L-2*No_smooth:L), '--m')
>
> Craig Doolittle
> Senior Engineer
> Applied Research Associates, Inc.
> 4300 San Mateo Blvd, NE, Suite A-220
> Albuquerque, NM, USA 87110-1260
> toll free: (800) 858-5494
> tel: (505) 883-3636
> fax: (505) 872-0794
> E-mail:
> http://www.ara.com