Antecedentes: muchas veces estoy haciendo algún tipo de tarea de procesamiento de señal que requiere un filtro único. Por lo general, en este punto voy a MATLAB y genero un nuevo filtro único usando . La firpm()
función MATLAB implementa ese algoritmo Parks-McClellan. Ahora tengo un filtro y lo puse en una matriz codificada. Pero aquí está el problema. Ahora tengo un filtro codificado que solo funciona para un escenario.
El problema: ahora puedo resolver mi problema de procesamiento de señal du-jour ... pero solo para una frecuencia de muestra única muy ESPECÍFICA o un escenario ESPECÍFICO.
El objetivo: quiero poder llamar a desde el código C u otro lenguaje y hacer que mi código de procesamiento de señal sea más genérico. No puedo encontrar una implementación de código abierto de firpm()
!
¿Dónde puedo obtener una implementación de código abierto del algoritmo de diseño de filtro FIR óptimo de Parks-McClellan (también conocido como en MATLAB)?
PD : Soy consciente de que puedo diseñar filtros de manera diferente usando ventanas u otra cosa ... no dude en mencionarlos en los comentarios. Pero el punto de esta pregunta no es preguntar "¿cuáles son otras técnicas de diseño de filtros?" el punto es encontrar una implementación de código abierto de MUY MUY útil ... o algo similar.
PPS Uno de los objetivos de esta pregunta es aprender cómo funciona el algoritmo de Parks-McClellan mirando primero el código y luego planeo leer algo de teoría de fondo.
fuente
type firpm.m
en MATLAB? Eso le mostrará la implementación de MATLAB de la función.Respuestas:
Aquí hay una versión LGPL del algoritmo de intercambio Remez. El código de octava parece derivarse de él. Se vinculó desde la página de Wikipedia, la página de Parks McClellan .
El código original de Janovetz podría ser más fácil de usar en su proyecto, ya que no tiene las llamadas de octava, pero sería prudente revisar el registro de cambios svn de octava-forja para obtener información sobre correcciones de errores o aceleraciones en el archivo remez.cc .
fuente
Hay una implementación de código abierto de Parks-McClellan (también conocido como el algoritmo de intercambio Remez) en GNU Octave, una implementación de software libre de un entorno similar a MATLAB. La función, llamada "remez", está contenida en el paquete "señal" , que está alojado en Octave-Forge . Si descarga el paquete, encontrará "remez.cc", una implementación C ++ del algoritmo.
Una cosa buena de Octave es que es casi compatible con el código de MATLAB, por lo que puede transferir fácilmente el código para usarlo allí si lo desea. Es una buena manera de echar un vistazo a las implementaciones de algoritmos que se proporcionan en forma MEX en MATLAB.
fuente
Se puede encontrar una versión conveniente en scipy.signal.remez de Python . Agradable si usa numpy / scipy.
fuente
Aquí hay otra fuente para el algoritmo Parks McClellan en C. Este código es diferente del código SciPy mencionado anteriormente en que tiene 61 de las 69 declaraciones originales de goto eliminadas (el código de SciPy todavía tiene alrededor de 37 goto's). También corrige el código en 3 lugares donde se puede dividir por cero y tiene un código adicional que comprueba el rango de los valores de borde de banda.
http://www.iowahills.com/A7ExampleCodePage.html
fuente
tal vez ya lo sepa, pero si tiene matlab puede usar el codificador de matlab y crear una función simple que use la función que desea examinar. Luego ejecútelo y vea el código C creado. Intenté con la FFT y con la descomposición de QR, y aunque es un poco desordenado, se puede entender muy bien.
fuente
Aquí hay un artículo que hace una versión real de Matlab del algoritmo remez "core". "Un programa de diseño de filtros FIR multibanda óptimo basado en MATLAB siguiendo la idea original del algoritmo de intercambio múltiple Remez" -2011 Simposio Internacional IEEE sobre Circuitos y Sistemas (ISCAS) - Autores (Ahsan, Saramaki)
Este documento hace un buen trabajo al explicar el algoritmo básico. El objetivo del documento era evitar el uso del código Fortran original, que no explica muy bien el algoritmo y, a menudo, solo se traduce a otros idiomas directamente.
Una cosa que comentaré. Una de las ideas centrales del algoritmo es ajustar una curva y luego encontrar los puntos extremos. Por lo general, se utiliza una Interpolación de Lagrange para explicar esta idea, pero la Interpolación de Lagrange tiene malas propiedades numéricas. En el algoritmo original, se utiliza la Implementación barcéntrica de la interpolación de Lagrange, que evita muchas de las dificultades asociadas de la interpolación de Lagrange. Por lo tanto, si está tratando de comprender completamente el código, es posible que desee buscar la Interpolación baricéntrica.
fuente
Tenga cuidado con las diferencias entre el firpm de Matlab y el recuerdo de Scipy.signal. Por ejemplo, estas dos declaraciones son equivalentes:
fuente