Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
151 changes: 143 additions & 8 deletions qspectrumanalyzer/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
from qspectrumanalyzer.utils import str_to_color, human_time

from qspectrumanalyzer.settings import QSpectrumAnalyzerSettings
from qspectrumanalyzer.smoothing import QSpectrumAnalyzerSmoothing
from qspectrumanalyzer.smoothing_frequency import QSpectrumAnalyzerSmoothingFrequency
from qspectrumanalyzer.smoothing_temporal import QSpectrumAnalyzerSmoothingTemporal
from qspectrumanalyzer.persistence import QSpectrumAnalyzerPersistence
from qspectrumanalyzer.colors import QSpectrumAnalyzerColors
from qspectrumanalyzer.baseline import QSpectrumAnalyzerBaseline
Expand Down Expand Up @@ -58,6 +59,11 @@ def __init__(self, parent=None):
self.data_storage = None
self.power_thread = None
self.backend = None

self.last_freq_min = 0
self.last_freq_max = 0
self.last_bin_size = 0

self.setup_power_thread()

self.update_buttons()
Expand Down Expand Up @@ -176,7 +182,8 @@ def load_settings(self):
self.peakHoldMaxCheckBox.setChecked(settings.value("peak_hold_max", 0, int))
self.peakHoldMinCheckBox.setChecked(settings.value("peak_hold_min", 0, int))
self.averageCheckBox.setChecked(settings.value("average", 0, int))
self.smoothCheckBox.setChecked(settings.value("smooth", 0, int))
self.freqSmoothCheckBox.setChecked(settings.value("smooth", 0, int))
self.temporalSmoothCheckBox.setChecked(settings.value("temporal_smooth", 0, int))
self.persistenceCheckBox.setChecked(settings.value("persistence", 0, int))
self.baselineCheckBox.setChecked(settings.value("baseline", 0, int))
self.subtractBaselineCheckBox.setChecked(settings.value("subtract_baseline", 0, int))
Expand Down Expand Up @@ -217,7 +224,8 @@ def save_settings(self):
settings.setValue("peak_hold_max", int(self.peakHoldMaxCheckBox.isChecked()))
settings.setValue("peak_hold_min", int(self.peakHoldMinCheckBox.isChecked()))
settings.setValue("average", int(self.averageCheckBox.isChecked()))
settings.setValue("smooth", int(self.smoothCheckBox.isChecked()))
settings.setValue("smooth", int(self.freqSmoothCheckBox.isChecked()))
settings.setValue("temporal", int(self.temporalSmoothCheckBox.isChecked()))
settings.setValue("persistence", int(self.persistenceCheckBox.isChecked()))
settings.setValue("baseline", int(self.baselineCheckBox.isChecked()))
settings.setValue("subtract_baseline", int(self.subtractBaselineCheckBox.isChecked()))
Expand Down Expand Up @@ -309,6 +317,24 @@ def start(self, single_shot=False):
self.waterfallPlotWidget.history_size = settings.value("waterfall_history_size", 100, int)
self.waterfallPlotWidget.clear_plot()

freq_mhz_min = self.startFreqSpinBox.value()
freq_mhz_max = self.stopFreqSpinBox.value()
span_mhz = freq_mhz_max - freq_mhz_min
bin_size_kHz = self.binSizeSpinBox.value()
bin_num = span_mhz * 1000 / bin_size_kHz if bin_size_kHz > 0 else -1
self.labelBins.setText(str(freq_mhz_min) + " to " + str(freq_mhz_max) + " MHz" + "\nSpan: " + str(span_mhz) + " MHz - " + str(round(bin_num)) +" Bins" )

freq_changed = self.last_freq_min != freq_mhz_min or self.last_freq_max != freq_mhz_max
if freq_changed:
# Set the plotter to defined x range (override any zooming)
diff_hz = span_mhz * 1000 * 1000
add_hz = diff_hz * 0.01
self.spectrumPlotWidget.setXRange(freq_mhz_min * 1000 * 1000 - add_hz, freq_mhz_max * 1000 * 1000 + add_hz)

self.last_freq_min = freq_mhz_min
self.last_freq_max = freq_mhz_max
self.last_bin_size = bin_size_kHz

self.spectrumPlotWidget.main_curve = bool(self.mainCurveCheckBox.isChecked())
self.spectrumPlotWidget.main_color = str_to_color(settings.value("main_color", "255, 255, 0, 255"))
self.spectrumPlotWidget.peak_hold_max = bool(self.peakHoldMaxCheckBox.isChecked())
Expand All @@ -323,6 +349,7 @@ def start(self, single_shot=False):
self.spectrumPlotWidget.persistence_length = settings.value("persistence_length", 5, int)
self.spectrumPlotWidget.persistence_decay = settings.value("persistence_decay", "exponential")
self.spectrumPlotWidget.persistence_color = str_to_color(settings.value("persistence_color", "0, 255, 0, 255"))

self.spectrumPlotWidget.clear_plot()
self.spectrumPlotWidget.clear_peak_hold_max()
self.spectrumPlotWidget.clear_peak_hold_min()
Expand All @@ -332,10 +359,15 @@ def start(self, single_shot=False):

