Receptor SDR DVB-T2 em C++

Rádio Definido por Software (software defined radio) é um método que substitui o trabalho em metal (o que, em essência, é benéfico para a saúde) pela dor de cabeça da programação. O SDR é prevido para um grande futuro, e sua principal vantagem é a remoção das limitações na implementação de protocolos de rádio. Um exemplo é o método de modulação OFDM (Orthogonal frequency-division multiplexing), que só se tornou possível através do método SDR. No entanto, o SDR também oferece outra possibilidade puramente engenheiral — a capacidade de controlar e visualizar o sinal em qualquer ponto arbitrário com o mínimo de esforço.

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

Falando sério, o DVB-T2 foi desenvolvido com possibilidades muito amplas, incluindo:

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

Há experiência na recepção de televisão digital pelo princípio do SDR. O padrão DVB-T está presente em um projeto conhecido chamado GNURadio. Existe um bloco gr-dvbs2rx para o padrão DVB-T2 (tudo para o mesmo GNURadio), mas que requer pré-sincronização do sinal e é inspirador (um agradecimento especial a Ron Economos).

O que temos.

Há um padrão ETSI EN 302 755, que descreve detalhadamente a transmissão, mas não a recepção.

O sinal no ar com uma taxa de amostragem de 9,14285714285714285714 MHz, modulado em COFDM com 32768 portadoras, na largura de banda de 8 MHZ.

É recomendado receber tais sinais com o dobro da taxa de amostragem (para não perder nada) e em uma frequência intermediária superior à largura de banda (recepção superheteródina), para eliminar o deslocamento de corrente contínua (DC) e "permeação" do oscilador local (LO) na entrada do receptor. Dispositivos que atendem a esses requisitos são muito caros para simples curiosidade.

O SdrPlay com 10Msps 10bit ou o AirSpy com características semelhantes são significativamente mais baratos. Aqui não se fala sobre o dobro da taxa de amostragem e a recepção pode ser feita apenas com conversão direta (Zero IF). Portanto, (por razões financeiras) estamos nos voltando para o lado dos adeptos do "SDR puro" com o mínimo de conversão de hardware.

Foi necessário resolver duas tarefas:

  1. Sincronização. Determinar a exata desvio da frequência de rádio com precisão até a fase e o desvio da taxa de amostragem.
  2. Reescrever o padrão DVB-T2 de maneira inversa.

A segunda tarefa exige muito mais código, mas é solucionável com persistência e pode ser facilmente verificada por sinais de teste.

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

A solução da primeira tarefa depende fortemente das características do dispositivo SDR e das capacidades de controle. Usar funções de controle de frequência recomendadas, conforme mencionado, não foi bem-sucedido, mas proporcionou uma grande experiência em leitura de documentação técnica, programação, assistindo séries, resolução de questões filosóficas... em resumo, não consegui abandonar o projeto.

A fé no 'pure SDR' apenas se fortaleceu.

Recebemos o sinal como ele é, o interpolamos praticamente até uma forma analógica e extraímos um sinal discreto, mas semelhante ao original.

Diagrama de sincronização:

Receptor SDR DVB-T2 em C++

Aqui tudo é conforme o manual. A seguir é um pouco mais complicado. É necessário calcular as desvios. Há muita literatura e artigos de pesquisa que comparam as vantagens e desvantagens de diferentes métodos. Clássicos incluem 'Michael Speth, Stefan Fechtel, Gunnar Fock, Heinrich Meyr, Optimum Receiver Design for OFDM-Based Broadband Transmission – Part I e II'. No entanto, nunca encontrei um engenheiro que soubesse e quisesse fazer esses cálculos, por isso foi adotada uma abordagem engenheiral. Com o mesmo método de sincronização, foram introduzidos distúrbios no sinal de teste. Para selecionar as melhores métricas para desempenho e simplicidade de implementação, diferentes métricas foram comparadas com desvios conhecidos (que eu mesmo introduzi). O desvio da frequência de recepção é calculado comparando o intervalo de proteção e sua parte repetitiva. A fase da frequência de recepção e a frequência de amostragem são avaliadas com base na desvio das fases dos sinais piloto e essa mesma informação é utilizada em um equalizador OFDM simples e linear.

Característica do equalizador:

Receptor SDR DVB-T2 em C++

E tudo isso funciona bem se soubermos quando começa o quadro DVB-T2. Para isso, um símbolo de préâmbulo P1 é transmitido no sinal. O método de detecção e decodificação do símbolo P1 é descrito na Especificação Técnica ETSI TS 102 831 (que também contém muitas recomendações úteis para recepção).

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

Receptor SDR DVB-T2 em C++

A primeira imagem (faltam apenas seis meses para a imagem em movimento...):

Receptor SDR DVB-T2 em C++

E é aqui que vamos entender o que é desequilíbrio de IQ, offset DC e vazamento de LO. Normalmente, a compensação dessas distorções específicas da conversão direta é implementada no driver do dispositivo SDR. Portanto, levou muito tempo para entender: a remoção de estrelas de uma constelação amigável QAM64 é uma tarefa das funções de compensação. Tive que desligar tudo e escrever minha própria solução.

E agora a imagem começou a se mover:

Receptor SDR DVB-T2 em C++

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

Receptor SDR DVB-T2 em C++

Resumindo, esse é o resultado de passar o recheio de volta pela moedora de carne. O padrão prevê quatro tipos de embaralhamento:

  • embaralhamento de bits (bit interleaving com torção de colunas)
  • embaralhamento de células (cell interleaving no bloco de codificação)
  • embaralhamento temporal (time interleaving também conhecido em grupos de blocos de codificação)
  • embaralhamento de frequência (frequency interleaving em símbolo OFDM)

Como resultado, temos este sinal na entrada:

Receptor SDR DVB-T2 em C++

Tudo isso é uma luta pela resistência a interferências do sinal codificado.

Resultado

Agora podemos ver não apenas o sinal em si e sua forma, mas também as informações de serviço.
No ar, há dois multiplexos. Em cada um, dois canais físicos (PLP).

Uma peculiaridade foi notada no primeiro multiplexo — o primeiro PLP tem a etiqueta 'multiple', o que faz sentido, já que ele não está sozinho no multiplexo, enquanto o segundo PLP tem a etiqueta 'single' e isso é uma questão.
Ainda mais interessante é a segunda peculiaridade no segundo multiplexo — todos os programas estão no primeiro PLP, e no segundo PLP, a uma velocidade baixa, há um sinal de natureza desconhecida. Pelo menos, o player VLC, que compreende cerca de cinquenta formatos de vídeo e tantos de áudio, não o reconhece.

O projeto pode ser encontrado aqui.

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

P.S. Enquanto o artigo era escrito com dificuldade, consegui adicionar o PlutoSDR ao projeto.

Alguém pode dizer imediatamente que só há 6Msps para o sinal IQ na saída USB2.0, enquanto são necessários pelo menos 9,2Msps, mas isso já é um assunto separado.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster