Red de conocimiento informático - Material del sitio web - Diseño e implementación de codecs basados ​​en aplicaciones estructurales: ¿Con qué ideas debemos partir para este proyecto de graduación? ~~Por favor, dé algunos consejos a los expertos en informática.

Diseño e implementación de codecs basados ​​en aplicaciones estructurales: ¿Con qué ideas debemos partir para este proyecto de graduación? ~~Por favor, dé algunos consejos a los expertos en informática.

Hombre, tu trabajo es un poco difícil. No sólo lesbianas casuales. Es hora de buscar libros profesionales y orientación experta.

No he encontrado ninguna orientación sobre si es útil.

El código turboconvolucional (TCC) es una parte integral del mecanismo de corrección de errores directos (FEC) utilizado en los sistemas inalámbricos 3G. Sin embargo, la carga computacional que conlleva el decodificador Turbo es muy pesada y no es adecuada para procesadores DSP o RISC tradicionales. Debido a la estructura paralela inherente de los arreglos lógicos programables en campo (FPGA), los FPGA proporcionan una plataforma de procesamiento de señales de alto rendimiento para resolver la velocidad de símbolo FEC y otras tareas computacionalmente intensivas requeridas en los transceptores de estaciones base 3G.

Codificación turbo

El esquema de codificación en cascada está diseñado para obtener una mayor ganancia de codificación combinando dos o más códigos de componentes o bloques de construcción relativamente simples. El código turbo se considera una mejora de la estructura del código concatenado, que utiliza un algoritmo iterativo para decodificar secuencias de código relacionadas. Los códigos turbo se forman aplicando dos o más códigos de componentes a diferentes versiones entrelazadas de la misma secuencia de datos. Como ocurre con cualquier codificación convencional de un solo componente, la última etapa del decodificador produce bits de datos decodificados de difícil decisión. Para que los esquemas de códigos concatenados como los códigos Turbo funcionen mejor, el algoritmo de decodificación no debe limitarse a transmitir decisiones difíciles entre decodificadores. Para aprovechar al máximo la información obtenida por cada decodificador, el algoritmo de decodificación debe poder implementar intercambios de decisiones suaves en lugar de decisiones difíciles. Para un sistema con códigos de dos componentes, el concepto de decodificación se refiere a pasar decisiones suaves desde la entrada de un decodificador a la entrada de otro decodificador y repetir este proceso varias veces para obtener mejores decisiones, como se muestra en la Figura 1.

Codificador Turbo 3GPP

La Figura 2 es el codificador 3GPP.

El flujo de datos de entrada se ingresa a RSC1, que genera un bit de paridad para cada bit de entrada. RSC2 también entrelaza y procesa los datos de entrada para producir un segundo flujo de bits de igual a igual.

El estándar 3GPP define la longitud del bloque de entrada entre 40 y 5114 bits. El codificador genera un código sistemático a una velocidad de 1/3, que consta de los bits de entrada originales y dos bits homólogos. La perforación puede obtener la mitad de la velocidad de codificación. La implementación del codificador del sistema recursivo es relativamente simple, pero el entrelazador no es tan simple y complejo como un entrelazador convolucional o de bloques estándar.

Una vez que la longitud del bloque de datos de entrada k se proporciona al codificador, el codificador calculará el número de filas R y el número de columnas C de la matriz de entrelazado y creará la estructura de datos entrelazados correspondiente. r y c son funciones de la longitud del bloque k. Después de cargar los símbolos de entrada en la matriz de entrelazado, los intercambios entre filas y columnas se realizan en un orden determinado. El modo de conmutación se selecciona según la longitud del bloque k (es decir, depende de k). Una vez completado el intercambio de filas y columnas, la secuencia de entrelazado final se puede obtener leyendo los datos de la matriz de entrelazado columna por columna. Al leer datos, es necesario podar para garantizar que solo aparezcan en la salida los símbolos de entrada correctos. Tenga en cuenta que la matriz entrelazada normalmente contiene más bits de datos que los K símbolos de entrada originales, ya que R C >: K RSC2 luego codifica la nueva secuencia para generar un segundo flujo de bits de igual a igual.

