kopia lustrzana https://github.com/cariboulabs/cariboulite
80 wiersze
2.3 KiB
Python
80 wiersze
2.3 KiB
Python
# PySimpleGUI
|
|
from PySimpleGUI.PySimpleGUI import Canvas, Column
|
|
from PySimpleGUI import Window, WIN_CLOSED, Slider, Button, theme, Text, Radio, Image, InputText, Canvas
|
|
|
|
# Numpy
|
|
import matplotlib.pyplot as plt
|
|
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
|
|
import numpy as np
|
|
from numpy.lib.arraypad import pad
|
|
|
|
# System
|
|
import time
|
|
|
|
# Soapy
|
|
import SoapySDR
|
|
from SoapySDR import SOAPY_SDR_RX, SOAPY_SDR_TX, SOAPY_SDR_CS16
|
|
|
|
|
|
def setup_receiver(sdr, channel, freq_hz):
|
|
use_agc = False # Use or don't use the AGC
|
|
# The wide channel parameters
|
|
sdr.setGainMode(SOAPY_SDR_RX, channel, use_agc) # Set the gain mode
|
|
sdr.setGain(SOAPY_SDR_RX, channel, 0) # Set the gain
|
|
sdr.setFrequency(SOAPY_SDR_RX, channel, freq_hz) # Tune the LO
|
|
sdr.setBandwidth(SOAPY_SDR_RX, channel, 2500e5)
|
|
rx_stream = sdr.setupStream(SOAPY_SDR_RX, SOAPY_SDR_CS16, [channel]) # Setup data stream
|
|
return rx_stream
|
|
|
|
def update_receiver_freq(sdr, stream, channel, freq_hz):
|
|
sdr.setFrequency(SOAPY_SDR_RX, channel, freq_hz)
|
|
|
|
|
|
##
|
|
## GLOBAL AREA
|
|
##
|
|
|
|
# Data and Source Configuration
|
|
rx_chan = 0
|
|
N = 16384 # Number of complex samples per transfer
|
|
rx_buff = np.empty(2 * N, np.int16) # Create memory buffer for data stream
|
|
freq = 915e6
|
|
|
|
# Initialize Soapy
|
|
sdr = SoapySDR.Device(dict(driver="CaribouLite"))
|
|
rx_stream = setup_receiver(sdr, rx_chan, freq)
|
|
sdr.activateStream(rx_stream)
|
|
|
|
sr = sdr.readStream(rx_stream, [rx_buff], N, timeoutUs=int(5e6))
|
|
# Make sure that the proper number of samples was read
|
|
rc = sr.ret
|
|
if (rc != N):
|
|
print("Error Reading Samples from Device (error code = %d)!" % rc)
|
|
exit
|
|
|
|
s_real = rx_buff[::2].astype(np.float32)
|
|
s_imag = -rx_buff[1::2].astype(np.float32)
|
|
x = s_real + 1j*s_imag
|
|
|
|
## PSD
|
|
Fs = 4e6
|
|
#N = 2048
|
|
#x = x[0:N] # we will only take the FFT of the first 1024 samples, see text below
|
|
x = x * np.hamming(len(x)) # apply a Hamming window
|
|
|
|
PSD = (np.abs(np.fft.fft(x))/N)**2
|
|
PSD_log = 10.0*np.log10(PSD)
|
|
PSD_shifted = np.fft.fftshift(PSD_log)
|
|
|
|
center_freq = freq
|
|
f = np.arange(Fs/-2.0, Fs/2.0, Fs/N) # start, stop, step. centered around 0 Hz
|
|
#f += center_freq # now add center frequency
|
|
|
|
fig = plt.figure()
|
|
plt.plot(f, PSD_shifted)
|
|
plt.show()
|
|
|
|
fig = plt.figure()
|
|
plt.plot(s_real)
|
|
plt.plot(s_imag)
|
|
plt.show() |