IIR-Filters#
The Signalyzer package provides a second-order IIRFilter
factory
class to compute the normalized filter coefficients for common filter
configurations according to the sampling-time dt in seconds of the
samples
for the given cutoff or center frequency f0 in Hertz
and quality factor q of the second-order IIR filter to create.
Warning
The IIRFilter
factory does neither check if the given parameters are
valid nor the filter is stable.
Band-Pass Filter#
You can filter the signal samples
of a signal trace with a second-order band-pass IIR filter by calling the method
band_pass()
and providing the sampling-time dt, the center
frequency f0, and the quality factor q of the filter.
A new Trace
instance labeled with the performed transformation
'band-pass'
is returned.
>>> # normalized filter coefficients of a second-order band-pass IIR-filter
>>> IIRFilter.band_pass(dt=0.02, f0=5, q=0.707)
IIRFilter(b0=0.2936305238633031, b1=0.0, b2=-0.2936305238633031,
a1=-1.1429298210046335, a2=0.41273895227339397,
s1=0.0, s2=0.0)
>>> # signal samples
>>> signal = Trace('Signal', map(lambda x: 0 if x <= 5 else 1, range(25)))
>>> # band-pass filtered signal samples
>>> signal.band_pass(dt=0.02, f0=5, q=0.707)
Trace(label='Signal:band-pass',
samples=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.2936305238633031, 0.6292296059438849, 0.5979725261174329,
0.4237330639444065, 0.2374906010097415, 0.0965439492463373,
0.012321336795657334, -0.025765025201870573, -0.03453311128180103,
-0.028834693188924287, -0.018702870555949658, -0.00947486744086301,
-0.003109705350460623, 0.00035647188089199533, 0.001690918871249114,
0.0017854717722157742, 0.0013427608497287302, 0.0007977476690543828,
0.0003575598943283964])
(Source code, html)
Low-Pass Filter#
You can filter the signal samples
of a signal trace with a second-order low-pass IIR filter by calling the method
low_pass()
and providing the sampling-time dt, the cutoff
frequency f0, and the quality factor q of the filter.
A new Trace
instance labeled with the performed transformation
'low-pass'
is returned.
>>> # normalized filter coefficients of a second-order low-pass IIR-filter
>>> IIRFilter.low_pass(dt=0.02, f0=5, q=0.707)
IIRFilter(b0=0.06745228281719011, b1=0.13490456563438022, b2=0.06745228281719011,
a1=-1.1429298210046335, a2=0.41273895227339397,
s1=0.0, s2=0.0)
>>> # signal samples
>>> signal = Trace('Signal', map(lambda x: 0 if x <= 5 else 1, range(25)))
>>> # low-pass filtered signal samples
>>> signal.low_pass(dt=0.02, f0=5, q=0.707)
Trace(label='Signal:low-pass',
samples=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.06745228281719011, 0.27945007397817534, 0.5613607697619523,
0.7960651646253372, 0.947960291423087, 1.024694115475641,
1.0497024557750898, 1.0466141955337798, 1.0327626146356725,
1.0182058750555134, 1.0072856302799662, 1.0008126903161547,
0.9979217845891701, 0.9972893166828786, 0.9977596396528264,
0.9985582299416725, 0.9992768419877129, 0.9997685558057517,
1.0000339510088148])
(Source code, html)
High-Pass Filter#
You can filter the signal samples
of a signal trace with a second-order high-pass IIR filter by calling the method
high_pass()
and providing the sampling-time dt, the cutoff
frequency f0, and the quality factor q of the filter.
A new Trace
instance labeled with the performed transformation
'high-pass'
is returned.
>>> # normalized filter coefficients of a second-order high-pass IIR-filter
>>> IIRFilter.high_pass(dt=0.02, f0=5, q=0.707)
IIRFilter(b0=0.6389171933195069, b1=-1.2778343866390138, b2=0.6389171933195069,
a1=-1.1429298210046335, a2=0.41273895227339397,
s1=0.0, s2=0.0)
>>> # signal samples
>>> signal = Trace('Signal', map(lambda x: 0 if x <= 5 else 1, range(25)))
>>> # high-pass filtered signal samples
>>> signal.high_pass(dt=0.02, f0=5, q=0.707)
Trace(label='Signal:high-pass',
samples=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.6389171933195069, 0.09132032007793989, -0.15933329587938505,
-0.21979822856974374, -0.18545089243282875, -0.1212380647219784,
-0.062023792570747305, -0.020849170331909583, 0.0017704966461280502,
0.010628818133410434, 0.011417240275983231, 0.008662177124708292,
0.005187920761290377, 0.002354211436229048, 0.0005494414759238397,
-0.00034370171388908854, -0.0006196028374425566,
-0.0005663034748070173, -0.0003915109031438213])
(Source code, html)
Notch Filter#
You can filter the signal samples
of a signal trace with a second-order notch IIR filter by calling the method
notch()
and providing the sampling-time dt, the center frequency
f0, and the quality factor q of the filter.
A new Trace
instance labeled with the performed transformation
'notch'
is returned.
>>> # normalized filter coefficients of a second-order notch IIR-filter
>>> IIRFilter.notch(dt=0.02, f0=5, q=0.707)
IIRFilter(b0=0.706369476136697, b1=-1.1429298210046335, b2=0.706369476136697,
a1=-1.1429298210046335, a2=0.41273895227339397,
s1=0.0, s2=0.0)
>>> # signal samples
>>> signal = Trace('Signal', map(lambda x: 0 if x <= 5 else 1, range(25)))
>>> # notch filtered signal samples
>>> signal.notch(dt=0.02, f0=5, q=0.707)
Trace(label='Signal:notch',
samples=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.706369476136697, 0.37077039405611534, 0.4020274738825673,
0.5762669360555936, 0.7625093989902586, 0.9034560507536628,
0.9876786632043427, 1.0257650252018704, 1.0345331112818008,
1.028834693188924, 1.0187028705559493, 1.0094748674408627,
1.0031097053504603, 0.9996435281191077, 0.9983090811287505,
0.9982145282277839, 0.9986572391502712, 0.9992022523309455,
0.9996424401056714])
(Source code, html)
All-Pass Filter#
You can filter the signal samples
of a signal trace with a second-order all-pass IIR filter by calling the method
all_pass()
and providing the sampling-time dt, the center
frequency f0, and the quality factor q of the filter.
A new Trace
instance labeled with the performed transformation
'all-pass'
is returned.
>>> # normalized filter coefficients of a second-order all-pass IIR-filter
>>> IIRFilter.all_pass(dt=0.02, f0=5, q=0.707)
IIRFilter(b0=0.41273895227339397, b1=-1.1429298210046335, b2=1.0,
a1=-1.1429298210046335, a2=0.41273895227339397,
s1=0.0, s2=0.0)
>>> # signal samples
>>> signal = Trace('Signal', map(lambda x: 0 if x <= 5 else 1, range(25)))
>>> # all-pass filtered signal samples
>>> signal.all_pass(dt=0.02, f0=5, q=0.707)
Trace(label='Signal:all-pass',
samples=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.41273895227339397, -0.2584592118877693, -0.19594505223486536,
0.1525338721111873, 0.5250187979805172, 0.8069121015073255,
0.9753573264086853, 1.051530050403741, 1.0690662225636018,
1.0576693863778486, 1.0374057411118995, 1.0189497348817262,
1.0062194107009212, 0.9992870562382159, 0.9966181622575014,
0.9964290564555681, 0.9973144783005423, 0.9984045046618911,
0.9992848802113432])
(Source code, html)