Una forma de implementar un entrelazador es almacenar la secuencia de conmutación completa en la memoria. Es decir, una vez que se proporciona k, se llama a una rutina de inicialización (una rutina de software que se ejecuta en un procesador o unidad funcional en la FPGA) para generar la secuencia de intercambio correspondiente, y luego esta información se almacena en la memoria. Sin embargo, este método requiere mucha memoria. La memoria en chip de 4096 bits proporcionada por la tecnología FPGA Virtex-E requerirá [511413/4096] = 17 bloques de memoria.

En nuestro enfoque, el motor de preprocesamiento se utiliza para generar valores de secuencia (almacenados) que se almacenan y serán utilizados por el generador de direcciones del entrelazador. Esta unidad de hardware utiliza varias estructuras de datos pequeñas (tablas de números primos) para calcular la secuencia requerida. El número de ciclos de reloj necesarios para este proceso de preparación es proporcional a la longitud del bloque de información. Por ejemplo, para un bloque de K=40, se requieren 280 ciclos de reloj y para una longitud máxima de bloque de K=5114, se requieren 5290 ciclos de reloj. Este proceso solo debe realizarse cuando cambia la longitud del bloque. El generador de direcciones utiliza estas estructuras de datos más compactas para generar direcciones entrelazadas sobre la marcha.

Decodificador 3GPP Turbo

El decodificador incluye dos decodificadores MAP y varios entrelazadores.

El excelente rendimiento del algoritmo Turbo proviene del hecho de que la información de confiabilidad (datos externos o datos a priori) se puede compartir entre los dos decodificadores MAP.

En nuestro diseño, el decodificador MAP adopta el algoritmo de Bahl, Cocke, Jelinek y Rajiv (BCJR). El algoritmo BCJR calcula la probabilidad logarítmica posterior máxima de cada símbolo y es un verdadero algoritmo de decisión blanda. Teniendo en cuenta que los datos se transmiten en bloques, la secuencia de símbolos se puede buscar hacia adelante o hacia atrás en la dimensión del tiempo. Para cualquier secuencia, su probabilidad de ocurrencia es el producto de las probabilidades de los símbolos individuales. Como el problema es lineal, el resumen de la secuencia se puede reemplazar por la suma logarítmica de las probabilidades.

Para ser coherentes con la convención de la literatura general, utilizamos y para representar las probabilidades de estado directo e inverso de la iteración de decodificación, respectivamente. Normalmente, el algoritmo BCJR no comienza a decodificar hasta que se ha recibido toda la información. Para aplicaciones en tiempo real, este límite puede ser demasiado estricto. Por ejemplo, el decodificador 3GPP Turbo requerirá una gran cantidad de memoria para almacenar la cuadrícula de estado completa de 5114 bloques de información de símbolos. Para un diseño FPGA monolítico, esto requiere demasiados recursos de almacenamiento. De manera similar al algoritmo de Vitebi, podemos iterar hacia atrás comenzando desde el vector todo cero o y los datos {yk} (k de n a n-L). L iteraciones inversas pueden obtener una muy buena aproximación n-L. Siempre que l se elija correctamente, la métrica del estado final es correcta. Este atributo se puede utilizar para iniciar la decodificación de bits válidos antes del final del mensaje.

l se llama longitud de convergencia. Su valor típico es aproximadamente varias veces la longitud de restricción del decodificador (generalmente de 5 a 10 veces), que aumenta a medida que disminuye la relación señal-ruido.

Normalmente, el algoritmo de decodificación Turbo calculará todo (para todo el bloque de información), almacenará estos valores y luego los usará junto con las probabilidades de estado inverso para calcular nueva información externa en la iteración inversa (o primera). información de verificación). Adoptamos el método de ventanas en el diseño.

El proceso de decodificación comienza con una iteración directa, calculando el valor del bloque I que contiene L símbolos recibidos. Itere simultáneamente hacia atrás sobre bloques futuros (i+1) (etiquetados). Al final de la iteración inversa del bloque i+1, se obtiene el vector inicial correcto requerido para iniciar la iteración inversa del bloque I. Al mismo tiempo, también está en marcha la función de probabilidad logarítmica (Lall). Cada proceso de suma requiere ocho operaciones max*, una para cada uno de los ocho nodos de tellis. El cálculo final de la probabilidad logarítmica requiere 14 operadores max* paralelos. Para proporcionar una tasa de decodificación aceptable, en el diseño se utilizan 38 unidades funcionales máx*.

