Receptor SDR DVB-T2 en C++

Software Defined Radio es un método para reemplazar el trabajo en metal (que en realidad es bueno para la salud) con el dolor de cabeza de la programación. Los DEG auguran un gran futuro y se considera que la principal ventaja es la eliminación de restricciones en la implementación de protocolos de radio. Un ejemplo es el método de modulación OFDM (multiplexación por división de frecuencia ortogonal), que sólo fue posible con el método SDR. Pero SDR también tiene una oportunidad más, puramente de ingeniería: la capacidad de controlar y visualizar una señal en cualquier punto arbitrario con el menor esfuerzo.

Uno de los estándares de comunicación interesantes es la televisión terrestre DVB-T2.
¿Para qué? Por supuesto, puedes simplemente encender el televisor sin levantarte, pero no hay absolutamente nada que mirar allí y esta ya no es mi opinión, sino un hecho médico.

En serio, DVB-T2 está diseñado con capacidades muy amplias, que incluyen:

  • aplicación en interiores
  • modulación de QPSK a 256QAM
  • ancho de banda de 1,7MHz a 8MHz

Tengo experiencia en la recepción de televisión digital utilizando el principio SDR. El estándar DVB-T está en el conocido proyecto GNURadio. Existe un bloque gr-dvbs2rx para el estándar DVB-T2 (todos para el mismo GNURadio), pero requiere una sincronización preliminar de la señal y es inspirador (agradecimiento especial a Ron Economos).

Lo que tenemos

Existe una norma ETSI EN 302 755 que detalla la transmisión, pero no la recepción.

La señal se encuentra al aire con una frecuencia de muestreo de 9,14285714285714285714 MHz, modulada por COFDM con 32768 portadoras, en una banda de 8 MHZ.

Se recomienda recibir dichas señales con el doble de frecuencia de muestreo (para no perder nada) y en la frecuencia intermedia con más ancho de banda (recepción superheterodina), para eliminar el desplazamiento de corriente continua (CC) y las "fugas" del oscilador local. (LO) a la entrada del receptor. Los dispositivos que cumplen estas condiciones son demasiado caros para la mera curiosidad.

SdrPlay con 10Msps 10bit o AirSpy de similares características es mucho más económico. Aquí no se trata de duplicar la frecuencia de muestreo y la recepción sólo se puede realizar con conversión directa (Zero IF). Por lo tanto (por razones financieras) nos estamos pasando al lado de los partidarios del SDR "puro" con un mínimo de conversión de hardware.

Fue necesario resolver dos problemas:

  1. Sincronización. Descubra la desviación de RF con precisión de fase y la desviación de frecuencia de muestreo exactas.
  2. Reescribe el estándar DVB-T2 al revés.

La segunda tarea requiere mucho más código, pero se puede resolver con perseverancia y se puede verificar fácilmente mediante señales de prueba.

Las señales de prueba están disponibles en el servidor de la BBC ftp://ftp.kw.bbc.co.uk/t2refs/ con instrucciones detalladas.

La solución al primer problema depende en gran medida de las características del dispositivo SDR y de sus capacidades de control. El uso de las funciones de control de frecuencia recomendadas, como dicen, no fue exitoso, pero le dio mucha experiencia al leerlas. documentación, programación, ver series de televisión, resolver cuestiones filosóficas..., en definitiva, no fue posible abandonar el proyecto.

La fe en los “DEG puros” no ha hecho más que fortalecerse.

Tomamos la señal tal como está, la interpolamos casi a una analógica y sacamos una discreta, pero similar a la real.

Diagrama de bloques de sincronización:

Receptor SDR DVB-T2 en C++

