Made NOAA decoder
This commit is contained in:
parent
47b9030c63
commit
8226364eed
65
src/classes/NOAADecoder.py
Normal file
65
src/classes/NOAADecoder.py
Normal file
@ -0,0 +1,65 @@
|
||||
# Based on this article:
|
||||
# https://medium.com/swlh/decoding-noaa-satellite-images-using-50-lines-of-code-3c5d1d0a08da
|
||||
|
||||
import scipy.io.wavfile as wav
|
||||
import scipy.signal as signal
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from PIL import Image
|
||||
from tqdm import tqdm
|
||||
|
||||
class NOAADecoder:
|
||||
def __init__(self, iq_data=None, filename=None) -> None:
|
||||
# Check if iq_data or filename are set correctly
|
||||
if iq_data and filename:
|
||||
raise ValueError("Both iq_data and filename are set.")
|
||||
if not iq_data and not filename:
|
||||
raise ValueError("Neither iq_data nor filename are set.")
|
||||
|
||||
# Set iq_data or filename
|
||||
if filename:
|
||||
self.filename=filename
|
||||
self.sample_rate, self.data = wav.read(f'{self.filename}')
|
||||
if iq_data:
|
||||
self.sample_rate = 2048000
|
||||
self.data = self.iq_data
|
||||
|
||||
def hilbert(self, data):
|
||||
# Hilbert transform
|
||||
analytical_signal = signal.hilbert(data)
|
||||
amplitude_envelope = np.abs(analytical_signal)
|
||||
return amplitude_envelope
|
||||
|
||||
def decode(self, resample=4):
|
||||
|
||||
# Resample data
|
||||
data = self.data[::resample]
|
||||
sample_rate = self.sample_rate//resample
|
||||
|
||||
# Demodulate
|
||||
data_am = self.hilbert(data)
|
||||
frame_width = int(0.5*sample_rate)
|
||||
|
||||
# Image processing
|
||||
w, h = frame_width, data_am.shape[0]//frame_width
|
||||
image = Image.new('L', (w, h))
|
||||
px, py = 0, 0
|
||||
|
||||
for p in tqdm(range(data_am.shape[0])):
|
||||
if data_am[p][0] != data_am[p][1]:
|
||||
raise BufferError("Mismatch in data array.")
|
||||
lum = int(data_am[p][0]//32 - 32)
|
||||
if lum < 0: lum = 0
|
||||
if lum > 255: lum = 255
|
||||
image.putpixel((px, py),lum)
|
||||
px += 1
|
||||
if px >= w:
|
||||
px = 0
|
||||
py += 1
|
||||
if py >= h:
|
||||
break
|
||||
image = image.resize((w, 4*h))
|
||||
plt.imshow(image, cmap='gray')
|
||||
# Save image
|
||||
image.save('noaa.png')
|
||||
return
|
Loading…
x
Reference in New Issue
Block a user