Hintergrund: Oft mache ich eine Art Signalverarbeitungsaufgabe, die einen eindeutigen Filter erfordert. Normalerweise gehe ich zu diesem Zeitpunkt zu MATLAB und mit einen neuen eindeutigen Filter . Die MATLAB- Funktion implementiert diesen Parks-McClellan-Algorithmus. Jetzt habe ich einen Filter und stelle den Filter in ein fest codiertes Array. Aber hier ist das Problem, ich habe jetzt einen fest codierten Filter, der nur für ein Szenario funktioniert.firpm()
Das Problem: Ich kann mein Signalverarbeitungsproblem jetzt während der Fahrt lösen ... aber nur für eine sehr SPEZIFISCHE einzelne Abtastrate oder ein SPEZIFISCHES Szenario.
Das Ziel: Ich möchte in der Lage sein, aus C-Code oder einer anderen Sprache und meinen Signalverarbeitungscode allgemeiner zu gestalten. Ich kann keine Open-Source-Implementierung von finden !firpm()
Woher bekomme ich eine Open-Source-Implementierung des optimalen FIR-Filter-Design-Algorithmus von Parks-McClellan (auch bekannt als in MATLAB)?
PS Mir ist bewusst, dass ich Filter mithilfe von Fenstern oder etwas anderem anders gestalten kann. Erwähnen Sie diese in den Kommentaren. Bei dieser Frage geht es jedoch nicht darum, zu fragen, was andere Filterdesign-Techniken sind. Es geht darum, eine Open-Source-Implementierung des SEHR SEHR nützlichen ... oder etwas Ähnliches.
PPS Eines der Ziele dieser Frage ist es zu lernen, wie der Parks-McClellan-Algorithmus funktioniert, indem ich zuerst den Code betrachte und dann plane ich, eine Hintergrundtheorie zu lesen.
quelle
type firpm.m
in MATLAB versucht ? Das wird Ihnen die Implementierung der Funktion durch MATLAB zeigen.Antworten:
Hier ist eine LGPL-Version des Remez-Austauschalgorithmus. Der Oktavcode scheint davon abgeleitet zu sein. Es wurde von der Wikipedia-Seite Parks McClellan Seite verlinkt .
Der ursprüngliche Janovetz-Code ist in Ihrem Projekt möglicherweise einfacher zu verwenden, da er keine Oktavenaufrufe enthält. Es ist jedoch ratsam, das svn- Änderungsprotokoll von octave-forge nach Informationen zu Bugfixes oder Geschwindigkeitsverbesserungen in der Datei remez.cc zu durchsuchen .
quelle
Es gibt eine Open-Source-Implementierung von Parks-McClellan (auch als Remez-Austauschalgorithmus bekannt) in GNU Octave, einer freien Software-Implementierung einer MATLAB-ähnlichen Umgebung. Die Funktion "remez" ist im Paket "signal" enthalten , das bei Octave-Forge gehostet wird . Wenn Sie das Paket herunterladen, finden Sie "remez.cc", eine C ++ - Implementierung des Algorithmus.
Eine nette Sache an Octave ist, dass es fast mit MATLAB kompatibel ist, so dass Sie einfach Code portieren können, um ihn dort zu verwenden, wenn Sie möchten. Dies ist eine gute Möglichkeit, die Implementierung von Algorithmen, die in MATLAB in MEX-Form bereitgestellt werden, unter die Lupe zu nehmen.
quelle
Eine praktische Version finden Sie in Pythons scipy.signal.remez . Nizza, wenn Sie numpy / scipy verwenden.
quelle
Hier ist eine weitere Quelle für den Parks McClellan-Algorithmus in C. Dieser Code unterscheidet sich von dem oben erwähnten SciPy-Code darin, dass 61 der ursprünglichen 69 goto-Anweisungen entfernt wurden (der SciPy-Code enthält noch etwa 37 goto's). Es behebt auch den Code an 3 Stellen, an denen eine Division durch Null auftreten kann, und es enthält einen zusätzlichen Code, der die Bandkantenwerte überprüft.
http://www.iowahills.com/A7ExampleCodePage.html
quelle
Vielleicht wissen Sie das bereits, aber wenn Sie über Matlab verfügen, können Sie den Matlab-Codierer verwenden und eine einfache Funktion erstellen, die die zu untersuchende Funktion verwendet. Führen Sie es dann aus, und sehen Sie sich den erstellten C-Code an. Ich habe es mit der FFT und der QR-Zerlegung versucht, und obwohl es ein bisschen chaotisch ist, kann es gut verstanden werden.
quelle
In diesem Artikel wird eine aktuelle Matlab-Version des remez-Algorithmus "core" vorgestellt. „Ein MATLAB-basiertes FIR-Filterdesignprogramm für optimale Multiband-Filter nach der ursprünglichen Idee des Remez-Mehrfachaustauschalgorithmus“ -2011 IEEE Internationales Symposium für Schaltungen und Systeme (ISCAS) - Autoren (Ahsan, Saramaki)
In diesem Artikel wird der grundlegende Algorithmus gut erklärt. Das Ziel der Arbeit war es, die Verwendung des ursprünglichen Fortran-Codes zu vermeiden - was den Algorithmus nicht sehr gut erklärt und oft nur direkt in verschiedene andere Sprachen übersetzt wird.
Eine Sache werde ich kommentieren. Eine der Kernideen des Algorithmus besteht darin, eine Kurve anzupassen und dann die Extrempunkte zu finden. Normalerweise wird eine Lagrange-Interpolation verwendet, um diese Idee zu erklären, aber die Lagrange-Interpolation weist schlechte numerische Eigenschaften auf. Im ursprünglichen Algorithmus wird die baryzentrische Implementierung der Lagrange-Interpolation verwendet, wodurch viele der damit verbundenen Fallstricke der Lagrange-Interpolation vermieden werden. Wenn Sie also versuchen, den Code vollständig zu verstehen, sollten Sie nach Barycentric Interpolation suchen.
quelle
Hüten Sie sich vor den Unterschieden zwischen Matlabs firpm und Scipy.signals remez. Diese beiden Anweisungen sind beispielsweise äquivalent:
quelle