From 465ea04df282db1dff8210f95fb5b52241dfc85c Mon Sep 17 00:00:00 2001 From: Alan Johnston Date: Mon, 27 Oct 2025 13:45:10 -0400 Subject: [PATCH] Create auto-tune.py --- groundstation/auto-tune.py | 81 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 groundstation/auto-tune.py diff --git a/groundstation/auto-tune.py b/groundstation/auto-tune.py new file mode 100644 index 00000000..435d6523 --- /dev/null +++ b/groundstation/auto-tune.py @@ -0,0 +1,81 @@ +from rtlsdr import RtlSdr +import numpy as np +import matplotlib.pyplot as plt + +# Create a sample signal (sum of two sine waves) +sampling_rate = 1024e3 # 250e3 # Hz +duration = 65536/sampling_rate # 1 # seconds +# t = np.linspace(0, duration, int(sampling_rate * duration), endpoint=False) +t = np.linspace(0, duration, int(sampling_rate * duration), endpoint=False) +# frequency1 = 50 # Hz +# frequency2 = 120 # Hz +# signal = 0.7 * np.sin(2 * np.pi * frequency1 * t) + np.sin(2 * np.pi * frequency2 * t) + +sdr = RtlSdr() + +# configure device +sdr.sample_rate = sampling_rate # 250e3 # 2.4e6 +center_frequency = 434.8e6 +sdr.center_freq = center_frequency +sdr.gain = 4 +sdr.direct_sampling = False + +# signal = sdr.read_samples(64*1024) #256 +signal = sdr.read_samples(duration*sampling_rate) #256 + +print(f"Center frequency is {center_frequency}") + +sdr.close() + +# Compute the FFT +fft_result = np.fft.fft(signal) + +# Calculate the frequencies corresponding to the FFT output +n = len(signal) +frequencies = np.fft.fftfreq(n, d=1/sampling_rate) + +# Take the absolute value for amplitude spectrum and consider only the positive frequencies +positive_frequencies_indices = np.where(frequencies >= 0) +positive_frequencies = frequencies[positive_frequencies_indices] +amplitude_spectrum = 2/n * np.abs(fft_result[positive_frequencies_indices]) # Normalize for amplitude + +# Plotting the results +plt.figure(figsize=(12, 6)) + +plt.subplot(1, 2, 1) +plt.plot(t, signal) +plt.title('Time Domain Signal') +plt.xlabel('Time (s)') +plt.ylabel('Amplitude') + +plt.subplot(1, 2, 2) +plt.stem(positive_frequencies, amplitude_spectrum, markerfmt=" ", basefmt="-b") +plt.title('Frequency Domain (FFT)') +plt.xlabel('Frequency (Hz)') +plt.ylabel('Amplitude') +plt.grid(True) + +plt.tight_layout() +plt.show() + +print(amplitude_spectrum) +x = amplitude_spectrum +print(x) +min_value = min(x) +max_value = max(x) + +#freq_min = np.argmax(min_value) +print(np.argmax(x)) +print(np.argmax(x)*(150e3 - 10e3)/(9770 - 709)) +print(sampling_rate) +print(center_frequency) + +offset = (np.argmax(x)*(150e3 - 10e3)/(9770 - 709)) +freq_max = center_frequency + offset + +print(f"The maximum signal is {max_value} at frequency {freq_max}") +#print(f"The minimum signal is {min_value} at frequency {freq_min}") + +print(min_value) +print(max_value) +