El diseño y la implementación de "Coder, Decoder" basado en una aplicación de estructura gráfica. ¿Con qué ideas debería comenzar para este proyecto de graduación? Expertos en informática, por favor, denme algunos consejos.
Hermano, tu trabajo es un poco difícil. No se trata sólo de un coqueteo casual. Tienes que buscar libros profesionales y buscar orientación de expertos poco a poco.
Descubrí si el punto sin orientación es útil.
Los códigos turboconvolucionales (TCC) son 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 su implementación utilizando procesadores DSP o RISC tradicionales. Debido a la estructura paralela inherente de la matriz lógica programable en campo (FPGA), la FPGA proporciona una base de 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
Los esquemas de codificación concatenados están diseñados para obtener mayores ganancias de codificación combinando dos o más códigos de componentes o bloques de construcción relativamente simples. Los códigos turbo se consideran una mejora de la estructura del código concatenado, en la que se utiliza un algoritmo iterativo para decodificar secuencias de códigos relacionados. Los códigos turbo se construyen 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 genera bits de datos decodificados de difícil decisión. Para que los esquemas de código concatenado, como los códigos Turbo, funcionen mejor, el algoritmo de decodificación no debe limitarse a pasar decisiones difíciles entre decodificadores. Para utilizar mejor la información obtenida por cada decodificador, el algoritmo de decodificación debe poder implementar intercambios de decisiones suaves en lugar de utilizar decisiones difíciles. Para los sistemas que emplean códigos de dos componentes, el concepto de decodificación se refiere a tomar la entrada de decisión suave 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 muestra 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 generar un segundo flujo de bits de igual a igual.
El estándar 3GPP define que la longitud del bloque de entrada está entre 40 y 5114 bits. El codificador genera un código sistemático de velocidad 1/3 que consta de los bits de entrada originales y dos bits equivalentes. La codificación a la mitad de la velocidad de codificación se puede obtener mediante el método de perforación. La implementación del codificador del sistema recursivo es relativamente sencilla, mientras que el entrelazador no es tan simple y es más complejo que 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 de datos K. Después de cargar los símbolos de entrada en la matriz de entrelazado, los intercambios entre filas y columnas se realizarán de acuerdo con un orden determinado. El modo de intercambio se elige 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. Se requiere una operación de poda durante la lectura de datos para garantizar que solo los símbolos de entrada correctos estén en la salida. Tenga en cuenta que la matriz entrelazada generalmente contiene más bits de datos que los K símbolos de entrada originales, porque R C>K. Luego, la nueva secuencia se codifica RSC2 para generar un segundo flujo de bits par.
Una forma de implementar un entrelazador es almacenar la secuencia de intercambio 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 el procesador o que utiliza unidades funcionales 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 una gran cantidad de memoria. Aprovechando los 4096 bits por bloque de memoria en chip proporcionados por la tecnología Virtex-E FPGA, se requerirían [5114 13/4096] = 17 bloques de memoria.
En nuestro enfoque, se utiliza un motor de preprocesamiento para generar una secuencia de valores (almacenados), que son almacenados y 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 necesitan 280 ciclos de reloj, y para una longitud máxima de bloque de K=5114 se necesitan 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 en tiempo real.
Decodificador 3GPP Turbo
El decodificador incluye dos decodificadores MAP (máxima probabilidad a posteriori) y varios entrelazadores. El excelente rendimiento del algoritmo Turbo proviene de la capacidad de compartir información de confiabilidad (datos extrínsecos, datos externos o datos a priori) entre dos decodificadores MAP.
En nuestro diseño, el decodificador MAP utiliza el algoritmo de Bahl, Cocke, Jelinek y Rajiv (BCJR). El algoritmo BCJR calcula la probabilidad logarítmica posterior máxima para cada símbolo y es un verdadero algoritmo de decisión blanda. Teniendo en cuenta que los datos se transmiten en bloques, se puede buscar una secuencia de símbolos 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. Dado que el problema es lineal, la descripción general de la secuencia se puede aprovechar utilizando 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 requiere que se reciba el mensaje completo antes de que comience la decodificación. Para aplicaciones en tiempo real, esta restricción puede ser demasiado estricta. Por ejemplo, el decodificador 3GPP Turbo requerirá una gran cantidad de memoria para almacenar la estructura de estado completa (enrejado de estado) de un bloque de información de 5114 símbolos. Para un diseño FPGA de un solo chip, esto requiere demasiados recursos de almacenamiento. De manera similar al algoritmo de Viterbi, podemos comenzar con el vector todo cero O y los datos {yk} (k de n a n-L) e iterar hacia atrás. L iteraciones hacia atrás producen una muy buena aproximación n-L. Siempre que L se elija apropiadamente, la métrica del estado final es correcta. Esta propiedad se puede aprovechar para iniciar una decodificación de bits eficiente antes de que finalice el 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) y 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 la probabilidad del estado inverso en la iteración inversa para calcular nueva información externa (extrínseca). información, o información previa). En nuestro diseño se adoptó un enfoque de ventanas.
El proceso de decodificación comienza con una iteración directa, calculando el valor del bloque i que contiene L símbolos recibidos. Al mismo tiempo, se realiza una iteración inversa (etiquetada ) en el bloque futuro (i+1). 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 logarítmica de verosimilitud (Lall). Cada procesamiento requiere 8 operaciones máximas*, una para cada uno de los 8 nodos en la estructura estatal (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 C al diseño de FPGA
El diseño del códec FPGA Turbo se lleva a cabo utilizando métodos de diseño y verificación basados en C, como se muestra en la Figura 3.
En la etapa de desarrollo del algoritmo, se utiliza Art Library con tipo C de punto fijo para modelar con precisión el efecto de bits verdaderos de los cálculos de punto fijo. En esta etapa se investigó el rendimiento de punto fijo de varios algoritmos posibles. Una vez seleccionado el algoritmo de cuantificación correcto, A|rtDesignerPro se puede utilizar para crear una arquitectura DSP dedicada. Una de las características más potentes de A|rtDesignerPro es la capacidad de conectar y utilizar núcleos de canales de datos dedicados (llamados unidades específicas de aplicación, ASU). La utilización de estos núcleos de acelerador ASU nos permite manejar la complejidad computacional inherente al algoritmo del decodificador Turbo.
A|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ódec Turbo, la combinación automática de bucles de A|rtDesignerr puede obtener la mejor programación de tareas; el bucle interno del paso de decodificación MAP tiene solo un ciclo de duración;
El resultado final generado por A|rtDesignerPro es una descripción VHDL o Verilog sintetizada a nivel de registro (nivel RT). El flujo de herramientas basado en C admite funciones específicas de FPGA. Por ejemplo, BlockRAM se puede utilizar para construir RAM automáticamente y los archivos de registro también se pueden implementar utilizando memoria distribuida en lugar de flip-flops.
Finalmente, el conjunto de herramientas de implementación y síntesis lógica de Xilinx convierte el RTL HDL en un flujo de bits de configuración FPGA.
Implementación del códec FPGA Turbo
La estructura de hardware central del codificador y decodificador Turbo creado por A|rtDesigner contiene muchos aceleradores ASU dedicados. Uno de los aceleradores más importantes realiza operaciones max*. El operador max* calcula dos potencias 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 un factor de corrección almacenado en una tabla de búsqueda (LUT). Este algoritmo aproximado es muy adecuado para su implementación en FPGA Xilinx, donde la LUT es su bloque de construcción básico final.
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.
La figura anterior muestra la diferencia de rendimiento entre nuestro algoritmo decodificador Turbo de punto flotante y el algoritmo de punto fijo correspondiente. Las simulaciones se realizaron con 5114 longitudes de bloque, 5 iteraciones de decodificación y modelo de canal AWGN. Los resultados muestran claramente que la pérdida de rendimiento es muy pequeña.
El rendimiento de punto fijo de nuestro decodificador Turbo en función del número de iteraciones del decodificador es de 10-6 para una tasa de error de bits de 1,5 dB SNR.
La implementación de la función de decodificador es muy desafiante y la adaptamos tanto para dispositivos Virtex-E como Virtex-II. La implementación del dispositivo Virtex-II se realizó 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, implementado utilizando la FPGA XC2V1000BG575-5, logró un rendimiento de reloj de 66 MHz y consumió 3060 segmentos lógicos y 16 bloques de RAM. Para longitudes de bloque de 40 a 5114 símbolos, el decodificador logró un rendimiento de 2 a 6,5 millones de símbolos por segundo (Msym/s) utilizando 5 bucles de iteración de decodificación. El codificador ocupa 903 segmentos lógicos, 3 bloques de RAM y admite una frecuencia de reloj de 83 MHz. Para longitudes de bloque de 40 a 5114 bits, son posibles velocidades de 9 a 20 Msym/s.
Mientras puedas usarlo, no me culpes si no lo haces. Lo siento ~ Dios te bendiga ~