Overload List
| # | Signature | Description |
|---|---|---|
| 1 | function DcFilter(NewValue: Double; var State: TCplx; alpha: Double): Double; | State parameter holds the filter state. |
| 2 | procedure DcFilter(alpha: Double; Num: TVec; Den: TVec); | Design a DC-blocking (high-pass) IIR filter from alpha. |
| 3 | procedure DcFilter(TransitionBandwidth: Double; FS: Double; Num: TVec; Den: TVec); | Design a DC filter. |
Overload 1: function DcFilter(NewValue: Double; var State: TCplx; alpha: Double): Double;
State parameter holds the filter state.
| # | Name | Type | Description |
|---|---|---|---|
| 1 | NewValue | Double | scalar |
| 2 | State | TCplx | |
| 3 | alpha | Double | scalar |
Returns: Double
NewValue is the next sample and alpha is typically between 0.99 and 0.9999 and must be < 1. Big alpha will cause longer filter delay and more ringing. State should be initialized to zero before the routine is called for the first time.
uses MtxExpr, Math387, MtxVec, SignalUtils, MtxVecTee, MtxVecEdit;
procedure TForm1.Button1Click(Sender: TObject);
var b,c,Response,num,den,X: Vector;
n,i: integer;
IirState: TIirState;
DCState: TCplx;
begin
Tone(b,300,5/300,0,1); //generate sine with 5 periods in 300 samples
// Alternative:
// b.RandGauss;
b := b + 2;
c.Copy(b);
n := 10;
DcFilter(0.95,num,den);
IirInit(num,den,IirState);
for i := 0 to b.Length div n-1 do //only to test the streaming
begin
b.SetSubRange(i*n,n);
c.SetSubRange(i*n,n);
IirFilter(b,c,IirState);
end;
b.SetFullRange;
c.SetFullRange;
DrawIt([b,c],['Unfiltered','Filtered'],'DC filter');
FrequencyResponse(num,den,Response,64);
DrawIt(Response,'Frequency response');
DcFilter(0.05,2,num,den);
IirInit(num,den,IirState);
for i := 0 to b.Length div n-1 do // the loop is only to test the streaming
begin
b.SetSubRange(i*n,n);
c.SetSubRange(i*n,n);
IirFilter(b,c,IirState);
end;
b.SetFullRange;
c.SetFullRange;
DrawIt([b,c],['Unfiltered','Filtered']);
FrequencyResponse(num,den,Response,64);
DrawIt(Response,'Frequency response');
DCState := C_ZERO;
for i := 0 to b.Length -1 do
c.Values[i] := DcFilter(b.Values[i],DcState,0.95);
DrawIt([b,c],['Unfiltered','Filtered']);
end;
Overload 2: procedure DcFilter(alpha: Double; Num: TVec; Den: TVec);
Design a DC-blocking (high-pass) IIR filter from alpha.
| # | Name | Type | Description |
|---|---|---|---|
| 1 | alpha | Double | scalar |
| 2 | Num | TVec | source TVec |
| 3 | Den | TVec | source TVec |
Result: stored in self (calling object)
Builds the transfer function of a first-order DC blocker and stores it in num / den for use with IirInit / IirFilter; the filtered signal is centred around zero (its mean is removed). With unity-DC-gain correction g = alpha/big(alpha + 1/2(1-alpha)big) the filter is
H(z) = g (1 - z^(-1))/(1 - alpha z^(-1))
i.e. a differentiator/integrator pair with a zero at z=1 (DC) and a pole at z=alpha. Domain: 0 < alpha < 1 (typically 0.99-0.9999); alpha nearer 1 pushes the cut-off lower and lengthens the transient. A finite alpha in range yields finite coefficients.
Overload 3: procedure DcFilter(TransitionBandwidth: Double; FS: Double; Num: TVec; Den: TVec);
Design a DC filter.
| # | Name | Type | Description |
|---|---|---|---|
| 1 | TransitionBandwidth | Double | scalar |
| 2 | FS | Double | scalar |
| 3 | Num | TVec | source TVec |
| 4 | Den | TVec | source TVec |
Result: stored in self (calling object)
Design a DC filter with TransitionBandwidth and place the transfer function in Num (numerator) and Den (denominator). You can then use this transfer function to initialize an IIR filter with a call to IirInit.
A DC filtered signal will be centered around zero. This DC filter is a simple differentiator/integrator pair. Transition bandwidth is the width of the frequency band where the amplitude is not yet completely attenuated. With DC filters, the transition band starts at 0 Hz. Narrow transition band (TransitionBandwidth/FS ratio is small) will result in filters with longer delays. FS is the sampling frequency. The filter implements the following difference equation:
y[i] = x[i] - x[i-1] + alpha y[i-1]
x.. input signal y.. output signal alpha.. parameter
Alpha paremeter can control the 3dB frequency of the transition bandwidth:
alpha := 1-(TransitionBandwidth/FS)*Pi;
FS.. sampling frequency
TransitionBandwidth.. frequency up to which will the filter have more
then 3dB attenuation. Must be less then FS/2.alpha := 1-(TransitionBandwidth/FS)*Pi;
FS.. sampling frequency
TransitionBandwidth.. frequency up to which will the filter have more
then 3dB attenuation. Must be less then FS/2.