diff --git a/CFAR_RADAR_Waterfall.py b/CFAR_RADAR_Waterfall.py index b741979..435c4ce 100644 --- a/CFAR_RADAR_Waterfall.py +++ b/CFAR_RADAR_Waterfall.py @@ -33,8 +33,8 @@ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -'''FMCW Radar Demo with Phaser (CN0566) - Jon Kraft, Nov 19 2023''' +'''CFAR Radar Demo with Phaser (CN0566) + Jon Kraft, Jan 20 2024''' # Imports import adi @@ -79,8 +79,9 @@ except: sample_rate = 0.6e6 center_freq = 2.1e9 signal_freq = 100e3 -num_slices = 50 -fft_size = 1024 * 16 +num_slices = 20 # this sets how much time will be displayed on the waterfall plot +fft_size = 1024 * 4 +plot_freq = 100e3 # x-axis freq range to plot img_array = np.ones((num_slices, fft_size))*(-100) # Configure SDR Rx @@ -102,9 +103,8 @@ my_sdr.tx_hardwaregain_chan1 = -0 # must be between 0 and -88 # Configure the ADF4159 Rampling PLL output_freq = 12.145e9 BW = 500e6 -num_steps = 1000 -ramp_time = 1.2e3 # us -ramp_time_s = ramp_time / 1e6 +num_steps = 500 +ramp_time = 0.5e3 # us my_phaser.frequency = int(output_freq / 4) # Output frequency divided by 4 my_phaser.freq_dev_range = int( BW / 4 @@ -116,7 +116,9 @@ my_phaser.freq_dev_time = int( ramp_time ) # total time (in us) of the complete frequency ramp print("requested freq dev time = ", ramp_time) -print("actual freq dev time = ", my_phaser.freq_dev_time) +ramp_time = my_phaser.freq_dev_time +ramp_time_s = ramp_time / 1e6 +print("actual freq dev time = ", ramp_time) my_phaser.delay_word = 4095 # 12 bit delay word. 4095*PFD = 40.95 us. For sawtooth ramps, this is also the length of the Ramp_complete signal my_phaser.delay_clk = "PFD" # can be 'PFD' or 'PFD*CLK1' my_phaser.delay_start_en = 0 # delay start @@ -151,7 +153,6 @@ IF: {signal_freq}kHz # Create a sinewave waveform fs = int(my_sdr.sample_rate) -print("sample_rate:", fs) N = int(my_sdr.rx_buffer_size) fc = int(signal_freq / (fs / N)) * (fs / N) ts = 1 / float(fs) @@ -165,7 +166,7 @@ my_sdr._ctx.set_timeout(0) my_sdr.tx([iq * 0.5, iq]) # only send data to the 2nd channel (that's all we need) c = 3e8 -default_rf_bw = 500e6 +default_chirp_bw = 500e6 N_frame = fft_size freq = np.linspace(-fs / 2, fs / 2, int(N_frame)) slope = BW / ramp_time_s @@ -179,23 +180,23 @@ class Window(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Interactive FFT") - self.setGeometry(100, 100, 800, 800) # (x,y, width, height) - self.setFixedWidth(1600) + self.setGeometry(0, 0, 400, 400) # (x,y, width, height) + #self.setFixedWidth(600) + self.setWindowState(QtCore.Qt.WindowMaximized) self.num_rows = 12 self.setWindowFlag(QtCore.Qt.WindowCloseButtonHint, False) #remove the window's close button self.UiComponents() - # showing all the widgets self.show() # method for components def UiComponents(self): widget = QWidget() - global layout + global layout, signal_freq, plot_freq layout = QGridLayout() # Control Panel - control_label = QLabel("PHASER Simple FMCW Radar") + control_label = QLabel("PHASER CFAR Targeting") font = control_label.font() font.setPointSize(24) control_label.setFont(font) @@ -217,18 +218,18 @@ class Window(QMainWindow): self.cfar_check.stateChanged.connect(self.change_cfar) layout.addWidget(self.cfar_check, 2, 1) - # RF bandwidth slider + # Chirp bandwidth slider self.bw_slider = QSlider(Qt.Horizontal) self.bw_slider.setMinimum(100) self.bw_slider.setMaximum(500) - self.bw_slider.setValue(int(default_rf_bw / 1e6)) + self.bw_slider.setValue(int(default_chirp_bw / 1e6)) self.bw_slider.setTickInterval(50) self.bw_slider.setMaximumWidth(200) self.bw_slider.setTickPosition(QSlider.TicksBelow) self.bw_slider.valueChanged.connect(self.get_range_res) layout.addWidget(self.bw_slider, 4, 0) - self.set_bw = QPushButton("Set RF Bandwidth") + self.set_bw = QPushButton("Set Chirp Bandwidth") self.set_bw.setMaximumWidth(200) self.set_bw.pressed.connect(self.set_range_res) layout.addWidget(self.set_bw, 5, 0, 1, 1) @@ -240,9 +241,9 @@ class Window(QMainWindow): #CFAR Sliders self.cfar_bias = QSlider(Qt.Horizontal) self.cfar_bias.setMinimum(0) - self.cfar_bias.setMaximum(50) - self.cfar_bias.setValue(36) - self.cfar_bias.setTickInterval(2) + self.cfar_bias.setMaximum(100) + self.cfar_bias.setValue(40) + self.cfar_bias.setTickInterval(5) self.cfar_bias.setMaximumWidth(200) self.cfar_bias.setTickPosition(QSlider.TicksBelow) self.cfar_bias.valueChanged.connect(self.get_cfar_values) @@ -353,15 +354,15 @@ class Window(QMainWindow): self.fft_plot = pg.plot() self.fft_plot.setMinimumWidth(600) self.fft_curve = self.fft_plot.plot(freq, pen={'color':'y', 'width':2}) - self.fft_threshold = self.fft_plot.plot(freq, pen={'color':'r', 'width':8}) + self.fft_threshold = self.fft_plot.plot(freq, pen={'color':'r', 'width':2}) title_style = {"size": "20pt"} label_style = {"color": "#FFF", "font-size": "14pt"} self.fft_plot.setLabel("bottom", text="Frequency", units="Hz", **label_style) self.fft_plot.setLabel("left", text="Magnitude", units="dB", **label_style) self.fft_plot.setTitle("Received Signal - Frequency Spectrum", **title_style) layout.addWidget(self.fft_plot, 0, 2, self.num_rows, 1) - self.fft_plot.setYRange(-100, -20) - self.fft_plot.setXRange(100e3, 130e3) + self.fft_plot.setYRange(-60, 0) + self.fft_plot.setXRange(signal_freq, signal_freq+plot_freq) # Waterfall plot self.waterfall = pg.PlotWidget() @@ -378,7 +379,7 @@ class Window(QMainWindow): tr.translate(0,-sample_rate/2) tr.scale(0.35, sample_rate / (N)) self.imageitem.setTransform(tr) - zoom_freq = 20e3 + zoom_freq = 35e3 self.waterfall.setRange(yRange=(signal_freq, signal_freq + zoom_freq)) self.waterfall.setTitle("Waterfall Spectrum", **title_style) self.waterfall.setLabel("left", "Frequency", units="Hz", **label_style) @@ -391,7 +392,7 @@ class Window(QMainWindow): self.setCentralWidget(widget) def get_range_res(self): - """ Updates the slider bar label with RF bandwidth and range resolution + """ Updates the slider bar label with Chirp bandwidth and range resolution Returns: None """ @@ -408,8 +409,6 @@ class Window(QMainWindow): self.cfar_ref_label.setText("Num Ref Cells: %0.0f" % (self.cfar_ref.value())) - - def get_water_levels(self): """ Updates the waterfall intensity levels Returns: @@ -437,11 +436,11 @@ class Window(QMainWindow): my_phaser.set_beam_phase_diff(np.degrees(phase_delta)) def set_range_res(self): - """ Sets the RF bandwidth + """ Sets the Chirp bandwidth Returns: None """ - global dist, slope + global dist, slope, signal_freq, plot_freq bw = self.bw_slider.value() * 1e6 slope = bw / ramp_time_s dist = (freq - signal_freq) * c / (4 * slope) diff --git a/CW_RADAR_Waterfall.py b/CW_RADAR_Waterfall.py index c235075..2342638 100644 --- a/CW_RADAR_Waterfall.py +++ b/CW_RADAR_Waterfall.py @@ -34,7 +34,7 @@ # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. '''CW Radar Demo with Phaser (CN0566) - Jon Kraft, Nov 19 2023''' + Jon Kraft, Jan 19 2024''' # Imports import adi @@ -76,7 +76,7 @@ except: my_phaser.gpios.gpio_vctrl_2 = 1 # 1=Send LO to transmit circuitry (0=disable Tx path, and send LO to LO_OUT) sample_rate = 0.6e6 -center_freq = 2.1e9 +center_freq = 2.2e9 signal_freq = 100e3 num_slices = 50 fft_size = 1024 * 64 @@ -100,7 +100,7 @@ my_sdr.tx_hardwaregain_chan1 = -0 # must be between 0 and -88 # Configure the ADF4159 Rampling PLL -output_freq = 12.145e9 +output_freq = 12.2e9 my_phaser.frequency = int(output_freq / 4) # Output frequency divided by 4 my_phaser.ramp_mode = "disabled" # ramp_mode can be: "disabled", "continuous_sawtooth", "continuous_triangular", "single_sawtooth_burst", "single_ramp_burst" my_phaser.enable = 0 # 0 = PLL enable. Write this last to update all the registers @@ -132,7 +132,6 @@ class Window(QMainWindow): self.num_rows = 12 self.setWindowFlag(QtCore.Qt.WindowCloseButtonHint, False) #remove the window's close button self.UiComponents() - # showing all the widgets self.show() # method for components @@ -161,7 +160,7 @@ class Window(QMainWindow): self.low_slider = QSlider(Qt.Horizontal) self.low_slider.setMinimum(-100) self.low_slider.setMaximum(0) - self.low_slider.setValue(-40) + self.low_slider.setValue(-66) self.low_slider.setTickInterval(20) self.low_slider.setMaximumWidth(200) self.low_slider.setTickPosition(QSlider.TicksBelow) @@ -171,7 +170,7 @@ class Window(QMainWindow): self.high_slider = QSlider(Qt.Horizontal) self.high_slider.setMinimum(-100) self.high_slider.setMaximum(0) - self.high_slider.setValue(-28) + self.high_slider.setValue(-42) self.high_slider.setTickInterval(20) self.high_slider.setMaximumWidth(200) self.high_slider.setTickPosition(QSlider.TicksBelow) @@ -260,6 +259,7 @@ App = QApplication(sys.argv) # create the instance of our Window win = Window() +win.setWindowState(QtCore.Qt.WindowMaximized) index = 0 diff --git a/FMCW_RADAR_Waterfall.py b/FMCW_RADAR_Waterfall.py index ba36be6..360022c 100644 --- a/FMCW_RADAR_Waterfall.py +++ b/FMCW_RADAR_Waterfall.py @@ -34,7 +34,7 @@ # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. '''FMCW Radar Demo with Phaser (CN0566) - Jon Kraft, Nov 19 2023''' + Jon Kraft, Jan 20 2024''' # Imports import adi @@ -78,8 +78,9 @@ except: sample_rate = 0.6e6 center_freq = 2.1e9 signal_freq = 100e3 -num_slices = 400 +num_slices = 400 # this sets how much time will be displayed on the waterfall plot fft_size = 1024 * 4 +plot_freq = 100e3 # x-axis freq range to plot img_array = np.ones((num_slices, fft_size))*(-100) # Configure SDR Rx @@ -101,9 +102,8 @@ my_sdr.tx_hardwaregain_chan1 = -0 # must be between 0 and -88 # Configure the ADF4159 Rampling PLL output_freq = 12.145e9 BW = 500e6 -num_steps = 1000 -ramp_time = 1.2e3 # us -ramp_time_s = ramp_time / 1e6 +num_steps = 500 +ramp_time = 0.5e3 # us my_phaser.frequency = int(output_freq / 4) # Output frequency divided by 4 my_phaser.freq_dev_range = int( BW / 4 @@ -115,7 +115,9 @@ my_phaser.freq_dev_time = int( ramp_time ) # total time (in us) of the complete frequency ramp print("requested freq dev time = ", ramp_time) -print("actual freq dev time = ", my_phaser.freq_dev_time) +ramp_time = my_phaser.freq_dev_time +ramp_time_s = ramp_time / 1e6 +print("actual freq dev time = ", ramp_time) my_phaser.delay_word = 4095 # 12 bit delay word. 4095*PFD = 40.95 us. For sawtooth ramps, this is also the length of the Ramp_complete signal my_phaser.delay_clk = "PFD" # can be 'PFD' or 'PFD*CLK1' my_phaser.delay_start_en = 0 # delay start @@ -150,7 +152,6 @@ IF: {signal_freq}kHz # Create a sinewave waveform fs = int(my_sdr.sample_rate) -print("sample_rate:", fs) N = int(my_sdr.rx_buffer_size) fc = int(signal_freq / (fs / N)) * (fs / N) ts = 1 / float(fs) @@ -164,7 +165,7 @@ my_sdr._ctx.set_timeout(0) my_sdr.tx([iq * 0.5, iq]) # only send data to the 2nd channel (that's all we need) c = 3e8 -default_rf_bw = 500e6 +default_chirp_bw = 500e6 N_frame = fft_size freq = np.linspace(-fs / 2, fs / 2, int(N_frame)) slope = BW / ramp_time_s @@ -177,19 +178,19 @@ class Window(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Interactive FFT") - self.setGeometry(100, 100, 800, 800) # (x,y, width, height) - self.setFixedWidth(1600) + self.setGeometry(0, 0, 400, 400) # (x,y, width, height) + #self.setFixedWidth(600) + self.setWindowState(QtCore.Qt.WindowMaximized) self.num_rows = 12 self.setWindowFlag(QtCore.Qt.WindowCloseButtonHint, False) #remove the window's close button self.UiComponents() - # showing all the widgets self.show() # method for components def UiComponents(self): widget = QWidget() - global layout + global layout, signal_freq layout = QGridLayout() # Control Panel @@ -211,10 +212,10 @@ class Window(QMainWindow): layout.addWidget(self.x_axis_check, 2, 0) # Range resolution - # Changes with the RF BW slider + # Changes with the Chirp BW slider self.range_res_label = QLabel( - "BRF: %0.2f MHz - Rres: %0.2f m" - % (default_rf_bw / 1e6, c / (2 * default_rf_bw)) + "B: %0.2f MHz - Rres: %0.2f m" + % (default_chirp_bw / 1e6, c / (2 * default_chirp_bw)) ) font = self.range_res_label.font() font.setPointSize(10) @@ -224,18 +225,18 @@ class Window(QMainWindow): self.range_res_label.setMinimumWidth(100) layout.addWidget(self.range_res_label, 4, 1) - # RF bandwidth slider + # Chirp bandwidth slider self.bw_slider = QSlider(Qt.Horizontal) self.bw_slider.setMinimum(100) self.bw_slider.setMaximum(500) - self.bw_slider.setValue(int(default_rf_bw / 1e6)) + self.bw_slider.setValue(int(default_chirp_bw / 1e6)) self.bw_slider.setTickInterval(50) self.bw_slider.setMaximumWidth(200) self.bw_slider.setTickPosition(QSlider.TicksBelow) self.bw_slider.valueChanged.connect(self.get_range_res) layout.addWidget(self.bw_slider, 4, 0) - self.set_bw = QPushButton("Set RF Bandwidth") + self.set_bw = QPushButton("Set Chirp Bandwidth") self.set_bw.setMaximumWidth(200) self.set_bw.pressed.connect(self.set_range_res) layout.addWidget(self.set_bw, 5, 0, 1, 1) @@ -249,7 +250,7 @@ class Window(QMainWindow): self.low_slider = QSlider(Qt.Horizontal) self.low_slider.setMinimum(-100) self.low_slider.setMaximum(0) - self.low_slider.setValue(-43) + self.low_slider.setValue(-40) self.low_slider.setTickInterval(20) self.low_slider.setMaximumWidth(200) self.low_slider.setTickPosition(QSlider.TicksBelow) @@ -259,7 +260,7 @@ class Window(QMainWindow): self.high_slider = QSlider(Qt.Horizontal) self.high_slider.setMinimum(-100) self.high_slider.setMaximum(0) - self.high_slider.setValue(-23) + self.high_slider.setValue(-5) self.high_slider.setTickInterval(20) self.high_slider.setMaximumWidth(200) self.high_slider.setTickPosition(QSlider.TicksBelow) @@ -318,7 +319,7 @@ class Window(QMainWindow): self.fft_plot.setTitle("Received Signal - Frequency Spectrum", **title_style) layout.addWidget(self.fft_plot, 0, 2, self.num_rows, 1) self.fft_plot.setYRange(-60, 0) - self.fft_plot.setXRange(100e3, 200e3) + self.fft_plot.setXRange(signal_freq, signal_freq+plot_freq) # Waterfall plot self.waterfall = pg.PlotWidget() @@ -335,7 +336,7 @@ class Window(QMainWindow): tr.translate(0,-sample_rate/2) tr.scale(0.35, sample_rate / (N)) self.imageitem.setTransform(tr) - zoom_freq = 20e3 + zoom_freq = 35e3 self.waterfall.setRange(yRange=(signal_freq, signal_freq + zoom_freq)) self.waterfall.setTitle("Waterfall Spectrum", **title_style) self.waterfall.setLabel("left", "Frequency", units="Hz", **label_style) @@ -355,7 +356,7 @@ class Window(QMainWindow): bw = self.bw_slider.value() * 1e6 range_res = c / (2 * bw) self.range_res_label.setText( - "BRF: %0.2f MHz - Rres: %0.2f m" + "B: %0.2f MHz - Rres: %0.2f m" % (bw / 1e6, c / (2 * bw)) ) @@ -386,24 +387,21 @@ class Window(QMainWindow): my_phaser.set_beam_phase_diff(np.degrees(phase_delta)) def set_range_res(self): - """ Sets the RF bandwidth + """ Sets the Chirp bandwidth Returns: None """ - global dist, slope + global dist, slope, signal_freq, plot_freq bw = self.bw_slider.value() * 1e6 slope = bw / ramp_time_s dist = (freq - signal_freq) * c / (4 * slope) - print("New slope: %0.2fMHz/s" % (slope / 1e6)) if self.x_axis_check.isChecked() == True: - print("Range axis") plot_dist = True - range_x = (100e3) * c / (4 * slope) + range_x = (plot_freq) * c / (4 * slope) self.fft_plot.setXRange(0, range_x) else: - print("Frequency axis") plot_dist = False - self.fft_plot.setXRange(100e3, 140e3) + self.fft_plot.setXRange(signal_freq, signal_freq+plot_freq) my_phaser.freq_dev_range = int(bw / 4) # frequency deviation range in Hz my_phaser.enable = 0 @@ -422,17 +420,15 @@ class Window(QMainWindow): Returns: None """ - global plot_dist, slope + global plot_dist, slope, signal_freq, plot_freq plot_state = win.fft_plot.getViewBox().state if state == QtCore.Qt.Checked: - print("Range axis") plot_dist = True - range_x = (100e3) * c / (4 * slope) + range_x = (plot_freq) * c / (4 * slope) self.fft_plot.setXRange(0, range_x) else: - print("Frequency axis") plot_dist = False - self.fft_plot.setXRange(100e3, 200e3) + self.fft_plot.setXRange(signal_freq, signal_freq+plot_freq) # create pyqt5 app diff --git a/Range_Doppler_Plot.py b/Range_Doppler_Plot.py index 1cd7684..a4919e0 100644 --- a/Range_Doppler_Plot.py +++ b/Range_Doppler_Plot.py @@ -32,21 +32,31 @@ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -'''This script uses the new Pluto TDD engine - As of Nov 2023, this is in the "dev_phaser_merge" branch of https://github.com/analogdevicesinc/pyadi-iio - Also, make sure your Pluto firmware is updated to rev 0.38 (or later) - To view the plot properly in Spyder, select Tools->Preferences, IPython Console, and change Graphics backend from Inline to Automatic -''' +'''FMCW Range Doppler Demo with Phaser (CN0566) + Jon Kraft, Jan 20 2024''' # Imports -import adi - +import sys import matplotlib import matplotlib.pyplot as plt -from matplotlib.animation import FuncAnimation import numpy as np import time +'''This script uses the new Pluto TDD engine + As of Jan 2024, this is in the "dev_phaser_merge" branch of https://github.com/analogdevicesinc/pyadi-iio + Also, make sure your Pluto firmware is updated to rev 0.38 (or later) +''' +#sys.path.insert(0,'/home/analog/cn0566_merge/pyadi-iio/') +import adi +print(adi.__version__) + +# Parameters +sample_rate = 5e6 +center_freq = 2.1e9 +signal_freq = int(sample_rate/10) +ramp_time = 200 # us +num_chirps = 128 + # Instantiate all the Devices rpi_ip = "ip:phaser.local" # IP address of the Raspberry Pi sdr_ip = "ip:192.168.2.1" # "192.168.2.1, or pluto.local" # IP address of the Transceiver Block @@ -74,11 +84,6 @@ except: my_phaser.gpios.gpio_vctrl_1 = 1 # 1=Use onboard PLL/LO source (0=disable PLL and VCO, and set switch to use external LO input) my_phaser.gpios.gpio_vctrl_2 = 1 # 1=Send LO to transmit circuitry (0=disable Tx path, and send LO to LO_OUT) -# Parameters -sample_rate = 20e6 -center_freq = 2.1e9 -signal_freq = 0.1e6 - # Configure SDR Rx my_sdr.sample_rate = int(sample_rate) my_sdr.rx_lo = int(center_freq) # set this to output_freq - (the freq of the HB100) @@ -100,8 +105,7 @@ print("RX LO %s" % (my_sdr.rx_lo)) # Configure the ADF4159 Rampling PLL output_freq = 12.145e9 BW = 500e6 -num_steps = 200 -ramp_time = 0.2e3 # us +num_steps = ramp_time # in general it works best if there is 1 step per us my_phaser.frequency = int(output_freq / 4) # Output frequency divided by 4 my_phaser.freq_dev_range = int( BW / 4 @@ -137,7 +141,7 @@ tdd.enable = False # disable TDD to configure the registers tdd.sync_external = True tdd.startup_delay_ms = 1 tdd.frame_length_ms = ramp_time/1e3 + 0.2 # each GPIO toggle is spaced this far apart -tdd.burst_count = 128 # number of chirps in one continuous receive buffer +tdd.burst_count = num_chirps # number of chirps in one continuous receive buffer tdd.out_channel0_enable = True tdd.out_channel0_polarity = False @@ -219,7 +223,7 @@ start_offset_samples = int((start_offset_time+begin_offset_time)*fs) # %% -range_doppler_fig, ax = plt.subplots(figsize=(16, 16)) +range_doppler_fig, ax = plt.subplots(figsize=(14, 7)) extent = [-max_doppler_vel, max_doppler_vel, dist.min(), dist.max()] @@ -247,7 +251,7 @@ rx_bursts_fft = np.fft.fftshift(abs(np.fft.fft2(rx_bursts))) # %% i = 0 cmn = '' -def get_radar_data(frame): +def get_radar_data(): global range_doppler # Collect data my_phaser.gpios.gpio_burst = 0 @@ -267,35 +271,45 @@ def get_radar_data(frame): rx_bursts[burst] = sum_data[start_index:stop_index] rx_bursts_fft = np.fft.fftshift(abs(np.fft.fft2(rx_bursts))) - range_doppler.set_data(np.log10(rx_bursts_fft).T) - return [range_doppler] - - + range_doppler_data = np.log10(rx_bursts_fft).T + plot_data = range_doppler_data + #plot_data = np.clip(plot_data, 0, 6) # clip the data to control the max spectrogram scale + return plot_data # %% + +plot_data = np.log10(rx_bursts_fft).T +#plot_data = np.clip(plot_data, 0, 6) # clip the data to control the max spectrogram scale + cmaps = ['inferno', 'plasma'] cmn = cmaps[0] -plot_data = np.log10(rx_bursts_fft).T -plot_data = np.clip(plot_data, 0, 6) - -range_doppler = ax.imshow(plot_data, aspect='auto', - extent=extent, origin='lower', cmap=matplotlib.colormaps.get_cmap(cmn), - ) +try: + range_doppler = ax.imshow(plot_data, aspect='auto', + extent=extent, origin='lower', cmap=matplotlib.colormaps.get_cmap(cmn), + ) +except: + print("Using an older version of MatPlotLIB") + from matplotlib.cm import get_cmap + range_doppler = ax.imshow(plot_data, aspect='auto', vmin=0, vmax=8, + extent=extent, origin='lower', cmap=get_cmap(cmn), + ) ax.set_title('Range Doppler Spectrum', fontsize=24) ax.set_xlabel('Velocity [m/s]', fontsize=22) ax.set_ylabel('Range [m]', fontsize=22) -max_range = 40 -ax.set_xlim([-15, 15]) +max_range = 10 +ax.set_xlim([-6, 6]) ax.set_ylim([0, max_range]) -ax.set_yticks(np.arange(0, max_range, 4)) +ax.set_yticks(np.arange(2, max_range, 2)) plt.xticks(fontsize=20) plt.yticks(fontsize=20) -print("Press CTRL+C to stop the loop") +print("sample_rate = ", sample_rate/1e6, "MHz, ramp_time = ", ramp_time, "us, num_chirps = ", num_chirps) +print("CTRL + c to stop the loop") try: while True: - FuncAnimation(range_doppler_fig, get_radar_data, blit=True, frames=1, repeat=False) - plt.show() + plot_data = get_radar_data() + range_doppler.set_data(plot_data) + plt.show(block=False) plt.pause(.1) except KeyboardInterrupt: # press ctrl-c to stop the loop pass