¿Dónde puedo obtener una implementación de código abierto del algoritmo de diseño de filtro FIR óptimo de Parks-McClellan?

20

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

Trevor Boyd Smith
fuente
¿Es importante que la solución sea gratuita? ¿Has investigado la API de Matlab C?
2
La prioridad más alta es que quiero ver el código fuente (preferiblemente no para fortran, así que no tengo que apuñalar). No pondré la restricción de que debe ser gratis (tal vez haya algún tipo de código fuente abierto pero no libre).
Trevor Boyd Smith
3
Soy consciente de que puede compilar Matlab con el compilador de Matlab y luego distribuirlo con Matlab Runtime ... para que técnicamente su cliente no tenga que pagar la licencia de Matlab. También conozco el motor Matlab (también conocido como C to Matlab API). Ambos son irrelevantes porque generalmente ejecuto en una plataforma integrada donde ninguno está disponible.
Trevor Boyd Smith
1
@TrevorBoydSmith Ya que solo quiere ver el código fuente, ¿lo ha intentado type firpm.men MATLAB? Eso le mostrará la implementación de MATLAB de la función.
Lorem Ipsum
1
El diseño del filtro FIR es muy útil para el procesamiento de señales y park-mcclelan es un tema no trivial. Y, sin embargo, se me ha rechazado en repetidas ocasiones por preguntar sobre un tema que la OMI encaja perfectamente en la carta dsp.stackexchange. Por favor explique sus votos negativos.
Trevor Boyd Smith el

Respuestas:

5

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 .

Mark Borgerding
fuente
Estoy de acuerdo en que usar el código de Janovetz en un proyecto sería más fácil porque es directo C. También estoy de acuerdo en que verificar el registro de cambios de la implementación de octava sería muy inteligente.
Trevor Boyd Smith
El código Janovetz IMO es probablemente un primer o segundo borrador ... pero no se ha utilizado mucho como el código Octave.
Trevor Boyd Smith
NOTA MUY IMPORTANTE: El código Janovetz es LGPL para que pueda usarlo en un entorno comercial.
Trevor Boyd Smith
El primer enlace de la respuesta está roto, así que aquí hay un enlace a una biblioteca donde se usa la misma implementación.
Machta
11

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.

Jason R
fuente
"El algoritmo Parks-McClellan es una variación del algoritmo Remez o del algoritmo de intercambio Remez, con el cambio de que está específicamente diseñado para filtros FIR y se ha convertido en un método estándar para el diseño de filtros FIR". También en SciPy: docs.scipy.org/doc/scipy/reference/generated/…
endolith
2

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

user5108_Dan
fuente
1

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.

hueso
fuente
1

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.

David
fuente
Mirando el documento, es una versión modificada del código de Parks-McClellan. Todavía se basa en el algoritmo de intercambio de Remez, pero tiende a tener un mejor rendimiento y le permite diseñar filtros que son mucho más largos que los que obtiene del algoritmo PM (o la implementación de Matlab).
David
1

Tenga cuidado con las diferencias entre el firpm de Matlab y el recuerdo de Scipy.signal. Por ejemplo, estas dos declaraciones son equivalentes:

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

remez(11, [0.1, 0.4], [1], type='hilbert')
Zhanwen Chen
fuente