Problemas con la implementación de un filtro de parada de banda en una MCU (dsPIC) usando aritmética de punto fijo

1

Estoy intentando implementar un filtro de parada de banda (muesca) en un microcontrolador dsPIC33EP64GS506 para filtrar un componente 100 Hz de una señal de entrada. El problema aquí es que mi microcontrolador no tiene una unidad de punto flotante, por lo que tengo que usar una aritmética de punto fijo, pero para ser más precisos, uso la aritmética de enteros. El tiempo de muestra del sistema es \ $ T_s = 50 ~ \ mu \ text {s} \ $. Aquí explico mi problema en detalle, y las preguntas están al final del post. Encontrará adjunto un código MATLAB para ejecutar simulaciones si desea: enlace de descarga en mi Dropbox . Tenga en cuenta que no tiene que ser un usuario registrado de Dropbox para poder descargar el archivo.

La resolución ADC es 12b , que "aumente" a 15b , no para aumentar la resolución de medición (que no se puede hacer), sino para aumentar la resolución del filtro:

v_in = ADCBUF0<<3;

La función de transferencia de filtro de muesca en el dominio s se da como:

$$ G_s (s) = \ frac {s ^ 2 + 2 \ zeta_1 \ omega_n s + \ omega_n ^ 2} {s ^ 2 + 2 \ zeta_2 \ omega_ns + \ omega_n ^ 2}, $$

donde los parámetros de filtro \ $ \ zeta_1 \ $, \ $ \ zeta_2 \ $, y \ $ \ omega_n \ $ determinan completamente el filtro. Si queremos filtrar un componente 100 Hz , entonces configuramos \ $ \ omega_n = 2 \ pi \ cdot100 ~ \ text {s} ^ {- 1} \ $. En cuanto a otros parámetros, sin explicaciones detalladas, uso \ $ \ zeta_1 = 0.001 \ $ y \ $ \ zeta_2 = 1 \ $. Para implementar este filtro en un sistema digital, necesitamos discretizar la función de transferencia en s-domain, y para eso, uso un Método de discretización de Tustin .

$$ G_z (z) = \ frac {b_0 + b_1 z ^ {- 1} + b_2 z ^ {- 2}} {1 + a_1 z ^ {- 1} + a_2 z ^ {- 2}} . $$

La ecuación recursiva correspondiente, tal como se implementa en un sistema digital, es:

$$ y (k) = b_0 u (k) + b_1 u (k-1) + b_2 u (k-2) - a_1 y (k-1) - a_2 y (k-2). $$

Aquí está el código MATLAB para obtener la función de transferencia en el dominio z:

Ts = 50e-6;
zeta1 = 0.001;
zeta2 = 1;
wn = 100*(2*pi);
Gs = tf([1 2*zeta1*wn wn^2], [1 2*zeta2*wn wn^2]);
Gz = c2d(Gs, Ts, 'tustin');
bodeplot(Gz);

Consulte a continuación las características de frecuencia del filtro en el dominio z generado por MATLAB. Como se puede ver, este tipo de filtro es muy sensible en términos de una respuesta de frecuencia. Incluso los cambios más pequeños en los parámetros podrían causar un comportamiento completamente diferente, por ejemplo, una ganancia inesperada, un cambio de fase, etc.

Ahora,comonotengounaunidaddepuntoflotantedisponible,utilizounmétodoconocidollamadoescaladobinario.Cualquiernúmerodecimal\$d\in\mathbb{R}\$puederepresentarsecomo\$\frac{\lfloord\cdot2^r\rceil}{2^r}\$,donde\$r\in\mathbb{N}\$,y\$\lfloor\cdot\rceil\$esunafuncióndeenteroredondomáscercano.Elescaladobinarioesunmétodoutilizadocuandoqueremosevitarelusodeunadivisión,queesunaoperaciónmuycostosaentérminosdeciclosdeCPUrequeridos(típicamente18ciclos),yaqueeldesplazamientobinariopuedeproducirlosmismosresultadosenmuchosmenosciclos(típicamente1ciclo).Paraesteejemplousé\$r=15\$,queeslaprecisiónmásaltaquepodríausarconsiderandolosbitsdisponiblesparahacerunamultiplicación(unresultadodebeestardentrodelos32bits).Laecuaciónrecursivacorrespondientequeutilizaaritméticadeenterosseimplementadelasiguientemanera:

