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

1

Me está costando un poco tratar de ubicar mi cabeza alrededor de las radios binarias. Específicamente cuando se trata de usarlos en un circuito. Por su cuenta puedo entenderlos bien. Por ejemplo, 2s complemento, punto fijo, BCD, etc.

Aquí es donde me estoy confundiendo.

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

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

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

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

¿Hay algún error con mi comprensión?

    
pregunta binarysmacker

3 respuestas

3

Supongamos que tiene un coeficiente y un valor de entrada de señal. Si el coeficiente tiene \ $ F_C \ $ fracción de bits y la entrada tiene \ $ F_I \ $ fracción de bits, entonces su producto tendrá \ $ F_C + F_I \ $ fracción de bits. Cuando usó 000000001 para representar el número entero 1, había establecido implícitamente \ $ F_I = 0 \ $ para que los productos tuvieran el mismo formato que los coeficientes. Si usa valores de punto fijo que son \ $ \ ge 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 el mismo número de bits de fracción (es decir, el punto binario está alineado) y la suma tendrá el mismo número 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.

    
respondido por el Joe Hass
2

"Un 1 verdadero sería" 0100000000 "ya que los primeros 8 bits son fraccionarios ..": Como sus números son un signo + fraccional de 8 bits (a.k.a formato Q0.8 donde Q denota con 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 use "0000000001" como entrada, su salida será la respuesta de impulso del filtro FIR [por ejemplo, h (n)] multiplicada por 1LSB. es decir, h (n) * 2 ^ -8. Por lo tanto, debe ser una versión escalada de h (n).

Para responder directamente a su pregunta, no es necesario que mantenga los anchos de bits iguales. Normalmente, en el diseño de filtro de procesador DSP lo hace porque el ancho de bits lo determina el diseñador del procesador DSP de antemano. En ASICs / FPGAs tienes la libertad de hacer lo que quieras. Pero lo más importante es alinear el punto fraccional para que escala completa in = fullscale out.

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 para que tenga 8 LSB adicionales, es decir, IZQUIERDA ALINEAR números fraccionarios en el punto binario insertando Zero-Lsbs adicionales 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 ha completado con bits adicionales a la derecha, por lo que en VHDL su entrada requerirá un relleno de cero a la derecha al mismo nivel.

Pero el problema principal con la escala en los filtros es en realidad la máxima señal de escala completa que se puede obtener en la salida. Para un análisis del peor de los casos, utilizarí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 de 2.4 mosaicos, el valor máximo de entrada en el peor de los casos.

Para lidiar con eso, necesita agregar 3 bits más a la magnitud (signo, 3 bits.8 fracciones de bits) o dividir todo el coeficiente entre 2.4.

    
respondido por el akellyirl
1

No tiene que usar la misma representación para cada operando. Es posible que sus coeficientes estén normalizados, pero sus muestras de entrada pueden ser un rango / precisión diferente; depende de usted (más o menos) definir dónde está el punto binario. Si su entrada es un entero de 8 bits, entonces un "verdadero 1" es "00000001". Tal vez quiera que su entrada sea 0000.0000 en su lugar (rango más pequeño, más precisión, podría ayudar a 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 obtienes depende de la cantidad que ingreses (8 de tu coeficiente y de la cantidad de muestras).

    
respondido por el fru1tbat

Lea otras preguntas en las etiquetas