
Eine IIR -Filterbibliothek (Infinite Impulse Response) für Linux, Mac OSX und Windows, die Butterworth, RBJ, Chebychev -Filter implementiert und leicht von Python (Scipy) erzeugte Koeffizienten importieren kann.
Der Filter verarbeitet die Datenprobe per Beispiel für die Echtzeitverarbeitung.
Es verwendet Vorlagen, um den erforderlichen Speicher so zuzuweisen, dass er ohne Malloc / New -Befehle ausgeführt werden kann. Der Speicher wird zur Kompilierungszeit zugewiesen, so dass niemals das Risiko von Speicherlecks besteht.
Alle Echtzeitfiltercode befinden sich in den Header -Dateien, die eine effiziente Integration in das Hauptprogramm garantieren, und der Compiler kann gleichzeitig den Filtercode und das Hauptprogramm optimieren.
Fügen Sie Ihrem Code die folgende Anweisung hinzu:
#include "Iir.h"
Der allgemeine Codierungsansatz ist, dass der Filter zuerst so instanziiert wird, dass er seine Reihenfolge angibt. Dann werden die Parameter mit dem setup eingestellt und dann können er für die Echtzeitfilterung von Proben für die Probe verwendet werden.
Die Idee ist, den Speicher des Filters zur Kompilierzeit mit einem Vorlagenargument zuzuweisen, um neue Befehle zu vermeiden. Dies verhindert Speicherlecks und kann zur Kompilierungszeit optimiert werden. Die der Vorlage zur Verfügung gestellte order (z. B. hier für einen Tiefpassfilter):
Iir::Butterworth::LowPass<order> f;
wird als Standardreihenfolge nach dem Befehl setup unten verwendet, kann jedoch bei Bedarf durch eine niedrigere Reihenfolge überschrieben werden.
setupAlle Filter sind als Tiefpass-, Highpass-, Bandpass- und Bandstop-/Notch -Filter erhältlich. Butterworth/Chebyshev bieten auch niedrige/hohe/Band-Shelves mit angegebenem Passbandgewinn und 0 dB Gewinn im Stoppband.
Die Frequenzen können entweder analog gegen die Stichprobenrate oder normalisierte zwischen 0..1/2 sein, wobei 1/2 die Nyquist -Frequenz ist. Beachten Sie, dass normalisierte Frequenzen einfach f = f/fs sind und in Einheiten von 1/Proben liegen. Intern verwendet die Bibliothek normalisierte Frequenzen und die Setup -Befehle dividieren einfach die Stichprobenrate, wenn angegeben. Wählen Sie zwischen:
setup : Abtastrate und die analogen GrenzfrequenzensetupN : Normalisierte Frequenzen in 1/Proben zwischen f = 0..1/2 wobei 1/2 = Nyquist. Standardmäßig verwendet setup die Bestellung, die vom Argument der Vorlage geliefert wird, kann jedoch durch niedrigere Filteraufträge überschrieben werden.
In den Header -Dateien in iir oder in der Dokumentation finden Sie die Argumente der setup -Befehle.
Die folgenden Beispiele sind für Tiefpassfilter:
Butterworth.h Standardfilter für die meisten Anwendungen geeignet. Monotonische Reaktion. const int order = 4; // 4th order (=2 biquads)
Iir::Butterworth::LowPass<order> f;
const float samplingrate = 1000; // Hz
const float cutoff_frequency = 5; // Hz
f.setup (samplingrate, cutoff_frequency);
oder geben Sie eine normalisierte Frequenz zwischen 0..1/2 an:
f.setupN(norm_cutoff_frequency);
ChebyshevI.h mit zulässiger Passband Ripple in DB. Iir::ChebyshevI::LowPass<order> f;
const float passband_ripple_in_db = 5;
f.setup (samplingrate,
cutoff_frequency,
passband_ripple_in_dB);
oder geben Sie eine normalisierte Frequenz zwischen 0..1/2 an:
f.setupN(norm_cutoff_frequency,passband_ripple_in_dB);
ChebyshevII.h mit schlimmsten zulässigen Stopband -Ablehnung in DB. Iir::ChebyshevII::LowPass<order> f;
double stopband_ripple_in_dB = 20;
f.setup (samplingrate,
cutoff_frequency,
stopband_ripple_in_dB);
oder geben Sie eine normalisierte Frequenz zwischen 0..1/2 an:
f.setupN(norm_cutoff_frequency,stopband_ripple_in_dB);
RBJ.h 2. Ordnung Filter mit Cutoff und Q -Faktor. Iir::RBJ::LowPass f;
const float cutoff_frequency = 100;
const float Q_factor = 5;
f.setup (samplingrate, cutoff_frequency, Q_factor);
oder geben Sie eine normalisierte Frequenz zwischen 0..1/2 an:
f.setupN(norm_cutoff_frequency, Q_factor);
Custom.h ########
# Python
# See "elliptic_design.py" for the complete code.
from scipy import signal
order = 4
sos = signal.ellip(order, 5, 40, 0.2, 'low', output='sos')
print(sos) # copy/paste the coefficients over & replace [] with {}
///////
// C++
// part of "iirdemo.cpp"
const double coeff[][6] = {
{1.665623674062209972e-02,
-3.924801366970616552e-03,
1.665623674062210319e-02,
1.000000000000000000e+00,
-1.715403014004022175e+00,
8.100474793174089472e-01},
{1.000000000000000000e+00,
-1.369778997100624895e+00,
1.000000000000000222e+00,
1.000000000000000000e+00,
-1.605878925999785656e+00,
9.538657786383895054e-01}
};
const int nSOS = sizeof(coeff) / sizeof(coeff[0]); // here: nSOS = 2 = order / 2
Iir::Custom::SOSCascade<nSOS> cust(coeff);
Proben werden nacheinander verarbeitet. Im folgenden Beispiel wird ein Beispiel x mit dem filter verarbeitet und dann in y gespeichert. Die Arten von x und y können entweder float oder doppelt sein (Ganzzahl ist ebenfalls erlaubt, wird aber weiterhin als schwimmender Punkt verarbeitet):
y = f.filter(x);
Dies wird dann für jede eingehende Probe in einem Schleifen oder Ereignishandler wiederholt.
Ungültige Werte für setup() geben eine Ausnahme. Die Parameter für setup() , die dazu führen, dass Koeffizienten NAN -NAN auch eine Ausnahme machen.
Sie können die Exception -Handhabung ausschalten, indem Sie IIR1_NO_EXCEPTIONS über CMake oder in Ihrem Programm definieren.
Wenn Sie CMake als Build -System verwenden, fügen Sie einfach Ihren CMakeLists.txt hinzu.
find_package(iir)
target_link_libraries(... iir::iir)
oder für den statischen:
find_package(iir)
target_link_libraries(... iir::iir_static)
Verknüpfen Sie es mit der dynamischen Bibliothek (UNIX/Mac: -liir , Windows: iir.lib ) oder der statischen Bibliothek (UNIX/MAC: libiir_static.a , Windows: libiir_static.lib ).
Wenn Sie Ubuntu LTS verwenden, können Sie diese Bibliothek als vorgefertigtes Paket installieren.
Fügen Sie dieses Repository Ihrem System hinzu:
sudo add-apt-repository ppa:berndporr/dsp
Dann installieren Sie die Pakete:
sudo apt install iir1sudo apt install iir1-devEs ist für 64 -Bit -Intel und 32,64 -Bit -Arm (Raspberry Pi usw.) erhältlich. Die Dokumentation des Entwicklungspakets und der Beispielprogramme finden Sie in:
/usr/share/doc/iir1-dev/
Das Build-Tool ist cmake , das die Make- oder Projektdateien für die verschiedenen Plattformen generiert. cmake ist für Linux, Windows und Mac verfügbar. Es kompiliert auch direkt auf einem Himbeer -Pi.
Laufen
cmake .
das erzeugt die Makefile. Dann rennen:
make
sudo make install
Dies installiert es unter /usr/local/lib und /usr/local/include .
Sowohl GCC als auch Clang wurden getestet.
cmake -G "Visual Studio 16 2019" -A x64 .
Siehe cmake für die verschiedenen Build-Optionen. Oben ist für einen 64 -Bit -Build. Starten Sie dann Visual C ++ und öffnen Sie die Lösung. Dadurch werden die DLL- und LIB -Dateien erstellt. Unter Windows wird dringend empfohlen, die statische Bibliothek zu verwenden und sie mit dem Anwendungsprogramm zu verknüpfen.
Führen Sie Unit -Tests durch Eingeben make test oder nur ctest . Diese Tests, wenn sich alle Filter nach einem Delta -Impuls auf Null entspannen, dass ihre Ausgänge niemals NAN werden und wenn die direkten Formular -I & II -Filter erwartete Sequenzen berechnen, indem sie sie aus den Ergebnissen vergleichen, die durch die Ausgabe des sosfilt von Scipy erzeugt werden.
Sie können die Erzeugung von Tests deaktivieren, indem Sie IIR1_BUILD_TESTING so einstellen.
Der einfachste Weg zu lernen ist die Beispiele, die sich im demo -Verzeichnis befinden. Ein Delta -Impuls als Testsignal wird in die verschiedenen Filter gesendet und in einer Datei gespeichert. Mit der Python -Skript plot_impulse_fresponse.py können Sie dann die Frequenzantworten zeichnen.
Sie können die Kompilierung der Demos deaktivieren, indem Sie IIR1_BUILD_DEMO in die Off einstellen.
Auch das Verzeichnis, das die Unit -Tests enthält, enthält Beispiele für jeden Filtertyp.
Ein PDF aller Klassen, Methoden und insbesondere setup -Funktionen befindet sich im docs/pdf -Verzeichnis.
Die Online -Dokumentation ist hier: http://berndporr.github.io/iir1
Diese Antworten wurden von iirdemo.cpp im /demo/ Verzeichnis erzeugt und dann mit plot_impulse_fresponse.py aufgetragen.







Diese Bibliothek wurde weiter aus Vinnie Falcos großartiges Originalwerk entwickelt, das hier zu finden ist:
https://github.com/vinniefalco/dspFilters
Während die ursprüngliche Bibliothek Audio -Arrays verarbeitet, wurde diese Bibliothek so angepasst, dass sie eine schnelle Echtzeitverarbeitungsprobe nach Beispiel durchführen. Für den Befehl setup ist die Filterreihenfolge nicht erforderlich und erinnert sich stattdessen an das Argument der Vorlage. Die Klassenstruktur wurde vereinfacht und alle Funktionen für Doxygen dokumentiert. Anstatt Assert () Anweisungen zu haben, wirft diese Libary Ausnahmen aus, falls ein Parameter falsch ist. Jedes Filterdesign, das eine Optimierung erfordert (z. B. Ellipic -Filter), wurde entfernt, und stattdessen wurde eine Funktion hinzugefügt, die leicht Koeffizienten aus Scipy importieren kann.
Bernd Porr - http://www.berndporr.me.uk