Como otros han mencionado, se debe considerar una IIR (infinite impulse response) filtro en lugar de la FIR (finite impulse response) filtro está utilizando ahora. Hay más, pero a primera vista filtros FIR se implementan como explícito circunvoluciones y los filtros IIR con ecuaciones.
El particular filtro IIR yo uso mucho en los microcontroladores es un polo simple filtro de paso bajo. Este es el equivalente digital de una simple R-C filtro analógico. Para la mayoría de las aplicaciones, estos tienen mejores características que el cuadro de filtro que usted está usando. La mayoría de los usos de un filtro de caja que he encontrado son el resultado de alguien que no preste atención en el procesamiento de la señal digital de clase, no como un resultado de la necesidad de sus características particulares. Si sólo desea atenuar las altas frecuencias que usted sabe que son el ruido, un solo polo filtro de paso bajo es mejor. La mejor manera de implementar digitalmente en un microcontrolador es generalmente:
FILT <-- FILT + FF(NUEVO - FILT)
FILT es una pieza de los compuestos del estado. Esta es la única variable continua que usted necesita para calcular este filtro. NUEVO es el nuevo valor que el filtro se actualiza con esta iteración. FF es el filtro de fracción, que ajusta la "pesadez" del filtro. Mira este algoritmo y ver que para FF = 0 el filtro es infinitamente pesado desde la salida no cambia nunca. Para FF = 1, no hay ningún filtro en todo desde la salida de sólo sigue a la entrada. Los valores útiles están en el medio. En pequeños sistemas de elegir FF a ser de 1/2N , de modo que al multiplicar por FF puede ser realizado como un desplazamiento derecha por N bits. Por ejemplo, FF podría ser de 1/16 y la multiplique por FF, por tanto, un derecho de desplazamiento de 4 bits. De lo contrario, este filtro necesita sólo una resta y un complemento, aunque el número general debe ser mayor que el valor de la entrada (más en la precisión numérica en una sección aparte, más adelante).
Por lo general tengo Un a/D de lecturas significativamente más rápido de lo que sea necesario, y aplicar dos de estos filtros en cascada. Este es el equivalente digital de dos R-C filtros en serie, y atenúa las 12 dB/octava por encima de la atenuación de la frecuencia. Sin embargo, para Un a/D de lecturas es generalmente más relevantes para mirar el filtro en el dominio del tiempo, considerando su respuesta al escalón. Esto indica la velocidad a la que el sistema va a ver un cambio cuando la cosa está la medición de los cambios.
Para facilitar el diseño de estos filtros (que sólo significa escoger FF y la decisión de cómo muchos de ellos a la cascada), puedo utilizar mi programa FILTBITS. Puede especificar el número de desplazamiento de bits para cada uno de los FF en la cascada de la serie de filtros, y se calcula la respuesta al escalón y otros valores. En realidad yo suelo correr a través de mi guión envoltorio PLOTFILT. Este se ejecuta FILTBITS, lo que hace que un archivo CSV, luego traza el archivo CSV. Por ejemplo, aquí está el resultado de "PLOTFILT 4 4":
Los dos parámetros a PLOTFILT significa que habrá dos filtros en cascada del tipo descrito anteriormente. Los valores de 4 indique el número de desplazamiento de bits a darse cuenta de la multiplique por FF. Los dos FF valores son, por tanto, 1/16 en este caso.
El trazo rojo es la unidad de respuesta gradual, y es la principal cosa a tener en cuenta. Por ejemplo, este le dice que si la entrada cambia de forma instantánea, la salida del filtro combinado se asentará en el 90% del nuevo valor en 60 iteraciones. Si usted cuida alrededor del 95% de tiempo de adaptación, a continuación, usted tiene que esperar alrededor de 73 iteraciones, y para el 50% de tiempo de adaptación a sólo 26 iteraciones.
El verde de seguimiento muestra la salida de una sola completo de la amplitud de pico. Esto le da a usted alguna idea de lo aleatorio de supresión de ruido. Parece que no solo muestra hará que más de un 2,5% de cambio en la salida.
El trazo azul es para dar una sensación subjetiva de lo que este filtro hace con el ruido blanco. Esto no es una prueba rigurosa ya que no hay ninguna garantía de lo que es exactamente el contenido de los números aleatorios elegido como el ruido blanco de entrada para esta ejecución de PLOTFILT. Es sólo para darle un áspero sentimiento de cuánto será aplastado y lo suave que es.
PLOTFILT, tal vez FILTBITS, y un montón de otras cosas útiles, especialmente para los PIC de desarrollo de firmware está disponible en la foto de Desarrollo de software de Herramientas de liberación en mi página de descargas de Software.
Agregó acerca de la precisión numérica
Veo en los comentarios, y ahora una nueva respuesta que hay interés en los debates sobre el número de bits necesarios para aplicar este filtro. Tenga en cuenta que al multiplicar por FF va a crear un Registrode 2(FF) nueva de bits por debajo del punto binario. En sistemas pequeños, FF suele ser elegido para ser de 1/2N , de modo que esta se multiplican en realidad es realizado por un desplazamiento derecha de N bits.
FILT es, por tanto, normalmente un punto fijo entero. Tenga en cuenta que esto no cambia ninguna de las matemáticas desde el procesador de punto de vista. Por ejemplo, si usted está filtrado de 10 bits a/D de lecturas y N = 4 (FF = 1/16), entonces usted necesita 4 fracción bits por debajo de los 10 bits entero a/D de lecturas. Una mayoría de los procesadores, usted estaría haciendo operaciones con números enteros de 16 bits, debido a la 10 bits a/D de lecturas. En este caso, usted todavía puede hacer exactamente el mismo 16 bits entero opertions, pero hay que empezar con el a/D lecturas quedaron en el pasado por 4 bits. El procesador no sabe la diferencia y no es necesario. Haciendo las matemáticas sobre el conjunto de enteros de 16 bits funciona si consideramos 12.4 punto fijo o verdadero enteros de 16 bits (16.0 punto fijo).
En general, usted necesita agregar N bits cada filtro polo si usted no desea agregar el ruido debido a la representación numérica. En el ejemplo anterior, el segundo filtro de los dos tendría que tener 10+4+4 = 18 bits para no perder información. En la práctica, en una de 8 bits de la máquina que significa que usted tendría que utilizar 24 los valores de los bits. Técnicamente, sólo el segundo polo de los dos tendría el mayor valor, pero para el firmware de la simplicidad que suelen utilizar la misma representación, y por lo tanto el mismo código, para todos los polos de un filtro.
Normalmente escribo una subrutina o una macro para realizar un filtro de polo de la operación, a continuación, aplicar a cada polo. Si una subrutina o macro depende de si los ciclos o de la memoria de programa más importante en ese proyecto en particular. De cualquier manera, yo uso algunos arañazos estado para pasar de NUEVO a la subrutina/macro, que actualiza FILT, sino también las cargas que en el mismo rasguño estado de NUEVA era. Esto hace que sea fácil de aplicar múltiples polos desde la actualización de la FILT de uno de los polos es el NUEVO de la siguiente. Cuando una subrutina, es útil tener un puntero apunte a FILT en la forma en que se actualiza sólo después de FILT en el camino de salida. De esa manera la subrutina funciona automáticamente consecutivos de filtros en la memoria si llama varias veces. Con una macro que usted no necesita un puntero desde que te paso en la dirección para operar en cada iteración.
Ejemplos De Código
Aquí está un ejemplo de una macro como se describió anteriormente para un PIC 18:
////////////////////////////////////////////////////////////////////////////////
//
// Macro FILTRO de filt
//
// Actualización de un filtro de polo con el nuevo valor en NEWVAL. NEWVAL se actualiza para
// contiene el nuevo filtrado de valor.
//
// FILT es el nombre del filtro de variable de estado. Se supone que ser de 24 bits
// ancho y en el banco local.
//
// La fórmula para la actualización del filtro es:
//
// FILT <-- FILT + FF(NEWVAL - FILT)
//
// El multiplicar por FF se logra mediante un desplazamiento derecha de FILTBITS bits.
//
/macro filtro
/escritura
dbankif lbankadr
movf [arg 1]+0, w ;NEWVAL <-- NEWVAL - FILT
subwf newval+0
movf [arg 1]+1, w
subwfb newval+1
movf [arg 1]+2, w
subwfb newval+2
/escritura
/n bucle filtbits ;una vez por cada bit a cambio NEWVAL derecho
rlcf newval+2, w ;cambio NEWVAL a la derecha un bit
rrcf newval+2
rrcf newval+1
rrcf newval+0
/endloop
/escritura
movf newval+0, w ;agregar valor desplazado en el filtro y guardar en NEWVAL
addwf [arg 1]+0, w
movwf [arg 1]+0
movwf newval+0
movf newval+1, w
addwfc [arg 1]+1, w
movwf [arg 1]+1
movwf newval+1
movf newval+2, w
addwfc [arg 1]+2, w
movwf [arg 1]+2
movwf newval+2
/endmac
Y aquí es una macro similar para un PIC 24 o dsPIC 30 o 33:
////////////////////////////////////////////////////////////////////////////////
//
// Macro FILTRO ffbits
//
// Actualiza el estado de un filtro de paso bajo. El nuevo valor de entrada es en W1 W0
// y el filtro de estado para estar actualizado es señalado por el W2.
//
// La actualización del valor de filtro también le será devuelto en W1 W0 y W2 de punto
// para el primer recuerdo que pasado el filtro de estado. Esta macro puede por lo tanto ser
// se invoca en la sucesión a la actualización de una serie de cascada de filtros paso bajo.
//
// El filtro fórmula es:
//
// FILT <-- FILT + FF(NUEVO - FILT)
//
// donde el multiplicar por FF es realizado por un desplazamiento aritmético a la derecha de
// FFBITS.
//
// ADVERTENCIA: W3 es la papelera.
//
/macro filtro
/var nueva ffbits integer = [arg 1] ;obtener el número de bits a desplazar
/escritura
/escritura "; Realizar un polo filtro de paso bajo, el cambio de los bits = " ffbits
/escritura " ;"
sub w0, [w2++], w0 ;NUEVO - FILT --> W1 W0
subb w1, [w2--], w1
lsr w0, #[v ffbits], w0 ;en cambio el resultado en W1 W0 derecho
sl w1, #[- 16 ffbits], w3
ior w0, w3, w0
asr w1, #[v ffbits], w1
agregar w0, [w2++], w0 ;agregar FILT para hacer de resultado final en W1 W0
addc w1, [w2--], w1
mov w0, [w2++] ;escribir resultado para el filtro de estado, avanzar puntero
mov w1, [w2++]
/escritura
/endmac
Estos dos ejemplos son implementados como macros con mi PIC ensamblador de preprocesador, que es más capaz que cualquiera de los macro integrada de las instalaciones.