Dove posso ottenere un'implementazione open source dell'algoritmo ottimale di progettazione del filtro FIR Parks-McClellan?


20

Contesto: spesso eseguo una sorta di attività di elaborazione del segnale che richiede un filtro univoco. Di solito a questo punto vado su MATLAB e generi un nuovo filtro univoco usando firpm() . La firpm()funzione MATLAB implementa l'algoritmo Parks-McClellan. Ora ho un filtro e metto il filtro in un array hardcoded. Ma ecco il problema: ora ho un filtro hardcoded che funziona solo per uno scenario.

Il problema: ora posso risolvere il mio problema di elaborazione del segnale du-jour ... ma solo per una frequenza di campionamento singola molto SPECIFICA o uno scenario SPECIFIC.

L'obiettivo: voglio essere in grado di chiamare firpm() dal codice C o da qualche altra lingua e rendere il mio codice di elaborazione del segnale più generico. Non riesco a trovare un'implementazione open source di firpm()!

Dove posso ottenere un'implementazione open source dell'algoritmo ottimale di progettazione del filtro FIR Parks-McClellan (aka firpm() in MATLAB)?

  • PS Sono consapevole di poter progettare i filtri in modo diverso usando le finestre o qualcos'altro ... sentiti libero di menzionare quelli nei commenti. Ma il punto di questa domanda non è quello di chiedere "quali sono le altre tecniche di progettazione del filtro?" il punto è quello di trovare un'implementazione open source del MOLTO MOLTO utile firpm() ... o qualcosa di simile.

  • PPS Uno degli obiettivi di questa domanda è imparare come funziona l'algoritmo Parks-McClellan guardando prima il codice e poi ho intenzione di leggere alcune teorie di base.


È importante che la soluzione sia gratuita? Hai studiato l'API Matlab C?

