Confusión sobre el uso de radix binario y el formateo a través del filtro FIR (y circuitos en general)

Me está costando un poco tratar de entender los radix binarios. Concretamente a la hora de utilizarlos en un circuito. Por sí solos puedo entenderlos bien. Por ejemplo, complemento a 2, punto fijo, BCD, etc.

Aquí es donde me estoy confundiendo.

He estado construyendo un filtro FIR en VHDL y he llegado al punto en que tengo que implementar los coeficientes. Cada coeficiente está por debajo de 1 y tiene 9 bits. Los números son números de punto fijo con signo. Los primeros 8 bits son la parte fraccionaria con el noveno bit el bit de signo/bit entero.

Ahora mi problema es: ahora que he elegido un formato (por ejemplo, 8 bits para la parte fraccionaria del número), ¿eso significa que todos los demás números que elijo ingresar en el sistema tienen que seguir la misma base? ¿Punto fijo con 8 bits fraccionarios?

Como me dicen, cuando ingresa una respuesta de impulso al filtro, la salida debe ser cada coeficiente en orden. Cuando uso "0000000001" como entrada, sí, obtengo cada coeficiente en la salida. Pero no entiendo cómo. Entiendo que se registra un '1' en cada etapa y se multiplica con cada coeficiente en cada reloj, pero no representa un "1" en el mismo formato o base que mis coeficientes. Un 1 verdadero sería "0100000000" ya que los primeros 8 bits son fraccionarios.

Me está costando entender el lado numérico del sistema, la estructura y cómo se supone que debe funcionar.

¿Hay algo mal con mi comprensión?

Respuestas (3)

Supongamos que tiene un coeficiente y un valor de entrada de señal. Si el coeficiente tiene F C bits de fracción y la entrada tiene F I bits de fracción entonces su producto tendrá F C + F I bits de fracción. Cuando usó 000000001 para representar el número entero 1, había establecido implícitamente F I = 0 por lo que los productos tenían el mismo formato que los coeficientes. Si utiliza valores de punto fijo que son 1.0 entonces necesitará bits a la izquierda del punto binario para representar la parte entera del valor. Al igual que con los bits de fracción, el número de bits enteros en el producto será igual a la suma de los números de bits enteros en el multiplicador y el multiplicando.

Cuando agrega valores de punto fijo, deben tener la misma cantidad de bits de fracción (es decir, el punto binario está alineado) y la suma tendrá la misma cantidad de bits de fracción que los sumandos. Si no tiene información sobre el rango real de valores para la suma, debe asumir que puede ocurrir un acarreo, por lo que necesita un bit adicional a la izquierda del punto binario para representar la parte entera del número. Es decir, necesita un bit entero más en la suma que el número máximo de bits enteros en cualquiera de los sumandos.

Gracias Joe, ahora entiendo cómo he establecido implícitamente en 0 bits de fracción. Entonces, entiendo que no necesita que sus entradas tengan el mismo formato que otros números en el sistema, siempre que el formato de salida sea correcto. Entonces, eso significa que para poder usar correctamente el dispositivo, necesita saber dónde está el punto decimal en sus números internos (coeficientes en este caso) para saber cómo leer la salida. ¿Se da esta información en las hojas de datos? ¿Cómo saber con qué formato funciona el dispositivo?
Al realizar el procesamiento de señales, normalmente puede asumir lo que quiera sobre el número de bits de fracción en el valor digitalizado de un convertidor A/D. No hay nada en el hardware físico que determine el formato de los datos. Siempre que el filtro sea lineal, entonces realmente no importa.
Lo que quiero decir es. El filtro que he diseñado, los coeficientes están codificados en VHDL y me he decidido por 9 bits con 8 bits fraccionarios. Si tuviera que darle este filtro a alguien para que lo use, ¿no sabría cómo leer la salida sin saber el formato en el que están los coeficientes? Debido a la necesidad de saber cuántos bits fraccionarios hay, ya que los bits fraccionarios se suman en la salida como explicó.
Sí, cuando diseña usando aritmética de punto fijo es vital que documente muy bien el diseño para que alguien más pueda entender lo que hizo. Eso incluye especificar el formato para los valores de salida. Sin embargo, para los filtros lineales, esto generalmente solo es importante si desea comparar los resultados entre las versiones de punto fijo y de punto flotante.

