Receptor SDR DVB-T2 em C++

O Rádio Definido por Software é um método de substituir o trabalho em metal (que na verdade é bom para a saúde) pela dor de cabeça da programação. Os SDR preveem um grande futuro e a principal vantagem é considerada a remoção de restrições na implementação de protocolos de rádio. Um exemplo é o método de modulação OFDM (multiplexação por divisão de frequência ortogonal), que só é possível pelo método SDR. Mas o SDR também tem mais uma oportunidade puramente de engenharia: a capacidade de controlar e visualizar um sinal em qualquer ponto arbitrário com o mínimo esforço.

Um dos padrões de comunicação interessantes é a televisão terrestre DVB-T2.
Para que? Claro, você pode simplesmente ligar a TV sem se levantar, mas não há absolutamente nada para assistir lá e isso não é mais minha opinião, mas um fato médico.

Sério, o DVB-T2 foi projetado com recursos muito amplos, incluindo:

  • aplicação interna
  • modulação de QPSK para 256QAM
  • largura de banda de 1,7 MHz a 8 MHz

Tenho experiência em recepção de televisão digital utilizando o princípio SDR. O padrão DVB-T está no conhecido projeto GNURadio. Existe um bloco gr-dvbs2rx para o padrão DVB-T2 (todos para o mesmo GNURadio), mas requer sincronização preliminar do sinal e é inspirador (agradecimentos especiais a Ron Economos).

O que nós temos?

Existe uma norma ETSI EN 302 755 que detalha a transmissão, mas não a recepção.

O sinal está no ar com frequência de amostragem de 9,14285714285714285714 MHz, modulado por COFDM com 32768 portadoras, na faixa de 8 MHz.

Recomenda-se receber tais sinais com o dobro da frequência de amostragem (para não perder nada) e na frequência intermediária mais largura de banda (recepção super-heteródina), para se livrar do deslocamento de corrente contínua (DC) e “vazamento” do oscilador local (LO) para a entrada do receptor. Os dispositivos que satisfazem estas condições são demasiado caros por mera curiosidade.

SdrPlay com 10Msps 10bit ou AirSpy com características semelhantes é muito mais barato. Não se trata aqui de dobrar a frequência de amostragem e a recepção só pode ser feita com conversão direta (Zero IF). Portanto (por razões financeiras) estamos passando para o lado dos adeptos do SDR “puro” com um mínimo de conversão de hardware.

Foi necessário resolver dois problemas:

  1. Sincronização. Descubra o desvio de RF com precisão de fase e o desvio de frequência de amostragem.
  2. Reescreva o padrão DVB-T2 ao contrário.

A segunda tarefa requer muito mais código, mas pode ser resolvida com perseverança e facilmente verificada usando sinais de teste.

Os sinais de teste estão disponíveis no servidor BBC ftp://ftp.kw.bbc.co.uk/t2refs/ com instruções detalhadas.

A solução para o primeiro problema é altamente dependente das características do dispositivo SDR e de suas capacidades de controle. Usar as funções de controle de frequência recomendadas, como dizem, não teve sucesso, mas proporcionou muita experiência na leitura delas. documentação, programação, assistir séries de TV, resolver questões filosóficas..., enfim, não foi possível abandonar o projeto.

A fé no “SDR puro” só ficou mais forte.

Pegamos o sinal como está, interpolamo-lo quase para um analógico e retiramos um sinal discreto, mas semelhante ao real.

Diagrama de blocos de sincronização:

Receptor SDR DVB-T2 em C++

Tudo aqui está de acordo com o livro didático. O próximo é um pouco mais complicado. Os desvios precisam ser calculados. Há muita literatura e artigos de pesquisa comparando as vantagens e desvantagens de diferentes métodos. Dos clássicos - este é “Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission – Parte I e II”. Mas não conheci um único engenheiro que pudesse e quisesse contar, então foi usada uma abordagem de engenharia. Usando o mesmo método de sincronização, a desafinação foi introduzida no sinal de teste. Ao comparar diferentes métricas com desvios conhecidos (ele mesmo os apresentou), as melhores foram selecionadas pelo desempenho e facilidade de implementação. O desvio da frequência de recepção é calculado comparando o intervalo de guarda e sua parte repetitiva. A fase da frequência de recepção e a frequência de amostragem são estimadas a partir do desvio de fase dos sinais piloto e isto também é usado em um equalizador linear simples de um sinal OFDM.

Característica do equalizador:

Receptor SDR DVB-T2 em C++

E tudo isso funciona bem se você souber quando o quadro DVB-T2 inicia. Para fazer isso, o símbolo de preâmbulo P1 é transmitido no sinal. O método para detectar e decodificar o símbolo P1 está descrito na Especificação Técnica ETSI TS 102 831 (há também muitas recomendações úteis para recepção).

Autocorrelação do sinal P1 (ponto mais alto no início do quadro):

Receptor SDR DVB-T2 em C++

Primeira foto (faltam apenas seis meses para a imagem em movimento...):

Receptor SDR DVB-T2 em C++

E é aqui que aprendemos o que são desequilíbrio de QI, deslocamento de CC e vazamento de LO. Via de regra, a compensação dessas distorções específicas da conversão direta é implementada no driver do dispositivo SDR. Portanto, demorou muito para entender: eliminar estrelas da amigável constelação QAM64 é trabalho das funções de compensação. Tive que desligar tudo e escrever minha bicicleta.

E então a imagem mudou:

Receptor SDR DVB-T2 em C++

Modulação QAM64 com rotação de constelação específica no padrão DVB-T2:

Receptor SDR DVB-T2 em C++

Resumindo, este é o resultado da passagem da carne picada de volta pelo moedor de carne. A norma prevê quatro tipos de mistura:

  • intercalação de bits
  • intercalação de células (mistura de células em um bloco de codificação)
  • intercalação temporal (também está no grupo de blocos de codificação)
  • intercalação de frequência (mistura de frequência em um símbolo OFDM)

Como resultado, temos o seguinte sinal na entrada:

Receptor SDR DVB-T2 em C++

Tudo isso é uma luta pela imunidade ao ruído do sinal codificado.

Total

Agora podemos ver não apenas o sinal em si e sua forma, mas também informações de serviço.
Existem dois multiplexes no ar. Cada um possui dois canais físicos (PLP).

Uma estranheza foi notada no primeiro multiplex - o primeiro PLP é rotulado como “múltiplo”, o que é lógico, pois há mais de um no multiplex, e o segundo PLP é rotulado como “único” e isso é uma questão.
Ainda mais interessante é a segunda estranheza no segundo multiplex - todos os programas estão no primeiro PLP, mas no segundo PLP há um sinal de natureza desconhecida em baixa velocidade. Pelo menos o player VLC, que entende cerca de cinquenta formatos de vídeo e a mesma quantidade de áudio, não o reconhece.

O projeto em si pode ser encontrado aqui.

O projeto foi criado com o objetivo de determinar a própria possibilidade de decodificação de DVB-T2 usando SdrPlay (e agora AirSpy), portanto esta nem é uma versão alfa.

PS Enquanto escrevia o artigo com dificuldade, consegui integrar o PlutoSDR ao projeto.

Alguém dirá imediatamente que há apenas 6Msps para o sinal IQ na saída USB2.0, mas você precisa de pelo menos 9,2Msps, mas este é um tópico separado.

Fonte: habr.com

Adicionar um comentário