An adaptive multi-notch IIR filter implemented as a GNURadio C++ OOT module. This repo most notably includes:
- Adaptive Notch Filter OOT block that combines intermittent FFT-based peak detection stage with time-domain gradient descent tracking that allows a configurable number of cascaded IIR notches to follow drifting interferers in a complex baseband without expensive frequency domain transformations
- Interference Source hier block exposing amplitude, center frequency, drift range, and drift velocity parameters for injecting test signals
- Power Recovery Analyzer embedded Python block that compares original, polluted, and filtered test signals to measure the error percentage removed by the adaptive filter
- Test harnesses implemented as flowgraphs that allow injection of complex drifting interference combinations into white noise, distress signal satellite capture, and EEG signal data while computing the power recovery of the filter tuned to each case
Blog post: http://jackpayne.space/projects/anis-sdr/
- Demonstrates attenuation of four interferers with various drift velocities and overlap conditions
- Attenuation of static interferers in NOAA-15 satellite retransmission of a distress beacon signal. The inclusion of a meaningful drifting tone due to the doppler shifted transmission highlights the need for careful filter tuning in situations where spectral power is not uniform. The filter threshold requires precise calibration to ensure that it does not attenuate the important transmission. This also implies sufficient discrepancy between the transmission amplitude and the interference amplitude.
- Demonstrates that the filter can also be used for real-valued signals in a complex domain. Because low-frequency information is so dominant is so dominant in the EEG data, the range around DC must be uniquely excluded from the filter's range of consideration. This is an acceptable limitation since the interferers that would emerge in practicality (i.e, 60Hz mains hum) exist in a different frequency region than the highest amplitude biosignal information.
| Test | Average Power Recovery |
|---|---|
| White Noise | 99.7% |
| Satellite | 99.9% |
| EEG | 91.8% |
- It is important to note that power recovery is measured with reference to the span of the frequency spectrum in each case. That is, the error introduced to the EEG data by the transition bandwidth of the IIR notch was relatively greater due to its larger coverage of the overall EEG spectrum given its low sampling rate, and vice versa for the high-frequency satellite data.
I highly recommend that you build any OOT GNURadio modules in a Linux environment. It is prohibitively buggy at best on Windows.
You should have GNURadio, CMake 3.10 or greater, and Python development headers matching GNURadio (see the wiki for this).
From the repository root, ./rebuild.sh compiles and installs the OOT module.
- NOAA-15 Satellite Recording: https://vksdr.com/iq/ ** this had to be omitted from the repo due to Github size constraint
- EEG Data (used data set 1, evaluation subject 1 (BCICIV_eval_ds1a) channels 0-5): https://www.bbci.de/competition/iv/


