Oi Habr.
Hoje continuamos o tópico de recepção SDR e processamento de sinal. Fiquei interessado em receber TV analógica por acidente, após uma pergunta de um dos leitores. No entanto, isso não foi tão simples, devido à falta banal de amostras de sinal - em muitos lugares, a TV analógica já foi desligada. O leitor até enviou uma gravação com RTL-SDR, no entanto, a largura da gravação em RTL é de cerca de 2 MHz, enquanto a largura de banda do sinal de TV é de cerca de 8 MHz e nada ficou claro na gravação. Como resultado, o assunto foi abandonado por um longo tempo e, finalmente, agora, na próxima viagem aos meus parentes, levei o SDRPlay comigo e sintonizei as frequências dos canais de TV, vi o sinal desejado na tela.
Um pequeno programa Python, e tudo funciona:

Para quem está interessado em detalhes, continuou sob o corte.
Teoria
Nos velhos anos do pós-guerra, quando os sinais secretos digitais eram conhecidos apenas em laboratórios secretos, mas as pessoas já queriam assistir TV, havia três padrões analógicos concorrentes. O primeiro foi o
NTSC (Comitê Nacional do Sistema Nacional de Televisão), desenvolvido desde os anos 40, foi "aguçado" para a frequência de rede americana de 60Hz e tinha uma resolução vertical de apenas 486 linhas. Um pouco mais tarde na Alemanha, o padrão
PAL (Phase Alternating Line) começou a ser desenvolvido, que era um pouco melhor que o americano (resolução das “576 linhas inteiras” e focava na frequência da rede européia de 50Hz), e um pouco depois apareceu o
SECAM (Séquentiel couleur à mémoire) francês. Eliminou algumas das deficiências do PAL relacionadas à reprodução de cores, e há uma versão de que a adoção de dois padrões também foi uma decisão política, para que os residentes de alguns países não pudessem assistir a programas de outros países (foram necessários 50 anos antes da união da União Européia e Schengen) . De um jeito ou de outro, mas o mundo inteiro estava dividido assim:

Porque Habr ainda é um site em russo, então no futuro consideraremos o SECAM, embora se alguém enviar um sinal de amostra PAL, também seria interessante.
O espectro SECAM, de
acordo com pergaminhos antigos , é o seguinte:

À esquerda, na frequência F0, está o sinal de luminância modulada em amplitude (L). Na verdade, é uma imagem em preto e branco, que ainda pode ser exibida em uma TV antiga em preto e branco
quente e com lâmpada . O problema do Legacy e a presença de dispositivos antigos entre os usuários já existiam, então o canal colorido foi adicionado separadamente, sem perder a compatibilidade com os aparelhos de televisão antigos. Dois canais de cores foram transmitidos alternadamente na modulação de frequência nas frequências de 4,25 e 4,406 MHz. E, finalmente, com uma frequência ainda maior, o som foi transmitido separadamente, também na modulação de frequência.
A propósito, com a recepção da TV em São Petersburgo, há um momento engraçado. Como noticiou a mídia russa, a TV analógica foi desligada em outubro:

No entanto, isso se aplica apenas aos
canais estaduais ; ninguém força os
canais comerciais
a desativar suas transmissões. Pelo menos no momento da redação deste artigo (dezembro de 2019), aproximadamente 5-6 canais ainda estão disponíveis no "analógico" no centro de São Petersburgo. Mas quanto tempo vai durar é desconhecido, então aqueles que desejam gravar amostras de sinal “para histórico” ainda devem estar com pressa.
Finalmente, é hora de ativar o SDR e ver o que temos na vida real:

O canal de áudio não é difícil, você pode simplesmente passar o mouse sobre ele com o “mouse” no HDSDR, selecionar FM com uma largura de banda de cerca de 50KHz e ouvir. Começaremos a decodificar a partir do canal de brilho, isso nos permitirá obter uma "imagem" pronta.
Decodificação
Como descrito acima, os sinais de luminância são transmitidos para AM. Para não escrever um decodificador, usamos o GNU Radio - transferimos o espectro para a frequência zero, iniciamos o decodificador AM e salvamos o resultado em um arquivo.

Agora podemos abrir o arquivo salvo no Python:
import numpy as np import matplotlib.pyplot as plt lum_data = np.fromfile("pal_lum.raw", dtype='int32') lum_data = -lum_data - 4700 fs = 9000000//2 x_time = np.linspace(0, len(lum_data)/fs, num=len(lum_data)) plt.plot(x_time, lum_data)
Vemos uma sequência de 4 quadros na tela.

O comprimento de um quadro de 0,02s - este é apenas 1/50 - é um múltiplo da frequência de rede de 50Hz, cujos sinais servem como um "gerador de relógio" (não esqueça que o sinal é analógico). Para cada quadro, 320 linhas são transmitidas - temos varredura entrelaçada, portanto a taxa de quadros final é de 25 Hz.
Vamos ver as linhas individuais em mais detalhes:

Como você pode ver, o início de cada linha corresponde a um "relógio"; o balanço do sinal corresponde aos valores atuais de brilho nessa linha. Tudo é bem simples e, provavelmente, praticamente sem alterações, esse sinal foi aplicado ao tubo de raios catódicos da TV.
O resto é uma questão de tecnologia. Criamos uma imagem na memória e copiamos dois quadros para ela, porque nós entrelaçamos. O intervalo de sinal não excede +200, o que nos permite escrever esses valores diretamente como cores RGB.
Como você pode ver, estou usando o cruzamento de zero para detectar o início de uma nova linha. A imagem acabou sendo compactada verticalmente, neste caso, depende da frequência de amostragem do SDR; no final, acabei de redimensionar.
O resultado final na animação de 10 quadros (não aceita mais o arquivo Habr):

Conclusão
É interessante analisar esses padrões, porque em primeiro lugar, são bastante simples de implementar e, em segundo lugar, seu estudo também é parcialmente de interesse histórico. Obviamente, eu não tinha o objetivo de criar um sintonizador de TV de software completo, portanto o código é mostrado em uma forma minimamente operacional.
Se as classificações do artigo forem positivas, na segunda parte, será possível considerar o trabalho com cores e exibir uma imagem colorida completa.
Para aqueles que desejam experimentar por conta própria, o arquivo IQ pode ser baixado
aqui .
Todas as experiências bem sucedidas.