Voici le programme que j’utilise pour récupérer les échos de météores de façon autonome. Il s’agit d’une boucle infinie qui récupère les données de l’antenne, applique une FFT et si les résultats sont intéressants crée une image.
La library RTLSDR pour python :
https://pypi.org/project/pyrtlsdr/
#!/usr/bin/env python3.5
print("""
.:'
_.::'
.-;;-. (_.'
/ ;;;' \\
|. `: | METEOR SCATTER SERVER V1.0 by flo
\: `;/
'-..-'
""")
from matplotlib.pyplot import psd
from matplotlib.pyplot import clf
from rtlsdr import *
import numpy as np
import gc
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
from Console import Console
import datetime
def rgb(minimum, maximum, value):
minimum, maximum = float(minimum), float(maximum)
ratio = 2 * (value-minimum) / (maximum - minimum)
b = int(max(0, 255*(1 - ratio)))
r = int(max(0, 255*(ratio - 1)))
g = 255 - b - r
return r, g, b
def addLineToPNG(png, line, y):
mi = min(line)
ma = 14
for i in range(len(line)):
if line[i] > ma:
line[i] = ma
png[i,y] = rgb(mi,ma,line[i])
def img_save(arr, time):
l = len(arr)
band = len(arr[0])
new_im = Image.new('RGB', (band,l))
png = new_im.load()
for i in range(l):
addLineToPNG(png, arr[i], i)
new_im.save('out/'+time+".png", "PNG")
Console.print("Start")
while True:
height = 90
sample_rate = 250000
band = 512
gain = 50
freq = 143050000
sdr = RtlSdr()
sdr.sample_rate = sample_rate
sdr.center_freq = freq
sdr.gain = gain
z = 0
arr = [[]] * height
count = 0
while(True):
if(z == 500):
sdr.close()
z = 0
sdr = RtlSdr()
sdr.sample_rate = sample_rate
sdr.center_freq = freq
sdr.gain = gain
Pxx, f = psd(sdr.read_samples(sample_rate/2), NFFT=sample_rate, Fs=band/1e6, Fc=freq/1e6)
X = Pxx[int((sample_rate/2)-(band/2)) : int((sample_rate/2)+(band/2))]
X = np.float16(Pxx)
mn = np.mean(X)
if (mn > 3.5 and count == 0):
count = height - 5
if count > 0:
count -= 1
if count == 0:
now = str(datetime.datetime.now()).replace(':', '-').replace(' ', '_')
print('save : '+now)
img_save(arr, now)
i = height-1
while i > 0:
arr[i] = arr[i-1]
i -= 1
arr[0] = X
del Pxx
del f
clf()
gc.collect()
z += 1
Console.print('Stop send')
Je suis en train de réaliser ce type de projet (monitoring MS), mais j’avoue que j’ai quelques soucis:
-le code précédant, apres quelques modifs de base mais necessaires, fourni une image difficilement exploitable …toutes les 20min. Je suis sur RPi3. PSD me semble trés lent.
-je suis donc reparti de l’autre exemple (RTL to png), avec welch, mais du coup c’est la résolution qui est un peu faible
Dans les 2 cas, je dois me tromper quelque part, mais je commence à sécher.
La question: avec quel code exactement obtenez vous vos captures?