self.data_storage.reset()
self.data_storage.set_smooth(
bool(self.smoothCheckBox.isChecked()),
bool(self.freqSmoothCheckBox.isChecked()),
settings.value("smooth_length", 11, int),
settings.value("smooth_window", "hanning")
)
self.data_storage.set_temporal_smooth(
bool(self.temporalSmoothCheckBox.isChecked()),
settings.value("temporal_smooth_length", 11, int),
settings.value("temporal_smooth_window", "hanning")
)
self.data_storage.set_subtract_baseline(
bool(self.subtractBaselineCheckBox.isChecked()),
settings.value("baseline_file", None)
Expand Down Expand Up @@ -363,6 +395,89 @@ def stop(self):
if self.power_thread.alive:
self.power_thread.stop()

def computeFreq(self, zoom, right):
freq_mhz_min = self.startFreqSpinBox.value()
freq_mhz_max = self.stopFreqSpinBox.value()
freq_mhz_mid = (freq_mhz_max + freq_mhz_min) / 2.0
freq_mhz_diff = abs(freq_mhz_max - freq_mhz_min)
bin_size_kHz = float(self.binSizeSpinBox.value())
print("computeFreq: freq_mhz old:", freq_mhz_min, freq_mhz_max, freq_mhz_diff, bin_size_kHz)
zoom_steps = [ 20, 50, 100, 200, 500, 1000 ]
mod_steps = [ 10, 25, 50, 100, 250, 500 ]
a_pos = [ 0, 1, 2, 3, 4, 5 ]
bin_sizes = [ 2, 10, 20, 50, 100, 1000 ]
mod = 10
bin_size = bin_size_kHz
diff = freq_mhz_diff
if zoom > 0:
print("computeFreq: zoom in")
# freq_mhz_diff = freq_mhz_diff / 2
diff = freq_mhz_diff
for a in reversed(a_pos):
f = zoom_steps[a]
if f < freq_mhz_diff:
diff = f
mod = mod_steps[a]
bin_size = bin_sizes[a]
break
freq_mhz_diff = diff
print("computeFreq: zoom in, diff: ", diff)
if zoom < 0:
print("computeFreq: zoom out")
diff = freq_mhz_diff
for a in a_pos:
f = zoom_steps[a]
if f > freq_mhz_diff:
diff = f
mod = mod_steps[a]
bin_size = bin_sizes[a]
break
freq_mhz_diff = diff
# freq_mhz_diff = freq_mhz_diff * 2

freq_mhz_diff = round(freq_mhz_diff)
if freq_mhz_diff < 20:
freq_mhz_diff = 20

if right != 0:
fact = (right / 100)
print("computeFreq: shift by ", freq_mhz_mid, right, fact, freq_mhz_diff)
freq_mhz_mid = freq_mhz_mid + round(freq_mhz_diff * fact)
for a in a_pos:
if zoom_steps[a] == diff:
mod = mod_steps[a]
bin_size = bin_sizes[a]
break

freq_mhz_min = freq_mhz_mid - round(freq_mhz_diff / 2)
freq_mhz_max = freq_mhz_mid + round(freq_mhz_diff / 2)
m_10 = freq_mhz_min % mod
print("computeFreq: freq_mhz ...:",freq_mhz_min, mod, diff)
if m_10 > 0:
freq_mhz_min -= m_10
freq_mhz_max -= m_10
print("computeFreq: freq_mhz new:", freq_mhz_min, freq_mhz_max, freq_mhz_diff)
self.startFreqSpinBox.setValue(freq_mhz_min)
self.stopFreqSpinBox.setValue(freq_mhz_max)
self.binSizeSpinBox.setValue(bin_size)

@QtCore.Slot()
def on_buttonZoomOut_clicked(self):
self.computeFreq(-1, 0)

@QtCore.Slot()
def on_buttonZoomIn_clicked(self):
self.computeFreq(1, 0)

@QtCore.Slot()
def on_buttonFreqLeft_clicked(self):
self.computeFreq(0, -50)

@QtCore.Slot()
def on_buttonFreqRight_clicked(self):
self.computeFreq(0, 50)


@QtCore.Slot()
def on_startButton_clicked(self):
self.start()
Expand Down Expand Up @@ -412,14 +527,23 @@ def on_persistenceCheckBox_toggled(self, checked):
curve.setVisible(checked)

@QtCore.Slot(bool)
def on_smoothCheckBox_toggled(self, checked):
def on_freqSmoothCheckBox_toggled(self, checked):
settings = QtCore.QSettings()
self.data_storage.set_smooth(
checked,
settings.value("smooth_length", 11, int),
settings.value("smooth_window", "hanning")
)

@QtCore.Slot(bool)
def on_temporalSmoothCheckBox_toggled(self, checked):
settings = QtCore.QSettings()
self.data_storage.set_temporal_smooth(
checked,
settings.value("temporal_smooth_length", 11, int),
settings.value("temporal_smooth_window", "hanning")
)

@QtCore.Slot(bool)
def on_baselineCheckBox_toggled(self, checked):
self.spectrumPlotWidget.baseline = checked
Expand All @@ -446,16 +570,27 @@ def on_baselineButton_clicked(self):
)

@QtCore.Slot()
def on_smoothButton_clicked(self):
dialog = QSpectrumAnalyzerSmoothing(self)
def on_freqSmoothButton_clicked(self):
dialog = QSpectrumAnalyzerSmoothingFrequency(self)
if dialog.exec_():
settings = QtCore.QSettings()
self.data_storage.set_smooth(
bool(self.smoothCheckBox.isChecked()),
bool(self.freqSmoothCheckBox.isChecked()),
settings.value("smooth_length", 11, int),
settings.value("smooth_window", "hanning")
)

@QtCore.Slot()
def on_temporalSmoothButton_clicked(self):
dialog = QSpectrumAnalyzerSmoothingTemporal(self)
if dialog.exec_():
settings = QtCore.QSettings()
self.data_storage.set_temporal_smooth(
bool(self.temporalSmoothCheckBox.isChecked()),
settings.value("temporal_smooth_length", 11, int),
settings.value("temporal_smooth_window", "hanning")
)

@QtCore.Slot()
def on_persistenceButton_clicked(self):
prev_persistence_length = self.spectrumPlotWidget.persistence_length
Expand Down
Loading