De la descripción en lenguaje C al diseño de FPGA

El diseño del códec FPGA Turbo se basa en el método de diseño y verificación de C, como se muestra en la Figura 3.

En la etapa de desarrollo del algoritmo, la biblioteca Art de tipo C de punto fijo se utiliza para modelar con precisión el efecto de verdad de bits de los cálculos de punto fijo. En esta etapa, se estudió el desempeño en punto fijo de varios algoritmos posibles. Una vez seleccionado el algoritmo de cuantificación correcto, se pueden crear arquitecturas DSP especiales utilizando |rtDesignerPro. |Una de las características más poderosas de rtDesignerPro es la capacidad de conectar y utilizar núcleos de canales de datos dedicados (llamados ASU). Usando estos núcleos de acelerador ASU, podemos manejar la complejidad computacional inherente al algoritmo Turbo Decoder.

Un |rtDesignerPro puede completar automáticamente la asignación de registros, la programación y la generación de controladores. En el diseño de códecs Turbo, la combinación automática de bucles de A|rtDesignerr puede obtener los mejores resultados. Los bucles internos de los pasos de programación de tareas y decodificación MAP tienen solo un ciclo de duración.

El resultado final generado por |rtDesignerPro es una descripción completa VHDL o Verilog de nivel RT. Los flujos de herramientas basados ​​en C admiten funciones específicas de FPGA. Por ejemplo, BlockRAM se puede usar para construir RAM automáticamente, o se puede usar memoria distribuida para reemplazar flip-flops para implementar archivos de registro.

Finalmente, el conjunto de herramientas de implementación Xilinx y síntesis lógica convierte el RTL HDL en un flujo de bits de configuración FPGA.

Implementación del FPGA Turbo Codec

La estructura de hardware central del codificador y decodificador Turbo creado por A|rtDesigner contiene muchos aceleradores ASU especiales. Uno de los aceleradores más importantes, completa operaciones max*.

El operador max* calcula dos valores de potencia a y b según la siguiente fórmula:

max* (a, b)=ln(expc(a)+expc(b)).

Como se muestra en la Figura 4, la operación max* se realiza aproximadamente seleccionando el valor máximo de (a, b) y aplicando el factor de corrección almacenado en la tabla de búsqueda (LUT). Este algoritmo aproximado es ideal para su implementación en FPGA Xilinx, siendo los LUT su componente básico fundamental.

Resultados

La elección de la longitud de la palabra del hardware del algoritmo de decodificación Turbo afecta en gran medida el rendimiento general. Utilizando el flujo de diseño C-to-FPGA, este análisis de punto fijo se completa completamente en el entorno C. Los resultados se muestran en la Figura 5.

El gráfico anterior muestra la diferencia de rendimiento entre nuestro algoritmo turbo decodificador de punto flotante y el algoritmo de punto fijo correspondiente. Las simulaciones se realizaron en condiciones de 5114 bloques de longitud, 5 iteraciones de decodificación y modelo de canal AWGN. Los resultados son claros y distintos, con una pérdida mínima de rendimiento.

El rendimiento de punto fijo de nuestro decodificador Turbo es función del número de iteraciones del decodificador, con una tasa de error de 10-6 para 1,5 dB SNR.

La implementación de la funcionalidad del decodificador es muy desafiante y la hemos adaptado a los dispositivos Virtex-E y Virtex-II. La implementación del dispositivo Virtex-II se logró utilizando el conjunto de herramientas de implementación Xilinx 4.1i ejecutándose en una base de datos speedfile 1.85. El diseño final basado en la FPGA XC2V1000BG575-5 logró un rendimiento de reloj de 66 MHz y consumió 3060 chips lógicos y 16 RAM. Para bloques con longitudes de símbolos de 40 a 5114, el decodificador logra un rendimiento de 2 millones a 6,5 ​​millones de símbolos por segundo (Msym/s) en 5 iteraciones de decodificación. El codificador ocupa 903 chips lógicos, 3 RAM y admite una frecuencia de reloj de 83 MHz. Para longitudes de bloque de 40 a 5114 bits, la velocidad puede alcanzar de 9 a 20 msym/s.

Me gustaría poder usarlo. No me culpes si no lo hago. Lo siento~bendito seas~