Vamos continuar com o tópico de decodificação de diferentes tipos de sinais de rádio. Um dos formatos interessantes desenvolvidos no século passado é o APT (Automatic Picture Transmission). Ele é usado para transmitir imagens da Terra do espaço, e o que é muito mais interessante e relevante para nós, receber sinais APT é simples e acessível para rádios amadores.
Satélite NOAA © en.wikipedia.org/wiki/NOAA-15
Para os interessados, a continuação sob o corte.
informação geral
Os satélites meteorológicos NOAA de nosso interesse pertencem à série TIROS (Television InfraRed Observation Satellite), o primeiro dos quais foi lançado em 1960. Atualmente, existem 3 satélites em operação (NOAA-15, NOAA-18 e NOAA-19, o mais antigo dos quais, NOAA -15 trabalhos desde 1998). Os satélites giram em torno da Terra a uma altitude de 850 km e fazem uma revolução em cerca de 1,5 horas. Existem vários sensores a bordo, mas teremos interesse em receber imagens meteorológicas. E existem duas opções. O mais simples e mais amplamente disponível é um sinal analógico do já mencionado formato APT na frequência de 137 MHz. Além disso, os satélites também transmitem imagens em formato HRPT de alta resolução (Transmissão de imagem de alta resolução) a 1,7 GHz. Há decodificadores HRPT disponíveis, mas uma antena rotativa com bom ganho já é desejável para recepção, que é mais difícil e cara.
De acordo com as convenções internacionais, todos os dados meteorológicos são abertos e qualquer pessoa pode receber os sinais NOAA. O que vamos fazer agora.
Já houve vários artigos sobre a recepção de sinais NOAA no Habré (por exemplo, 1 , 2 ), mas todos eles geralmente se resumem a "plugado no receptor, execute o programa, peguei uma imagem", sem muita explicação de como essa imagem é transmitida. Vamos tentar descer um nível e ver como o sinal funciona internamente.
Recepção
O primeiro e mais óbvio. O satélite não é geoestacionário, ele se move no céu, então o tempo de recepção deve ser “capturado”. O mais simples é usar o serviço online n2yo.com, que permite calcular o tempo de voo de qualquer satélite. Aqui está um exemplo de NOAA 19 :
Boa recepção, quando o satélite está bem acima do horizonte, cerca de uma vez por dia, o próprio satélite no céu leva cerca de 10 minutos, por isso pode ser útil configurar uma gravação agendada no momento certo.
Claro, você precisa de um receptor para receber o sinal de rádio. O RTL-SDR V3 mais barato por US $ 35 serve, eu usei um SDRPlay de melhor qualidade com as seguintes configurações:
Como você pode ver, eu configurei o valor de dizimação para o máximo, o que me permite obter a faixa dinâmica máxima. Os níveis de ganho LNA e Ganho devem ser selecionados dependendo da antena. Os satélites NOAA 15, 18 e 19 transmitem sinais nas frequências de 137,620, 137,9125 e 137,100 MHz, respectivamente. O sinal em si tem uma largura de banda em torno de 50 kHz, e se tudo foi feito corretamente, em um determinado momento o sinal deve aparecer no espectro:
É interessante notar a inclinação das linhas devido ao efeito Doppler - o satélite está passando por nós, e levando em consideração o tempo de vôo, este é outro bem prova da esfericidade da Terra;)
Falando em recepção, a melhor coisa sobre os satélites NOAA é que a recepção é muito acessível para iniciantes. O sinal vai, a princípio, ser ouvido em qualquer antena, até no "bigode" da TV, mas para uma boa imagem a qualidade da antena é muito crítica. Com uma antena ruim (como a minha :) a imagem fica menos contrastante, mas é o suficiente para demonstrar o funcionamento do decodificador. Uma antena dedicada de 137 MHz pode ser adquirida ou feita de encanamento e tubos de cobre, um exemplo pode ser visto aqui . No entanto, o tema do artigo ainda é o processamento de sinais, e não a carpintaria, quem quiser pode estudar o tema da construção de antenas por conta própria.
Assim, olhamos para o tempo de vôo do satélite, selecionamos o modo de gravação FM no programa com largura de banda de 50 KHz e registramos o sinal. O resultado deve ser um arquivo WAV de cerca de 10 minutos de duração e os pulsos periódicos devem ser claramente audíveis. Agora você pode começar a decodificar.
Decodificação
Etapa 1 . Vamos carregar o arquivo usando a biblioteca scipy e exibi-lo na tela. Eu só exibo um fragmento de 20 a 21 segundos, caso contrário, a renderização será muito longa.
import scipy.io.wavfile as wav
import scipy.signal as signal
import numpy as np
import matplotlib.pyplot as plt
fs, data = wav.read('HDSDR_20201227_070306Z_137100kHz_AF.wav')
data_crop = data[20*fs:21*fs]
plt.figure(figsize=(12,4))
plt.plot(data_crop)
plt.xlabel("Samples")
plt.ylabel("Amplitude")
plt.title("Signal")
plt.show()
Uma periodicidade de sinal clara deve ser visível:
Etapa 2 . Para acelerar a decodificação, vamos reduzir a taxa de amostragem em 4 vezes, descartando valores desnecessários:
resample = 4
data = data[::resample]
fs = fs//resample
Etapa 3 . A imagem é transmitida em modulação de amplitude, para conversão para AM, basta aplicar a transformada de Hilbert:
def hilbert(data):
analytical_signal = signal.hilbert(data)
amplitude_envelope = np.abs(analytical_signal)
return amplitude_envelope
data_am = hilbert(data)
Você pode exibir a imagem na tela e certificar-se de que recebemos o envelope de sinal:
Etapa 4 . Conclusão. Na verdade, a decodificação já está finalizada. Os próprios dados são transmitidos em formato analógico, portanto a cor do pixel depende do nível do sinal. Podemos "desdobrar" a imagem em uma imagem 2D, a partir da descrição do formato sabe-se que uma linha é transmitida em 0,5 s:
from PIL import Image
frame_width = int(0.5*fs)
w, h = frame_width, data_am.shape[0]//frame_width
image = Image.new('RGB', (w, h))
px, py = 0, 0
for p in range(data_am.shape[0]):
lum = int(data_am[p]//32 - 32)
if lum < 0: lum = 0
if lum > 255: lum = 255
image.putpixel((px, py), (0, lum, 0))
px += 1
if px >= w:
if (py % 50) == 0:
print(f"Line saved {py} of {h}")
px = 0
py += 1
if py >= h:
break
A função putpixel não é a maneira mais rápida de trabalhar com imagens, e o código pode ser acelerado 10 vezes usando numpy.reshape e Image.fromarray, mas o método linha por linha é mais descritivo. Para converter a amplitude do sinal para a faixa de brilho 0..255, os valores são divididos por 32, para outra antena o valor pode ter que ser alterado.
Para facilitar a visualização, esticamos a imagem verticalmente e a exibimos na tela:
image = image.resize((w, 4*h))
plt.imshow(image)
plt.show()
Se tudo foi feito corretamente, deveríamos obter uma imagem mais ou menos assim:
Quente e verde lâmpada foram escolhidos apenas pela beleza, aqueles que desejam podem alterar a gama de cores a seu critério, alterando os parâmetros da função putpixel. O que vemos na tela? No formato APT, dois canais são transmitidos. O IR distante é transmitido em uma metade do quadro, o IR próximo / intermediário é transmitido para o outro, o modo é selecionado dependendo se o satélite transmite uma imagem diurna ou noturna. A imagem também contém marcadores de sincronização e telemetria, quem quiser pode ver a descrição do formato APTem detalhes. Programas mais avançados usam esses marcadores para nivelar a imagem, mas podem não funcionar com sinais fracos. O código acima nunca sai de sincronia, pois simplesmente não está lá, mesmo o sinal mais fraco e ruidoso será visível, embora com menos contraste.
Conclusão
Conforme mencionado anteriormente, não existem tantos sistemas de comunicação eficazes no mundo, cujo sinal pode ser decodificado usando 20 linhas de código. Os satélites NOAA têm cerca de 20 anos e, quando falham, o novo formato provavelmente será digital e mais complexo (editar - como sugerido nos comentários, o novo Meteor-M2 já está transmitindo dados em digital a 137 MHz). Portanto, aqueles que desejam tentar algo simples e descomplicado para decodificar podem ser aconselhados a se apressar.
Claro, opcionalmente sinais de decodificação NOAA apenas desta forma, existem decodificadores prontos, que têm usado paramais possibilidades, como desenhar contornos de países e cidades, formar pseudo cores a partir de canais monocromáticos, etc. Mas fazer você mesmo do zero é muito mais interessante.
Como de costume, boa sorte a todos.