mirror of
https://github.com/Genaker/LoraSA.git
synced 2026-08-08 09:52:48 +02:00
first spectrogram working
This commit is contained in:
+50
-30
@@ -10,10 +10,14 @@ import matplotlib.pyplot as plt
|
||||
|
||||
from datetime import datetime
|
||||
from argparse import RawTextHelpFormatter
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
|
||||
# number of samples in each scanline
|
||||
SCAN_WIDTH = 4
|
||||
SCAN_MIN_FREQ = "850"
|
||||
SCAN_TIME_POINTS = 40
|
||||
|
||||
# scanline Serial start/end markers
|
||||
SCAN_MARK_START = "SCAN "
|
||||
@@ -115,15 +119,17 @@ def main():
|
||||
scan_len = 1000
|
||||
|
||||
# create the color map and the result array
|
||||
arr = np.zeros((SCAN_WIDTH, scan_len))
|
||||
arr = np.zeros((SCAN_WIDTH, scan_len, SCAN_TIME_POINTS))
|
||||
|
||||
# scanline counter
|
||||
row = 0
|
||||
|
||||
# list of frequencies in frequency mode
|
||||
freq_list = []
|
||||
|
||||
start = True
|
||||
time_list = []
|
||||
|
||||
start=True
|
||||
current_time_point=0
|
||||
|
||||
# open the COM port
|
||||
with serial.Serial(args.port, args.speed, timeout=None) as com:
|
||||
@@ -131,28 +137,29 @@ def main():
|
||||
# read a single line
|
||||
try:
|
||||
line = com.readline().decode("utf-8")
|
||||
print(line)
|
||||
#print(line)
|
||||
except:
|
||||
continue
|
||||
|
||||
|
||||
if "LOOP:" in line:
|
||||
continue
|
||||
|
||||
|
||||
if start:
|
||||
if SCAN_MIN_FREQ not in line:
|
||||
print("NOT IN LINE")
|
||||
continue
|
||||
else:
|
||||
print("IN LINE")
|
||||
start = False
|
||||
start=False
|
||||
start_time = datetime.now()
|
||||
# update the progress bar
|
||||
if not freq_mode:
|
||||
printProgressBar(row, scan_len)
|
||||
printProgressBar(current_time_point*scan_len+row, scan_len*SCAN_TIME_POINTS)
|
||||
|
||||
|
||||
|
||||
if SCAN_MARK_FREQ in line:
|
||||
new_freq = float(line.split(" ")[1])
|
||||
if (len(freq_list) > 1) and (new_freq < freq_list[-1]):
|
||||
break
|
||||
continue
|
||||
|
||||
freq_list.append(new_freq)
|
||||
print("{:.3f}".format(new_freq), end="\r")
|
||||
@@ -163,48 +170,61 @@ def main():
|
||||
# get the values
|
||||
scanline = line[len(SCAN_MARK_START) : -len(SCAN_MARK_END)].split(",")
|
||||
for col in range(SCAN_WIDTH):
|
||||
arr[col][row] = int(scanline[col])
|
||||
arr[col][row][current_time_point] = int(scanline[col])
|
||||
|
||||
# increment the row counter
|
||||
row = row + 1
|
||||
|
||||
# check if we're done
|
||||
if (not freq_mode) and (row >= scan_len):
|
||||
current_time_point+=1
|
||||
row=0
|
||||
current_time=datetime.now()
|
||||
time_list.append(round((current_time-start_time).total_seconds(),1))
|
||||
|
||||
if current_time_point==SCAN_TIME_POINTS:
|
||||
break
|
||||
|
||||
# scale to the number of scans (sum of any given scanline)
|
||||
num_samples = arr.sum(axis=0)[0]
|
||||
print("NUM SAMPLES:", num_samples)
|
||||
print("ARR.MAX:", arr.max())
|
||||
print("ARR.SHAPE:", arr.shape)
|
||||
print("LEN_FREQS:", len(freq_list))
|
||||
arr *= num_samples / arr.max()
|
||||
#num_samples = arr.sum(axis=0)[0]
|
||||
#arr *= num_samples / arr.max()
|
||||
#print("NUM SAMPLES:",num_samples)
|
||||
#print("ARR.MAX:",arr.max())
|
||||
print("ARR.SHAPE:",arr.shape)
|
||||
print("LEN_FREQS:",len(freq_list))
|
||||
arr=arr.mean(axis=0)
|
||||
print("ARR.SHAPE:",arr.shape)
|
||||
#arr=arr.reshape(-1,arr.shape[2])
|
||||
|
||||
|
||||
|
||||
if freq_mode:
|
||||
scan_len = len(freq_list)
|
||||
|
||||
# create the figure
|
||||
fig, ax = plt.subplots()
|
||||
|
||||
# print(arr)
|
||||
|
||||
#print(arr)
|
||||
print(freq_list)
|
||||
print(time_list)
|
||||
|
||||
# display the result as heatmap
|
||||
extent = [0, scan_len, -4 * (SCAN_WIDTH + 1), args.offset]
|
||||
if freq_mode:
|
||||
extent[0] = freq_list[0]
|
||||
extent[1] = freq_list[-1]
|
||||
im = ax.imshow(arr[:, :scan_len], cmap=args.map, extent=extent)
|
||||
|
||||
#extent[1] = time_list[-1]
|
||||
extent[3] = freq_list[0]
|
||||
extent[2] = freq_list[-1]
|
||||
im = ax.imshow(arr, cmap=args.map, extent=extent)
|
||||
fig.colorbar(im)
|
||||
|
||||
# set some properites and show
|
||||
timestamp = datetime.now().strftime("%y-%m-%d %H-%M-%S")
|
||||
title = f"RadioLib SX126x Spectral Scan {timestamp}"
|
||||
if freq_mode:
|
||||
plt.xlabel("Frequency [Hz]")
|
||||
else:
|
||||
plt.xlabel("Time [sample]")
|
||||
plt.ylabel("RSSI [dBm]")
|
||||
title = f"Spectrogram with values as mean dBm of 4 samples for 40 loops {timestamp}"
|
||||
|
||||
plt.xlabel("Time (N of loop at the moment)")
|
||||
plt.ylabel("Frequency [MHz]")
|
||||
#plt.xticks(time_list[::5],time_list[::5])
|
||||
plt.yticks(freq_list.reverse(),freq_list.reverse())
|
||||
ax.set_aspect("auto")
|
||||
fig.suptitle(title)
|
||||
fig.canvas.manager.set_window_title(title)
|
||||
|
||||
+1
-1
@@ -27,7 +27,7 @@
|
||||
|
||||
// The number of the spectrum screen lines = width of screen
|
||||
// Resolution of the scan is limited by 128-pixel screen
|
||||
#define STEPS 128
|
||||
#define STEPS 10
|
||||
|
||||
#define SCREEN_HEIGHT 64 // ???? not used
|
||||
|
||||
|
||||
+7
-7
@@ -157,8 +157,8 @@ typedef enum
|
||||
} TSCAN_METOD_ENUM;
|
||||
|
||||
#define SCAN_METHOD
|
||||
#define METHOD_SPECTRAL // Spectral scan method
|
||||
// #define METHOD_RSSI // Uncomment this and comment METHOD_SPECTRAL fot RSSI
|
||||
// #define METHOD_SPECTRAL // Spectral scan method
|
||||
#define METHOD_RSSI // Uncomment this and comment METHOD_SPECTRAL fot RSSI
|
||||
|
||||
// Output Pixel Formula
|
||||
// 1 = rssi / 4, 2 = (rssi / 2) - 22 or 20
|
||||
@@ -199,7 +199,7 @@ constexpr bool DRAW_DETECTION_TICKS = true;
|
||||
// if more than 100 it can freeze
|
||||
#define SAMPLES 35 //(scan time = 1294)
|
||||
// number of samples for RSSI method
|
||||
#define SAMPLES_RSSI 20 // 21 //
|
||||
#define SAMPLES_RSSI 4 // 21 //
|
||||
|
||||
#define RANGE (int)(FREQ_END - FREQ_BEGIN)
|
||||
|
||||
@@ -241,9 +241,9 @@ uint64_t detection_count = 0;
|
||||
bool single_page_scan = false;
|
||||
bool SOUND_ON = false;
|
||||
|
||||
#define PRINT_DEBUG
|
||||
// #define PRINT_DEBUG
|
||||
#define PRINT_PROFILE_TIME
|
||||
// #define PRINT_OUTPUT
|
||||
#define PRINT_OUTPUT
|
||||
|
||||
// #ifdef PRINT_PROFILE_TIME
|
||||
uint64_t loop_start = 0;
|
||||
@@ -977,7 +977,7 @@ void loop(void)
|
||||
else
|
||||
{
|
||||
#ifndef PRINT_OUTPUT
|
||||
Serial.printf("Out-of-Range:result_index %d\n", result_index);
|
||||
// Serial.printf("Out-of-Range:result_index %d\n", result_index);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1268,7 +1268,7 @@ void loop(void)
|
||||
joy_btn_clicked = false;
|
||||
|
||||
#ifdef PRINT_PROFILE_TIME
|
||||
Serial.printf("LOOP: %lld ms; SCAN: %lld ms;\n ", loop_time, scan_time);
|
||||
Serial.printf("LOOP: %lld ms; SCAN: %lld ms;\n", loop_time, scan_time);
|
||||
#endif
|
||||
// No WiFi and BT Scan Without OSD
|
||||
#ifdef OSD_ENABLED
|
||||
|
||||
Reference in New Issue
Block a user