NAME
PDL::DSP::Iir -- Infinite impulse response and recursive filters
DESCRIPTION
This module provides recursive filters. Currently, only moving average filters are implemented. The moving average is actually a FIR, but it is implemented recursively as are IIR filters, so it is included here.
SYNOPSIS
use PDL::LiteF;
use PDL::DSP::Iir( 'moving_average' );
# apply three passes of a moving average with window size 2*5+1 = 11.
$filtered_data = moving_average($data,5,3);
# apply one pass of a moving average with window size 2*3+1 = 7.
$filtered_data = moving_average($data,3);
# call as method with window size 2 * $hw + 1
$y = $x->moving_average($hw);
FUNCTIONS
The function moving_average
calls one of the lower level functions mov_avg
or multi_pass_mov_avg
, but they can be used directly as well.
moving_average
moving_average($data, $half_width [, $n_passes ]);
Other terms for this kind of filter are: smoothing, sliding average, box smoothing, boxcar smoothing, boxcar filter, etc.
This function applies a moving average of $data
with window of size w = 2*$half_width+1
. That is, the output value of point i
is the (uniformly weighted) average of the input points from i - half_width
through i + half_width
. The filter is repeated $n_passes
times if $n_passes
is supplied. This effectively applies a filter with a response that decreases with the distance from the point i
. The recursive algorithm is used, which can be much faster than the equivalent direct convolution with a rectangular window. The boundary at data[0]
is treated by using a window of size 1 at data[0]
, then of size 3 at data[1]
, and so on until the size reaches w
. The boundary at datap[n-1]
is treated in the same way. In this way, the response around each point is symmetric.
The accumulator for all fixed point types is of type int
, and for both floating point types is double
.
mov_avg
Signature: (x(n); double [o]y(n); int half_width)
Moving average with a single pass.
mov_avg ignores the bad-value flag of the input piddles. It will set the bad-value flag of all output piddles if the flag is set for any of the input piddles.
multi_pass_mov_avg
Signature: (x(n); double [o]y(n); double [t]ytemp(n); int half_width; int n_passes)
This is the same as mov_avg
, except that smoothing is repeated n_passes times. Note that storage ytemp
is created.
multi_pass_mov_avg ignores the bad-value flag of the input piddles. It will set the bad-value flag of all output piddles if the flag is set for any of the input piddles.