yk0=(B0*uk0+B1*uk1+B2*uk2-A1*yk1-A2*yk2+(1<<14))>>15;uk2=uk1;uk1=uk0;yk2=yk1;yk1=yk0;

Eltérmino(1<<14)seusaparaasegurarqueelresultadoseredondeaalenteromáscercanodespuésdelaoperacióndecambiodebit.Tengaencuentaque>>15esprácticamenteunadivisiónenterapor32768,perosabemosquenoescompletamenteequivalente.Eldesplazamientodebitssiempreseredondeaamenosinfinito,mientrasqueladivisiónenterasiempreseredondeaacero.Losvaloresdelosparámetrosdelfiltrosonlossiguientes:B0=31771,B1=-63509mB2=31769,A1=-63509,A2=30772.EstotambiénsepuedeencontrarenuncódigoMATLABproporcionado.

Mesorprendiómuchocuandomedicuentadequelavariantedeenterosdelfiltronofuncionaenabsoluto.Veaacontinuaciónlasrespuestasdetresfiltrosdiferentesutilizadosparaeliminaruncomponente100Hzdelaseñaldeentrada.Dearribaaabajo:(1)filtrodemuescaenlaimplementacióndepuntoflotante,(2)filtrodemuescaenlaimplementaciónaritméticadeenterosusando\$r=15\$,(3)unfiltrodepromediomóvilsimple.

Aquí es cómo he implementado un filtro de promedio móvil en C:

uk200 = window[ind];
window[ind] = uk0;
win_sum = win_sum - uk200 + uk0;
yk0 = (((win_sum+(1<<3))>>4)*5243+(1<<15))>>16;
ind++;
if (ind==200) ind=0;

Preguntas para la comunidad.

Como no tengo mucha experiencia en el filtrado digital, ¿puede alguien confirmarme estos resultados esperados? ¿Es realmente tan problemático implementar un filtro de muesca en un sistema digital usando solo aritmética de enteros ? ¿Qué filtro digital suele utilizarse para eliminar una determinada frecuencia ? Como veo en estos resultados, el filtro de promedio móvil supera a ambas implementaciones de filtros de muesca. ¿Hay algún inconveniente para el filtro de promedio móvil que debería tener en cuenta, a excepción del aumento evidente de la demanda de memoria ?

    
pregunta Marko Gulin

1 respuesta

1

Hay dos problemas con los filtros digitales, uno es el rango dinámico (capacidad para representar un rango de números), el otro es el ruido de cuantización del redondeo.

Los filtros enteros tienen un rango dinámico muy reducido en comparación con los filtros de punto flotante y también tienen más ruido de cuantificación.

El filtro debe comprobarse para garantizar que no se saturen los registros. (El filtro siempre está multiplicando un número grande por una constante grande, el multiplicador se desbordará y esto causará inestabilidad en el filtro o ruido). Hay formas de superar esto, los coeficientes se pueden ajustar para obtener la misma respuesta pero evitando.

Consulte este recurso para obtener más información.

Una cosa que hay que probar (si es posible con su compilador \ hardware) es aumentar el tamaño de las variables de 32 a 64 y ver si eso ayuda.

Otra cosa que querrá verificar (y aún no he hecho esto, necesito averiguar qué forma tiene su filtro antes de poder convertirlo en una forma diferente) es el orden y la forma del filtro. Diferentes formas tienen diferentes resultados. El orden de filtro que tiene es un filtro de segundo orden. El formulario parece una sección de segundo orden de algún tipo, pero no estoy seguro (en este momento)

Los filtros digitales pueden tener un orden superior, se puede diseñar un filtro de muesca (o de paso alto o paso bajo, cualquiera que sea) Con un filtro de segundo orden o más, cuanto más alto es el orden, más constantes se multiplica y agrega (más recursos computacionales) pero mejor se aproxima el filtro.

Probablemente sea mejor diseñar el filtro a través de métodos digitales, hay documentos que describen cómo calcular los coeficientes, pero también hay calculators en línea y por supuesto matlab, pero use la herramienta de diseño de filtros. Asegúrese de que cualquiera que sea el método que utilice, las constantes calculadas coinciden con la forma (secciones de segundo orden de dos cuadrantes, forma directa 1, forma directa II, etc.)

    
respondido por el laptop2d

Lea otras preguntas en las etiquetas