====== Using for loops to implement filter function ======
A basic approach is the following
- Start by using a short //x//, //a//, and //b//.
- Do the calculation of the first couple of terms by hand
- Set up the for loop using what you learned from the hand calculations
Let's do this together to see how it is done.
x=[1,2,3,1,2,3]
a=[1,0.1,0.2]
b=[2,1,3]
If you type //help filter// in the Matlab command window you get the equation that the filter
command is using. It is:
a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb)
- a(2)*y(n-1) - ... - a(na+1)*y(n-na)
The first element of our //a// vector is //a(1)=1// so this equation becomes
y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb) - a(2)*y(n-1) - ... - a(na+1)*y(n-na)
Let's plug in our numbers to calculate the first two elements of //y//. Any values of //x// and //y// less than 1 are zero.
y(1) = b(1)*x(1) + b(2)*0 + ... - a(2)*0
y(1) = b(1)*x(1)
From our test case this becomes:
y(1) = 2*1 = 2
Now the second element:
y(2) = b(1)*x(2) + b(2)*x(1) - a(2)*y(1)
y(2) =2*2 +1*1 -0.1*2 = 4.8
In order for us to create the //for// loop implementation in Matlab we do the following:
- Create zero padding on the input signal.
- Create an initial output signal of all zeros.
- Set up the equations for the first element using a //for// loop for //b// and //a//.
- Set up the equations for the second element using a for loop for //b// and //a//.
- Set up the //n for// loop using the equations.
1. Using the same //x// vector we need to add zeros onto the front of the vector. (This is called zero padding).
x_pad = [0,0,0,x]
= [0,0,0,1,2,3,1,2,3]
2. Initialize the output signal.
y=zeros(size(x_pad))
3. The first real number of our input (i.e. after the zeros) is the fourth element. The first real element of the filtered signal is given by
y(4) = b(1)*x_pad(4)
We want to set up the //for// loop such that for the //n=4// element of the output signal the matrix element of the //x_pad// is //4//. This means that the index of the //x_pad// is //n-k+1 = 4-1+1=4//
n=4
bsum=0
for k=1:length(b)
bsum=bsum+b(k)*x_pad(n-k+1)
...
4. The second real element of the filtered signal is given by
y(5) = b(1)*x_pad(5) + b(2)*x_pad(4) - a(2)*y(4)
We want to set up the //for// loop such that for the //n=5// element of the output signal
n=5
bsum=0
for k=1:length(b)
bsum=bsum+b(k)*x_pad(n-k+1)
...
asum=0
for k=2:length(b)
asum=asum+a(k)*y(n-k+1)
...
5. Using the two equations we can now set up the //for// loop for the signal
for n=4:length(x_pad)
bsum=0
for k=1:length(b)
bsum=bsum+b(k)*x_pad(n-k+1)
...
asum=0
for k=2:length(b)
asum=asum+a(k)*y(n-k+1)
...
y(n)=bsum-asum
...