Où puis-je obtenir une implémentation open source de l'algorithme de conception de filtre FIR optimal de Parks-McClellan?


20

Contexte: Souvent, je fais une sorte de tâche de traitement du signal qui nécessite un filtre unique. Habituellement, à ce stade, je vais dans MATLAB et je génère un nouveau filtre unique en utilisant . La fonction MATLAB implémente cet algorithme de Parks-McClellan. Maintenant, j'ai un filtre et je le place dans un tableau codé en dur. Mais voici le problème J'ai maintenant un filtre codé en dur qui ne fonctionne que pour un scénario.Fjerpm()firpm()

Le problème: je peux maintenant résoudre mon problème de traitement du signal du jour ... mais seulement pour un taux d'échantillonnage unique très SPÉCIFIQUE ou un scénario SPÉCIFIQUE.

L'objectif: je veux pouvoir appeler partir du code C ou d'un autre langage et rendre mon code de traitement du signal plus générique. Je ne trouve pas d'implémentation open source de !Fjerpm()firpm()

Où puis-je obtenir une implémentation open source de l' algorithme de conception de filtre FIR optimal de Parks-McClellan (alias dans MATLAB)?Fjerpm()

  • PS Je suis conscient que je peux concevoir des filtres différemment en utilisant le fenêtrage ou autre chose ... n'hésitez pas à les mentionner dans les commentaires. Mais le but de cette question n'est pas de demander "quelles sont les autres techniques de conception de filtres?" il s'agit de trouver une implémentation open source du TRÈS TRÈS utile ... ou quelque chose de similaire.Fjerpm()

  • PPS L'un des objectifs de cette question est d'apprendre comment fonctionne l'algorithme de Parks-McClellan en regardant d'abord le code, puis je prévois de lire une théorie de base.


Est-il important que la solution soit gratuite? Avez-vous étudié l'API Matlab C?