2
La massima priorità è che voglio vedere il codice sorgente (preferibilmente non fortran, quindi non devo stordire). Non metterò la limitazione che deve essere gratuito (forse c'è una sorta di codice sorgente open source ma non libero).
Trevor Boyd Smith,

3
Sono consapevole che puoi compilare Matlab utilizzando il compilatore Matlab e quindi distribuirlo tramite Matlab Runtime ... quindi tecnicamente il tuo cliente non deve pagare per la licenza Matlab. Sono anche a conoscenza del motore Matlab (noto anche come API da C a Matlab). Entrambi questi sono irrilevanti perché di solito corro su una piattaforma integrata dove nessuno dei due è disponibile.
Trevor Boyd Smith

1
@TrevorBoydSmith Dato che vuoi solo guardare il codice sorgente, hai provato type firpm.min MATLAB? Questo ti mostrerà l'implementazione della funzione MATLAB.
Lorem Ipsum

1
Il design del filtro FIR è molto utile per l'elaborazione del segnale e il park-mcclelan è un argomento non banale. Eppure sono stato votato più volte per aver chiesto informazioni su un argomento che l'IMO si adatta perfettamente alla carta dsp.stackexchange. Per favore, spiega i tuoi voti negativi.
Trevor Boyd Smith,

Risposte:


5

Ecco un versione LGPL dell'algoritmo di scambio Remez. Il codice di ottava sembra essere derivato da esso. È stato collegato dalla pagina di Parks McClellan nella pagina di Wikipedia .
Il codice Janovetz originale potrebbe essere più facilmente utilizzabile nel tuo progetto, dal momento che non ha le chiamate di ottava, ma sarebbe saggio scavare attraverso changelog svn octave-forge per qualsiasi informazione su correzioni di errori o accelerazioni nel file remez.cc .


Concordo sul fatto che usare il codice Janovetz in un progetto sarebbe più facile perché è semplice C. Sono anche d'accordo sul fatto che controllare il registro delle modifiche dell'implementazione dell'ottava sarebbe molto intelligente.
Trevor Boyd Smith,

Il codice Janovetz IMO è probabilmente una prima o una seconda bozza ... ma non è stato usato pesantemente come il codice Octave.
Trevor Boyd Smith,

NOTA MOLTO IMPORTANTE: il codice Janovetz è LGPL, quindi è possibile utilizzarlo in un ambiente commerciale.
Trevor Boyd Smith,

Il primo collegamento dalla risposta è interrotto, quindi ecco un collegamento a una libreria in cui viene utilizzata la stessa implementazione.
Machta,

11

Esiste un'implementazione open source di Parks-McClellan (noto anche come algoritmo di scambio Remez) in GNU Octave, un'implementazione di software libero di un ambiente simile a MATLAB. La funzione, chiamata "remez", è contenuta in pacchetto "signal" , che è ospitato su Octave-Forge . Se scarichi il pacchetto, troverai "remez.cc", un'implementazione C ++ dell'algoritmo.

Una cosa bella di Octave è che è quasi compatibile con il codice con MATLAB, quindi puoi facilmente portarlo sopra per usarlo se vuoi. È un buon modo per sbirciare le implementazioni di algoritmi forniti in formato MEX in MATLAB.


"L'algoritmo Parks-McClellan è una variante dell'algoritmo Remez o dell'algoritmo di scambio Remez, con la modifica che è specificamente progettato per i filtri FIR ed è diventato un metodo standard per la progettazione dei filtri FIR." Anche in SciPy: docs.scipy.org/doc/scipy/reference/generated/...
endolith


2

Ecco un'altra fonte per l'algoritmo Parks McClellan in C. Questo codice è diverso dal codice SciPy menzionato sopra in quanto ha rimosso 61 delle 69 dichiarazioni di goto originali (il codice di SciPy ha ancora circa 37 goto). Corregge anche il codice in 3 punti in cui può verificarsi la divisione per zero e ha un codice aggiuntivo che controlla i valori del bordo della banda.

http://www.iowahills.com/A7ExampleCodePage.html


1

forse lo sai già, ma se hai matlab puoi usare il codificatore matlab e creare una semplice funzione che utilizza la funzione che vuoi esaminare. Quindi eseguirlo e vedere il codice C creato. Ho provato con la FFT e con la decomposizione QR, e sebbene sia un po 'confusa, può essere capito bene.


1

Ecco un documento che esegue una versione effettiva di Matlab dell'algoritmo remez "core". "Un ottimale programma di progettazione di filtri FIR multibanda basato su MATLAB secondo l'idea originale dell'algoritmo di scambio multiplo Remez" -2011 Simposio internazionale IEEE su circuiti e sistemi (ISCAS) - Autori (Ahsan, Saramaki)

Questo documento fa un buon lavoro nel spiegare l'algoritmo di base. L'obiettivo del documento era quello di evitare l'uso del codice originale Fortran, che non spiega molto bene l'algoritmo e spesso viene tradotto direttamente in varie altre lingue.

Una cosa su cui commenterò. Una delle idee fondamentali dell'algoritmo è quella di adattare una curva e quindi trovare i punti estremi. Di solito un'interpolazione di Lagrange viene utilizzata per spiegare questa idea, ma l'interpolazione di Lagrange ha scarse proprietà numeriche. Nell'algoritmo originale l'uso dell'implementazione baricentrica dell'interpolazione di Lagrange - che evita molte delle insidie ​​associate dell'interpolazione lagrangiana. Quindi, se stai cercando di comprendere appieno il codice, potresti cercare l'Interpolazione baricentrica.


Guardando il documento - è una versione modificata del codice Parks-McClellan. Si basa ancora sull'algoritmo di scambio Remez, ma tende ad avere prestazioni migliori e consente di progettare filtri che sono molto più lunghi di quelli che si ottengono dall'algoritmo PM (o dall'implementazione di Matlab).
David,

1

Fai attenzione alle differenze tra firpm di Matlab e remez di Scipy.signal. Ad esempio, queste due affermazioni sono equivalenti:

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

remez(11, [0.1, 0.4], [1], type='hilbert')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.