로우패스필터 알고리즘 - loupaeseupilteo algolijeum

Looking at your first line of C-code:

y += a*(x-y)

It can be converted to an algebraic relation between the samples of the filter output sequence $y[n]$ and the filter input $x[n]$ as:

$$y[n+1]-(1-a)y[n]=ax[n]$$ which is also equivalent to $$y[n]-(1-a)y[n-1]=ax[n-1]$$

And the associated transfer function of this filter is $$H(z) = \frac{a z^{-1}}{1 - (1-a)z^{-1}} = \frac{a z^{-1}}{1 + (a-1)z^{-1}}$$

Now your application will probably require a causal filter, (which means only current and past input is available and should be used to produce current output) in which case then the poles of the filter should reside inside the unit circle , i.e., $|z_p| < 1$.

Since this filter has a single pole which is at $z_p=(1-a)$ then we have; $|1-a| < 1$ and hence; $$0 < a <2$$ is the allowed range of real $a$ for which you can have a stable and causal filter.

Now to have a casual and stable lowpass filter you require that the pole is along the positive side of the real line, i.e., $0 < z_p < 1$ which means that we require $0 < a < 1$.

Otherwise when $ 1 < a < 2$ the filter becomes a highpass filter (actually it will be some other form of high-boost or shelving type filter rather than a strict high-pass filter which should block low frequencies, which these filters won't), as the pole will become negative for that range of $a$.

Note also that $a=1$ produces output equal to input shifted by 1 samples: $y[n] = x[n-1]$

Below are a few frequency response plots for different values of valid $a$ range:

로우패스필터 알고리즘 - loupaeseupilteo algolijeum

Let's start with a very basic example of the generic problem at hand: understanding the effect of a digital filter on the spectrum of a digital signal. The purpose of this example is to provide motivation for the general theory discussed in later chapters.

Our example is the simplest possible low-pass filter. A low-pass filter is one which does not affect low frequencies and rejects high frequencies. The function giving the gain of a filter at every frequency is called the amplitude response (or magnitude frequency response). The amplitude response of the ideal lowpass filter is shown in Fig.1.1. Its gain is 1 in the passband, which spans frequencies from 0 Hz to the cut-off frequency

로우패스필터 알고리즘 - loupaeseupilteo algolijeum
Hz, and its gain is 0 in the stopband (all frequencies above
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
). The output spectrum is obtained by multiplying the input spectrum by the amplitude response of the filter. In this way, signal components are eliminated (``stopped'') at all frequencies above the cut-off frequency, while lower-frequency components are ``passed'' unchanged to the output.

Definition of the Simplest Low-Pass

The simplest (and by no means ideal) low-pass filter is given by the following difference equation:

로우패스필터 알고리즘 - loupaeseupilteo algolijeum
(2.1)

where

로우패스필터 알고리즘 - loupaeseupilteo algolijeum
is the filter input amplitude at time (or sample)
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
, and
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
is the output amplitude at time
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
. The signal flow graph (or simulation diagram) for this little filter is given in Fig.1.2. The symbol ``
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
'' means a delay of one sample, i.e.,
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
.

It is important when working with spectra to be able to convert time from sample-numbers, as in Eq.

로우패스필터 알고리즘 - loupaeseupilteo algolijeum
(1.1) above, to seconds. A more ``physical'' way of writing the filter equation is

로우패스필터 알고리즘 - loupaeseupilteo algolijeum

where

로우패스필터 알고리즘 - loupaeseupilteo algolijeum
is the sampling interval in seconds. It is customary in digital signal processing to omit
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
(set it to 1), but anytime you see an
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
you can translate to seconds by thinking
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
. Be careful with integer expressions, however, such as
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
, which would be
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
seconds, not
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
. Further discussion of signal representation and notation appears in §A.1.

To further our appreciation of this example, let's write a computer subroutine to implement Eq.

로우패스필터 알고리즘 - loupaeseupilteo algolijeum
(1.1). In the computer,
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
and
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
are data arrays and
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
is an array index. Since sound files may be larger than what the computer can hold in memory all at once, we typically process the data in blocks of some reasonable size. Therefore, the complete filtering operation consists of two loops, one within the other. The outer loop fills the input array
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
and empties the output array
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
, while the inner loop does the actual filtering of the
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
array to produce
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
. Let
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
denote the block size (i.e., the number of samples to be processed on each iteration of the outer loop). In the C programming language, the inner loop of the subroutine might appear as shown in Fig.1.3. The outer loop might read something like ``fill
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
from the input file,'' ``call simplp,'' and ``write out
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
.''

Figure: Implementation of the simple low-pass filter of Eq.

로우패스필터 알고리즘 - loupaeseupilteo algolijeum
(1.1) in the C programming language.
 
/* C function implementing the simplest lowpass:
 *
 *      y(n) = x(n) + x(n-1)
 *
 */
double simplp (double *x, double *y,
               int M, double xm1)
{
  int n;
  y[0] = x[0] + xm1;
  for (n=1; n < M ; n++) {
    y[n] =  x[n]  + x[n-1];
  }
  return x[M-1];
}

In this implementation, the first instance of

로우패스필터 알고리즘 - loupaeseupilteo algolijeum
is provided as the procedure argument xm1. That way, both
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
and
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
can have the same array bounds (
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
). For convenience, the value of xm1 appropriate for the next call to simplp is returned as the procedure's value.

We may call xm1 the filter's state. It is the current ``memory'' of the filter upon calling simplp. Since this filter has only one sample of state, it is a first order filter. When a filter is applied to successive blocks of a signal, it is necessary to save the filter state after processing each block. The filter state after processing block

로우패스필터 알고리즘 - loupaeseupilteo algolijeum
is then the starting state for block
로우패스필터 알고리즘 - loupaeseupilteo algolijeum
.

Figure 1.4 illustrates a simple main program which calls simplp. The length 10 input signal x is processed in two blocks of length 5.

Figure 1.4: C main program for calling the simple low-pass filter simplp

 
/* C main program for testing simplp */
main() {
  double x[10] = {1,2,3,4,5,6,7,8,9,10};
  double y[10];

  int i;
  int N=10;
  int M=N/2; /* block size */
  double xm1 = 0;

  xm1 = simplp(x, y, M, xm1);
  xm1 = simplp(&x[M], &y[M], M, xm1);

  for (i=0;i<N;i++) {
    printf("x[%d]=%f\ty[%d]=%f\n",i,x[i],i,y[i]);
  }
  exit(0);
}
/* Output:
 *    x[0]=1.000000     y[0]=1.000000
 *    x[1]=2.000000     y[1]=3.000000
 *    x[2]=3.000000     y[2]=5.000000
 *    x[3]=4.000000     y[3]=7.000000
 *    x[4]=5.000000     y[4]=9.000000
 *    x[5]=6.000000     y[5]=11.000000
 *    x[6]=7.000000     y[6]=13.000000
 *    x[7]=8.000000     y[7]=15.000000
 *    x[8]=9.000000     y[8]=17.000000
 *    x[9]=10.000000    y[9]=19.000000
 */

You might suspect that since Eq.

로우패스필터 알고리즘 - loupaeseupilteo algolijeum
(1.1) is the simplest possible low-pass filter, it is also somehow the worst possible low-pass filter. How bad is it? In what sense is it bad? How do we even know it is a low-pass at all? The answers to these and related questions will become apparent when we find the frequency response of this filter.


Next Section:
Finding the Frequency Response
Previous Section:
Introduction