next up previous print clean
Next: Spectrum of a pole Up: DAMPED OSCILLATION Previous: Narrow-band filters

Polynomial division

Convolution with the coefficients bt of B(Z)=1/A(Z) is a narrow-banded filtering operation. If the pole is chosen very close to the unit circle, the filter bandpass becomes very narrow, and the coefficients of B(Z) drop off very slowly. A method exists of narrow-band filtering that is much quicker than convolution with bt. This is polynomial division by A(Z). We have for the output Y(Z):  
 \begin{displaymath}
Y(Z) \eq B(Z) \ X(Z) \eq {X(Z) \over A(Z)}\end{displaymath} (30)
Multiply both sides of (30) by A(Z):  
 \begin{displaymath}
X(Z) \eq Y(Z) \ A(Z)\end{displaymath} (31)
For definiteness, let us suppose that the xt and yt vanish before t = 0. Now identify coefficients of successive powers of Z to get
   \begin{eqnarray}
x_0 &=& y_0 a_0 \nonumber \ x_1 &=& y_1 a_0 + y_0 a_1 \nonumbe...
 ...2 \nonumber \  &=& \cdots\cdots\cdots\cdots\cdots\cdots \nonumber\end{eqnarray}
(32)
Let Na be the highest power of Z in A(Z). The k-th equation (where k>Na) is  
 \begin{displaymath}
y_k a_0 \ + \ {\sum\limits^{N_a}_{i = 1} y_{k - i} a_i \eq x_k}\end{displaymath} (33)
Solving for yk, we get  
 \begin{displaymath}
y_k \eq {x_k -\sum\limits^{N_a}_{i = 1} y_{k - i} a_i \over a_0}\end{displaymath} (34)
Equation (34) may be used to solve for yk once $y_{k-1}, y_{k-2}, \cdots$ are known. Thus the solution is recursive. The value of Na is only 2, whereas Nb is technically infinite and would in practice need to be approximated by a large value. So the feedback operation (34) is much quicker than convolving with the filter B(Z)=1/A(Z). A program for the task is given below. Data lengths such as na in the program polydiv() include coefficients of all Na powers of Z as well as 1=Z0, so na = Na+1. 
#       polynomial division feedback filter:    Y(Z) = X(Z) / A(Z)
#
subroutine polydiv( na, aa, nx, xx, ny, yy )
integer na      # number of coefficients of denominator
integer nx      # length of the input function
integer ny      # length of the output function
real    aa(na)  # denominator recursive filter
real    xx(nx)  # input trace
real    yy(ny)  # output trace, as long as input trace.

integer ia, iy do iy= 1, ny if( iy <= nx) yy(iy) = xx(iy) else yy(iy) = 0. do iy= 1, na-1 { # lead-in terms do ia= 2, iy yy(iy) = yy(iy) - aa(ia) * yy(iy-ia+1) yy(iy) = yy(iy) / aa(1) } do iy= na, ny { # steady state do ia= 2, na yy(iy) = yy(iy) - aa(ia) * yy(iy-ia+1) yy(iy) = yy(iy) / aa(1) } return; end


next up previous print clean
Next: Spectrum of a pole Up: DAMPED OSCILLATION Previous: Narrow-band filters
Stanford Exploration Project
10/21/1998