Skip to content
Snippets Groups Projects
Commit cab4098a authored by Merlo, Jason's avatar Merlo, Jason
Browse files

Updates from testing 6/19, added proper range scaling for range-doppler plots,...

Updates from testing 6/19, added proper range scaling for range-doppler plots, started implementing cable length corrections
parent d586e45c
No related branches found
No related tags found
No related merge requests found
......@@ -100,7 +100,7 @@ class VirtualDAQ(daq.DAQ):
raise Exception('No dataset loaded.')
def get_samples(self, stride=1, loop=-1, playback_speed=30):
def get_samples(self, stride=1, loop=-1, playback_speed=0.25):
"""Read sample from dataset at sampled speed, or one-by-one."""
if self.ds:
# Read in samples from dataset
......@@ -114,7 +114,7 @@ class VirtualDAQ(daq.DAQ):
# Delay by sample period
if loop == -1 or loop == 1:
time.sleep(self.sample_period * playback_speed)
time.sleep(self.sample_period / playback_speed)
elif loop == 0:
print('Stepped:', stride)
else:
......
......@@ -73,6 +73,8 @@ class Receiver(object):
self.slow_fft_window_type = slow_fft_window_type
self.slow_fft_len = slow_fft_len
self.pulse = self.transmitter.pulses[0]
self.datacube = DataCube(self)
self.init_data()
......@@ -88,6 +90,10 @@ class Receiver(object):
self.fast_fft_data = np.ones(self.fast_fft_size)
self.fft_mat = np.ones((self.fast_fft_size, self.slow_fft_size))
self.freq_to_range = -(self.pulse.delay / self.pulse.bw) * 3e8
self.freq_correction = 5.5 / self.freq_to_range
self.fast_fmax = 0
self.slow_fmax = 0
......
......@@ -29,6 +29,8 @@ class ApsTracker(object):
self.pulse = self.receiver_array[0].transmitter.pulses[0]
self.chirp_rate = self.pulse.bw / self.pulse.delay
self.baseline=1.18 # m
# Configure control signals
self.connect_control_signals()
......@@ -58,7 +60,7 @@ class ApsTracker(object):
f=np.linspace(-50000,50000,num=var0.size-1)
r_d0=np.abs(f[np.argmax(var0)]*3e8/self.chirp_rate/2)
r_d1=np.abs(f[np.argmax(var1)]*3e8/self.chirp_rate/2)
theta=np.arcsin((r_d0-r_d1)/0.3864)+0.5*np.pi
theta=np.arcsin((r_d0-r_d1)/self.baseline)+0.5*np.pi
R=0.5*(r_d0+r_d1)
# loc is cylindrical (R, theta, Z), but Z is ignored by plot
......
......@@ -15,7 +15,7 @@ from matplotlib import cm # Used for colormaps
class RangeDopplerWidget(pg.PlotWidget):
def __init__(self, receiver, xrange=[-50,50], yrange=[-15e3,0], showMeters=False):
def __init__(self, receiver, xrange=[-50,50], yrange=[-10e3,0], showMeters=True):
super().__init__()
# Copy arguments to member variables
......@@ -28,7 +28,9 @@ class RangeDopplerWidget(pg.PlotWidget):
self.source.sample_chunk_size / self.source.sample_rate
self.freq_to_vel = (3e8 / self.pulse.fc) / 2
self.freq_to_range = (self.pulse.delay / self.pulse.bw) * 3e8
self.freq_to_range = -(self.pulse.delay / self.pulse.bw) * 3e8 / 2
self.offset_freq = 5.5 / self.freq_to_range * 2
self.xrange = xrange
self.yrange = yrange
......@@ -55,7 +57,7 @@ class RangeDopplerWidget(pg.PlotWidget):
# set colormap
self.img.setLookupTable(lut)
self.img.setLevels([-80, 10]) # Good for drone
self.img.setLevels([-90, -10]) # Good for drone
#self.img.setLevels([-10, 20]) # Good for drone
self.rescale()
......@@ -66,14 +68,13 @@ class RangeDopplerWidget(pg.PlotWidget):
else:
self.setLabel('left', 'Frequency', units='Hz')
self.setLabel('bottom', 'Frequency', units='Hz')
# Invert y-axis so negative is "up" (corresponds with range)
self.getViewBox().invertY(True)
self.showGrid(x=True, y=True)
left_axis=self.getAxis('left')
left_axis.setGrid(255)
# Invert y-axis so negative is "up" (corresponds with range)
self.getViewBox().invertY(True)
self.img.setCompositionMode(pg.QtGui.QPainter.CompositionMode_Plus)
# self.setLabel('right', 'Range', 'm')
......@@ -126,20 +127,25 @@ class RangeDopplerWidget(pg.PlotWidget):
self.source.sample_chunk_size / self.source.sample_rate
if self.showMeters:
self.img.scale(self.receiver.slow_bin_size * self.freq_to_vel,
self.receiver.fast_bin_size * self.freq_to_range)
slow_scale = self.receiver.slow_bin_size * self.freq_to_vel
fast_scale = self.receiver.fast_bin_size * self.freq_to_range
yrange = np.array(self.yrange) * self.freq_to_range
slow_limit = self.receiver.slow_bin_size * self.receiver.slow_fft_size / 4 * self.freq_to_vel
else:
self.img.scale(self.receiver.slow_bin_size,
self.receiver.fast_bin_size)
slow_scale = self.receiver.slow_bin_size
fast_scale = self.receiver.fast_bin_size
yrange = self.yrange
slow_limit = self.receiver.slow_bin_size * self.receiver.slow_fft_size / 4
self.setRange(disableAutoRange=True, yRange=np.array(self.yrange))
self.img.translate(-np.array(self.receiver.fft_mat.shape[1]) / (2 * self.downsample),
-np.array(self.receiver.fft_mat.shape[0]) / (2 * self.downsample))
self.img.scale(slow_scale, fast_scale)
self.setRange(disableAutoRange=True, yRange=np.array(yrange))
# TODO: why is the /4 instead of /2??
slow_limit = self.receiver.slow_bin_size * self.receiver.slow_fft_size / 4
offset_bins = self.offset_freq / self.receiver.fast_fft_size
self.img.translate(-np.array(self.receiver.fft_mat.shape[1]) / (2 * self.downsample),
-np.array(self.receiver.fft_mat.shape[0]) / (2 * self.downsample))
self.setLimits(
xMin=-slow_limit, xMax=slow_limit)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment