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.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 !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)?
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.
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.
la source
type firpm.m
dans MATLAB? Cela vous montrera l'implémentation de la fonction par MATLAB.Réponses:
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 .
la source
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.
la source
Une version pratique peut être trouvée dans scipy.signal.remez de Python . Bien si vous utilisez numpy / scipy.
la source
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
la source
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.
la source
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.
la source
Méfiez-vous des différences entre le firpm de Matlab et le remez de Scipy.signal. Par exemple, ces deux instructions sont équivalentes:
la source