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?
Supongamos que tiene un coeficiente y un valor de entrada de señal. Si el coeficiente tiene bits de fracción y la entrada tiene bits de fracción entonces su producto tendrá bits de fracción. Cuando usó 000000001 para representar el número entero 1, había establecido implícitamente por lo que los productos tenían el mismo formato que los coeficientes. Si utiliza valores de punto fijo que son 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.
"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.
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).
binariosmacker
joe hass
binariosmacker
joe hass