Todo aquí está según el libro de texto. Lo siguiente es un poco más complicado. Es necesario calcular las desviaciones. Existe mucha literatura y artículos de investigación que comparan las ventajas y desventajas de diferentes métodos. De los clásicos: este es "Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Diseño óptimo de receptor para transmisión de banda ancha basada en OFDM - Partes I y II". Pero no he conocido a ningún ingeniero que pueda y quiera contar, por lo que se utilizó un enfoque de ingeniería. Utilizando el mismo método de sincronización, se introdujo la desafinación en la señal de prueba. Al comparar diferentes métricas con desviaciones conocidas (él mismo las presentó), se seleccionaron las mejores por su rendimiento y facilidad de implementación. La desviación de la frecuencia de recepción se calcula comparando el intervalo de guarda y su parte repetida. La fase de la frecuencia de recepción y la frecuencia de muestreo se estiman a partir de la desviación de fase de las señales piloto y esto también se utiliza en un ecualizador lineal simple de una señal OFDM.

Característica del ecualizador:

Receptor SDR DVB-T2 en C++

Y todo esto funciona bien si sabes cuándo comienza la trama DVB-T2. Para ello se transmite en la señal el símbolo de preámbulo P1. El método para detectar y decodificar el símbolo P1 se describe en la Especificación Técnica ETSI TS 102 831 (también hay muchas recomendaciones útiles para la recepción).

Autocorrelación de la señal P1 (el punto más alto al comienzo del cuadro):

Receptor SDR DVB-T2 en C++

Primera imagen (sólo faltan seis meses para la imagen en movimiento...):

Receptor SDR DVB-T2 en C++

Y aquí es donde aprendemos qué son el desequilibrio IQ, la compensación de CC y la fuga de LO. Por regla general, la compensación de estas distorsiones propias de la conversión directa se realiza en el controlador del dispositivo SDR. Por lo tanto, tomó mucho tiempo comprender: eliminar estrellas de la amigable constelación QAM64 es obra de las funciones de compensación. Tuve que apagar todo y escribir mi bicicleta.

Y entonces la imagen se movió:

Receptor SDR DVB-T2 en C++

Modulación QAM64 con rotación de constelación específica en el estándar DVB-T2:

Receptor SDR DVB-T2 en C++

En definitiva, este es el resultado de volver a pasar la carne picada por la picadora de carne. La norma prevé cuatro tipos de mezcla:

  • entrelazado de bits
  • entrelazado de celdas (mezcla de celdas en un bloque de codificación)
  • entrelazado de tiempo (también está en el grupo de bloques de codificación)
  • entrelazado de frecuencia (mezcla de frecuencia en un símbolo OFDM)

Como resultado, tenemos la siguiente señal en la entrada:

Receptor SDR DVB-T2 en C++

Todo esto es una lucha por la inmunidad al ruido de la señal codificada.

Total

Ahora podemos ver no sólo la señal en sí y su forma, sino también información del servicio.
Hay dos multicines al aire. Cada uno tiene dos canales físicos (PLP).

Se notó una rareza en el primer múltiplex: el primer PLP está etiquetado como "múltiple", lo cual es lógico, ya que hay más de uno en el múltiplex, y el segundo PLP está etiquetado como "único" y esta es una pregunta.
Aún más interesante es la segunda rareza en el segundo múltiplex: todos los programas están en el primer PLP, pero en el segundo PLP hay una señal de naturaleza desconocida a baja velocidad. Al menos el reproductor VLC, que comprende unos cincuenta formatos de vídeo y la misma cantidad de audio, no lo reconoce.

El proyecto en sí se puede encontrar aquí..

El proyecto fue creado con el objetivo de determinar la posibilidad misma de decodificar DVB-T2 usando SdrPlay (y ahora AirSpy), por lo que ni siquiera es una versión alfa.

PD: Mientras escribía el artículo con dificultad, logré integrar PlutoSDR en el proyecto.

Alguien dirá inmediatamente que solo hay 6 Msps para la señal IQ en la salida USB2.0, pero se necesitan al menos 9,2 Msps, pero este es un tema aparte.

Fuente: habr.com

Añadir un comentario