2
La plus haute priorité est que je veuille voir le code source (de préférence pas fortran donc je n'ai pas à me poignarder). Je ne mettrai pas la restriction qu'il doit être gratuit (peut-être qu'il existe une sorte de code source open source mais non libre).
Trevor Boyd Smith

3
Je suis conscient que vous pouvez compiler Matlab en utilisant le compilateur Matlab puis distribuer en utilisant Matlab Runtime ... donc techniquement votre client n'a pas à payer pour la licence Matlab. Je connais également le moteur Matlab (alias C to Matlab API). Ces deux éléments ne sont pas pertinents car je fonctionne généralement sur une plate-forme intégrée où aucun n'est disponible.
Trevor Boyd Smith

1
@TrevorBoydSmith Puisque vous voulez juste regarder le code source, avez-vous essayé type firpm.mdans MATLAB? Cela vous montrera l'implémentation de la fonction par MATLAB.
Lorem Ipsum

1
La conception du filtre FIR est très utile pour le traitement du signal et parks-mcclelan est un sujet non trivial. Et pourtant, je suis rejeté à plusieurs reprises pour avoir posé une question sur un sujet que l'OMI s'intègre parfaitement dans la charte dsp.stackexchange. Veuillez expliquer vos votes négatifs.
Trevor Boyd Smith

Réponses:


5

Voici une version LGPL de l'algorithme d'échange Remez. Le code d'octave semble en être dérivé. Il a été lié à partir de la page wikipedia de la page Parks McClellan .
Le code Janovetz d'origine pourrait être plus facilement utilisable dans votre projet, car il n'a pas les appels d'octave, mais il serait sage de fouiller dans le changelog octn -forge svn pour toute information sur les corrections de bugs ou les accélérations dans le fichier remez.cc .


Je suis d'accord pour dire que l'utilisation du code Janovetz dans un projet serait plus facile car il s'agit de C. droit.
Trevor Boyd Smith,

Le code Janovetz IMO est probablement un premier ou un deuxième projet ... mais n'a pas été largement utilisé comme le code Octave.
Trevor Boyd Smith,

NOTE TRÈS IMPORTANTE: Le code Janovetz est LGPL, vous pouvez donc l'utiliser dans un cadre commercial.
Trevor Boyd Smith,

Le premier lien de la réponse est rompu alors voici un lien vers une bibliothèque où la même implémentation est utilisée.
Machta

11

Il existe une implémentation open-source de Parks-McClellan (également connu sous le nom d'algorithme d'échange Remez) dans GNU Octave, une implémentation de logiciel libre d'un environnement de type MATLAB. La fonction, appelée "remez", est contenue dans le package "signal" , qui est hébergé chez Octave-Forge . Si vous téléchargez le package, vous trouverez "remez.cc", une implémentation C ++ de l'algorithme.

Une bonne chose à propos d'Octave est qu'il est presque compatible avec MATLAB, vous pouvez donc facilement porter du code pour l'utiliser si vous le souhaitez. C'est un bon moyen de jeter un œil sous le capot aux implémentations d'algorithmes fournis sous forme MEX dans MATLAB.


"L'algorithme Parks-McClellan est une variante de l'algorithme Remez ou de l'algorithme d'échange Remez, avec le changement qu'il est spécifiquement conçu pour les filtres FIR et est devenu une méthode standard pour la conception des filtres FIR." Aussi dans SciPy: docs.scipy.org/doc/scipy/reference/generated/…
endolith


2

Voici une autre source pour l'algorithme Parks McClellan en C. Ce code est différent du code SciPy mentionné ci-dessus en ce qu'il a supprimé 61 des 69 instructions goto originales (le code SciPy a encore environ 37 goto). Il corrige également le code à 3 endroits où la division par zéro peut se produire et il a du code supplémentaire qui vérifie les valeurs de bord de bande.

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


1

vous le savez peut-être déjà, mais si vous avez matlab, vous pouvez utiliser le codeur matlab et créer une fonction simple qui utilise la fonctionnalité que vous souhaitez examiner. Ensuite, exécutez-le et voyez le code C créé. J'ai essayé avec la FFT, et avec la décomposition QR, et même si c'est un peu brouillon, ça se comprend très bien.


1

Voici un article qui fait une version Matlab réelle de l'algorithme de remez "core". «Un programme de conception de filtres FIR multibandes optimaux basé sur MATLAB suivant l'idée originale de l'algorithme d'échange multiple Remez» -2011 IEEE International Symposium on Circuits and Systems (ISCAS) - Authors (Ahsan, Saramaki)

Cet article explique bien l'algorithme de base. Le but de l'article était d'éviter d'utiliser le code Fortran original - qui n'explique pas très bien l'algorithme et est souvent simplement traduit directement dans diverses autres langues.

Je vais commenter une chose. L'une des idées fondamentales de l'algorithme consiste à ajuster une courbe, puis à trouver les points extrêmes. Habituellement, une interpolation de Lagrange est utilisée pour expliquer cette idée, mais l'interpolation de Lagrange a de mauvaises propriétés numériques. Dans l'algorithme d'origine, l'utilisation de l'implémentation barycentrique de l'interpolation de Lagrange - qui évite de nombreux pièges associés de l'interpolation lagrangienne. Donc, si vous essayez de bien comprendre le code, vous pouvez rechercher l'interpolation barycentrique.


En regardant le document - c'est une version modifiée du code Parks-McClellan. Il est toujours basé sur l'algorithme d'échange Remez, mais il a tendance à avoir de meilleures performances et vous permet de concevoir des filtres qui sont beaucoup plus longs que ceux que vous obtenez de l'algorithme PM (ou de l'implémentation de Matlab).
David

1

Méfiez-vous des différences entre le firpm de Matlab et le remez de Scipy.signal. Par exemple, ces deux instructions sont équivalentes:

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

remez(11, [0.1, 0.4], [1], type='hilbert')
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.