"Un 1 verdadero sería" 0100000000 "ya que los primeros 8 bits son fraccionarios...": como sus números son fraccionarios de 8 bits + signo (también conocido como formato Q0.8 donde la Q denota signo), no se puede representar un 1 verdadero. El rango de números es 1-1LSB a -1 (donde 1LSB significa el valor numérico de un bit menos significativo). es decir, el rango máximo de escala completa es 011111111 a 100000000. "0100000000" = 1/2 en este sistema.

Cuando usa "0000000001" como entrada, su salida será la respuesta de impulso del filtro FIR [digamos h (n)] multiplicada por 1LSB. es decir h(n)*2^-8 . Por lo tanto, debería ser una versión escalada de h(n).

Para responder directamente a su pregunta, no necesita mantener los mismos anchos de bits. Normalmente, en el diseño del filtro del procesador DSP, lo hace porque el diseñador del procesador DSP determina los anchos de bits de antemano. En ASIC/FPGA tiene la libertad de hacer lo que quiera. Pero lo más importante es alinear el punto fraccional de modo que la entrada de escala completa = la salida de escala completa.

Para lograr esta alineación del punto binario, debe recordar que multiplicar un número Q0.8 por un número Q0.8 es un número Q0.16, por lo que tiene 8 LSB adicionales, es decir, ALINEA A LA IZQUIERDA números fraccionarios en el punto binario insertando extra Zero-Lsbs a la derecha según corresponda.

Por ejemplo, en matemáticas de enteros, el producto de 0010, 0010 = 0100 en Q0.2 matemáticas 0,10 x 0,10 = 0,0100, es decir, la respuesta se completó con bits adicionales a la derecha, por lo que en VHDL su entrada requeriría un cero a la derecha. al mismo nivel.

Pero el principal problema con el escalado de filtros es en realidad la señal máxima de escala completa que podría obtener en la salida. Para un análisis del peor de los casos, usaría la norma L1, que es simplemente la suma del valor absoluto de la respuesta de impulso para una entrada de escala completa (por ejemplo, h={0.2, -0.5, 1.0, -0.5, 0.2} L1 = 0.2+0.5 +1+0.5+0.2= 2.4 lo que significa que el valor máximo de salida puede ser 2.4 mosaicos del valor máximo de entrada en el peor de los casos.

Para lidiar con eso, debe agregar 3 bits más a la magnitud (signo, 3 bits, 8 bits de fracción) o dividir todo el coeficiente por 2.4.

Mis coeficientes son 8 bits más el signo. La entrada es de 10 bits. Entonces, ¿la entrada puede representar un 1 verdadero como dije pero no los coeficientes?

No tiene que usar la misma representación para cada operando. Sus coeficientes pueden estar normalizados, pero sus muestras de entrada pueden tener un rango/precisión diferente: depende de usted (más o menos) definir dónde está el punto binario. Si su entrada es un número entero de 8 bits, entonces un "1 verdadero" es "00000001". Tal vez desee que su entrada sea 0000.0000 (rango más pequeño, más precisión; podría ser útil escribir el punto binario para visualizar cómo funcionan las matemáticas), en cuyo caso un 1 es "00010000". De cualquier manera, la cantidad de bits fraccionarios que obtenga depende de la cantidad que ingrese (8 de su coeficiente y la cantidad de sus muestras).

Entonces, para saber cómo leer la salida de un sistema, necesita conocer el formato de los números que están codificados en su interior (y el formato de su entrada). ¿Cómo se representa esa información/en qué consiste? ¿Está en las hojas de datos?