Wo kann ich eine Open-Source-Implementierung des optimalen FIR-Filter-Design-Algorithmus von Parks-McClellan erhalten?


20

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()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()firpm()

Woher bekomme ich eine Open-Source-Implementierung des optimalen FIR-Filter-Design-Algorithmus von Parks-McClellan (auch bekannt als in MATLAB)?firpm()

  • 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.firpm()

  • 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.


Ist es wichtig, dass die Lösung kostenlos ist? Haben Sie die Matlab C-API untersucht?

2
Die höchste Priorität ist, dass ich den Quellcode sehen möchte (vorzugsweise nicht fortran, damit ich nicht die Augen ausstechen muss). Ich werde nicht die Einschränkung setzen, dass es kostenlos sein muss (vielleicht gibt es eine Art Open Source, aber nicht freien Quellcode).
Trevor Boyd Smith

3
Mir ist bekannt, dass Sie Matlab mit dem Matlab-Compiler kompilieren und dann mit Matlab Runtime verteilen können. Technisch gesehen muss Ihr Kunde also nicht für die Matlab-Lizenz bezahlen. Mir ist auch die Matlab Engine (auch bekannt als C to Matlab API) bekannt. Beide sind irrelevant, da ich normalerweise auf einer eingebetteten Plattform arbeite, auf der keine verfügbar ist.
Trevor Boyd Smith

1
@ TrevorBoydSmith Da Sie sich nur den Quellcode ansehen möchten, haben Sie es type firpm.min MATLAB versucht ? Das wird Ihnen die Implementierung der Funktion durch MATLAB zeigen.
Lorem Ipsum

1
Das FIR-Filterdesign ist sehr nützlich für die Signalverarbeitung und Parks-McClelan ist ein nicht triviales Thema. Und doch werde ich wiederholt abgelehnt, weil ich nach einem Thema gefragt habe, das IMO genau in die Charta von dsp.stackexchange passt. Bitte erläutern Sie Ihre Abstimmungen.
Trevor Boyd Smith

Antworten:


5

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 .


Ich bin damit einverstanden, dass die Verwendung des Janovetz-Codes in einem Projekt einfacher wäre, da er direkt C ist. Ich stimme auch definitiv zu, dass das Überprüfen des Änderungsprotokolls der Oktavimplementierung sehr klug wäre.
Trevor Boyd Smith

Der Janovetz-Code IMO ist wahrscheinlich ein erster oder zweiter Entwurf ... wurde jedoch nicht so häufig verwendet wie der Octave-Code.
Trevor Boyd Smith

SEHR WICHTIGER HINWEIS: Der Janovetz-Code ist LGPL, sodass Sie ihn in einer kommerziellen Umgebung verwenden können.
Trevor Boyd Smith

Der erste Link aus der Antwort ist unterbrochen. Hier ist also ein Link zu einer Bibliothek, in der dieselbe Implementierung verwendet wird.
Machta

11

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.


"Der Parks-McClellan-Algorithmus ist eine Variation des Remez-Algorithmus oder des Remez-Austauschalgorithmus, mit der Änderung, dass er speziell für FIR-Filter entwickelt wurde und zu einer Standardmethode für das FIR-Filterdesign geworden ist." Auch in SciPy: docs.scipy.org/doc/scipy/reference/generated/…
endolith


2

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


1

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.


1

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.


Betrachtet man das Papier, so handelt es sich um eine modifizierte Version des Parks-McClellan-Codes. Es basiert immer noch auf dem Remez-Austauschalgorithmus, weist jedoch tendenziell eine bessere Leistung auf und ermöglicht das Entwerfen von Filtern, die viel länger sind als die, die Sie vom PM-Algorithmus (oder dessen Implementierung durch Matlab) erhalten.
David

1

Hüten Sie sich vor den Unterschieden zwischen Matlabs firpm und Scipy.signals remez. Diese beiden Anweisungen sind beispielsweise äquivalent:

% Matlab
firpm(10,[.2 .8],[1 1],'Hilbert')
# Python
from scipy.signal import remez

remez(11, [0.1, 0.4], [1], type='hilbert')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.