diff --git a/qspectrumanalyzer/__main__.py b/qspectrumanalyzer/__main__.py index 2a87922..50e1332 100644 --- a/qspectrumanalyzer/__main__.py +++ b/qspectrumanalyzer/__main__.py @@ -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 @@ -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() @@ -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)) @@ -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())) @@ -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()) @@ -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() @@ -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) @@ -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() @@ -412,7 +527,7 @@ 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, @@ -420,6 +535,15 @@ def on_smoothCheckBox_toggled(self, checked): 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 @@ -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 diff --git a/qspectrumanalyzer/data.py b/qspectrumanalyzer/data.py index 283237a..1a93dfc 100644 --- a/qspectrumanalyzer/data.py +++ b/qspectrumanalyzer/data.py @@ -2,6 +2,7 @@ from Qt import QtCore import numpy as np +from pprint import pprint from qspectrumanalyzer.utils import smooth from qspectrumanalyzer.backends import soapy_power @@ -70,9 +71,15 @@ class DataStorage(QtCore.QObject): def __init__(self, max_history_size=100, parent=None): super().__init__(parent) self.max_history_size = max_history_size + self.smooth = False self.smooth_length = 11 self.smooth_window = "hanning" + + self.temp_smooth = False + self.temp_smooth_length = 10 + self.temp_smooth_window = "hanning" + self.subtract_baseline = False self.prev_baseline = None self.baseline = None @@ -90,6 +97,7 @@ def reset(self): self.wait() self.x = None self.history = None + self.history_raw = None self.reset_data() def reset_data(self): @@ -131,8 +139,12 @@ def update(self, data): def update_data(self, data): """Update main spectrum data (and possibly apply smoothing)""" + + if self.temp_smooth: + history_raw = self.history_raw.get_buffer() + data["y"] = self.smooth_data_temporal(history_raw, -1) if self.smooth: - data["y"] = self.smooth_data(data["y"]) + data["y"] = self.smooth_data_freq(data["y"]) self.y = data["y"] self.data_updated.emit(self) @@ -145,8 +157,10 @@ def update_history(self, data): """Update spectrum measurements history""" if self.history is None: self.history = HistoryBuffer(len(data["y"]), self.max_history_size) + self.history_raw = HistoryBuffer(len(data["y"]), self.max_history_size) self.history.append(data["y"]) + self.history_raw.append(data["y"]) self.history_updated.emit(self) def update_average(self, data): @@ -173,10 +187,27 @@ def update_peak_hold_min(self, data): self.peak_hold_min = np.minimum(self.peak_hold_min, data["y"]) self.peak_hold_min_updated.emit(self) - def smooth_data(self, y): - """Apply smoothing function to data""" + def smooth_data_freq(self, y): + """Apply frequency smoothing function to data""" return smooth(y, window_len=self.smooth_length, window=self.smooth_window) + def smooth_data_temporal(self, buf_raw, t_pos): + """Apply temporal smoothing function to data""" + n_len = self.temp_smooth_length + n_back = len(buf_raw) + if n_back < n_len: + n_len = n_back + freq_num = len(buf_raw[t_pos]) + arr = np.empty(freq_num) + for x in range(freq_num): + val_sum = 0 + for y in range(t_pos, t_pos * n_len -1, -1): + v = buf_raw[y][x] + # print("X/Y:", x, y, v) + val_sum += v + arr[x] = val_sum / n_len + return arr + def set_smooth(self, toggle, length=11, window="hanning"): """Toggle smoothing and set smoothing params""" if toggle != self.smooth or length != self.smooth_length or window != self.smooth_window: @@ -185,6 +216,14 @@ def set_smooth(self, toggle, length=11, window="hanning"): self.smooth_window = window self.start_task(self.recalculate_data) + def set_temporal_smooth(self, toggle, length=11, window="hanning"): + """Toggle smoothing and set smoothing params""" + if toggle != self.temp_smooth or length != self.temp_smooth_length or window != self.temp_smooth_window: + self.temp_smooth = toggle + self.temp_smooth_length = length + self.temp_smooth_window = window + self.start_task(self.recalculate_data) + def set_subtract_baseline(self, toggle, baseline_file=None): """Toggle baseline subtraction and set baseline""" baseline = None @@ -225,6 +264,8 @@ def recalculate_history(self): """Recalculate spectrum measurements history""" if self.history is None: return + if self.history_raw is None: + return history = self.history.get_buffer() if self.prev_baseline is not None and len(history[-1]) == len(self.prev_baseline): @@ -233,26 +274,49 @@ def recalculate_history(self): if self.subtract_baseline and self.baseline is not None and len(history[-1]) == len(self.baseline): history -= self.baseline - self.history_recalculated.emit(self) + self.history_recalculated.emit(self) def recalculate_data(self): """Recalculate current data from history""" if self.history is None: return + if self.history_raw is None: + return history = self.history.get_buffer() - if self.smooth: - self.y = self.smooth_data(history[-1]) + history_raw = self.history_raw.get_buffer() + # pprint(vars(history)) + print("HistLan:", len(history)) + + bin_num_freq = 0 + if len(history) > 0: + arr_0 = history[-1] + bin_num_freq = len(arr_0) + print("FreqLen:", len(arr_0)) + + if self.temp_smooth: + n_back = len(history_raw) + print("n_back:", n_back, bin_num_freq) + if n_back > 0: + self.y = self.smooth_data_temporal(history_raw, -1) + else: + self.y = history[-1] + print("n_back:", n_back, bin_num_freq) + + elif self.smooth: + self.y = self.smooth_data_freq(history[-1]) self.average_counter = 0 self.average = self.y.copy() self.peak_hold_max = self.y.copy() self.peak_hold_min = self.y.copy() for y in history[:-1]: + print(" - SmoothHist:", y) self.average_counter += 1 - y = self.smooth_data(y) + y = self.smooth_data_freq(y) self.average = np.average((self.average, y), axis=0, weights=(self.average_counter - 1, 1)) self.peak_hold_max = np.maximum(self.peak_hold_max, y) self.peak_hold_min = np.minimum(self.peak_hold_min, y) + else: self.y = history[-1] self.average_counter = self.history.history_size diff --git a/qspectrumanalyzer/languages/qspectrumanalyzer_cs.ts b/qspectrumanalyzer/languages/qspectrumanalyzer_cs.ts index d938478..22b2a8f 100644 --- a/qspectrumanalyzer/languages/qspectrumanalyzer_cs.ts +++ b/qspectrumanalyzer/languages/qspectrumanalyzer_cs.ts @@ -394,44 +394,87 @@ - QSpectrumAnalyzerSmoothing + QSpectrumAnalyzerSmoothingTemporal - - Smoothing - QSpectrumAnalyzer + + Smoothing Temporal - QSpectrumAnalyzer - + &Window function: - + rectangular - + hanning - + hamming - + bartlett - + blackman - + + Window len&gth: + + + + + QSpectrumAnalyzerSmoothingFrequency + + + Smoothing Frequency - QSpectrumAnalyzer + + + + + &Window function: + + + + + rectangular + + + + + hanning + + + + + hamming + + + + + bartlett + + + + + blackman + + + + Window len&gth: diff --git a/qspectrumanalyzer/plot.py b/qspectrumanalyzer/plot.py index 3473bb3..8f23ea0 100644 --- a/qspectrumanalyzer/plot.py +++ b/qspectrumanalyzer/plot.py @@ -34,6 +34,9 @@ def __init__(self, layout): self.create_plot() + def setXRange(self, start, end): + self.plot.setXRange(start, end, padding=0) + def create_plot(self): """Create main spectrum plot""" self.posLabel = self.layout.addLabel(row=0, col=0, justify="right") @@ -218,7 +221,7 @@ def recalculate_persistence(self, data_storage): for i in range(min(self.persistence_length, data_storage.history.history_size - 1)): data = data_storage.history[-i - 2] if data_storage.smooth: - data = data_storage.smooth_data(data) + data = data_storage.smooth_data_freq(data) self.persistence_data.append(data) QtCore.QTimer.singleShot(0, lambda: self.update_persistence(data_storage, force=True)) diff --git a/qspectrumanalyzer/qspectrumanalyzer.ui b/qspectrumanalyzer/qspectrumanalyzer.ui index b65c947..8d210e2 100644 --- a/qspectrumanalyzer/qspectrumanalyzer.ui +++ b/qspectrumanalyzer/qspectrumanalyzer.ui @@ -7,11 +7,11 @@ 0 0 1200 - 892 + 907 - QSpectrumAnalyzer + QSpectrumAnalyzer Enhanced @@ -52,7 +52,7 @@ 0 0 1200 - 32 + 33 @@ -82,7 +82,7 @@ - 190 + 156 130 @@ -143,8 +143,8 @@ - 208 - 166 + 222 + 199 @@ -285,17 +285,83 @@ - - - Qt::Vertical - - - - 20 - 0 - - - + + + + + + 0 + 0 + + + + + 40 + 16777215 + + + + < + + + + + + + true + + + + 40 + 16777215 + + + + > + + + false + + + + + + + + 40 + 16777215 + + + + - + + + + + + + + 40 + 16777215 + + + + + + + + + + + + + + + + + + + + @@ -343,9 +409,15 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + 3 + 999.000000000000000 + + 0.010000000000000 + 1.000000000000000 @@ -422,15 +494,32 @@ - - + + - Smoothing + Freq. Smoothing - + + + ... + + + false + + + + + + + Temporal Smoothing + + + + + ... @@ -439,14 +528,14 @@ - + Persistence - + ... @@ -456,7 +545,7 @@ - + Qt::Vertical @@ -501,14 +590,14 @@ - + Baseline - + ... @@ -518,7 +607,7 @@ - + Subtract baseline @@ -601,8 +690,10 @@ peakHoldMaxCheckBox peakHoldMinCheckBox averageCheckBox - smoothCheckBox - smoothButton + freqSmoothCheckBox + freqSmoothButton + temporalSmoothCheckBox + temporalSmoothButton persistenceCheckBox persistenceButton baselineCheckBox diff --git a/qspectrumanalyzer/qspectrumanalyzer_smoothing_frequency.ui b/qspectrumanalyzer/qspectrumanalyzer_smoothing_frequency.ui new file mode 100644 index 0000000..71f3432 --- /dev/null +++ b/qspectrumanalyzer/qspectrumanalyzer_smoothing_frequency.ui @@ -0,0 +1,151 @@ + + + QSpectrumAnalyzerSmoothingFrequency + + + + 0 + 0 + 250 + 130 + + + + Frequency Smoothing - QSpectrumAnalyzer + + + + + + + + &Window function: + + + windowFunctionComboBox + + + + + + + 1 + + + + rectangular + + + + + hanning + + + + + hamming + + + + + bartlett + + + + + blackman + + + + + + + + Window len&gth: + + + windowLengthSpinBox + + + + + + + 3 + + + 1001 + + + 11 + + + + + + + + + Qt::Vertical + + + + 20 + 1 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + windowFunctionComboBox + windowLengthSpinBox + buttonBox + + + + + buttonBox + accepted() + QSpectrumAnalyzerSmoothingFrequency + accept() + + + 218 + 104 + + + 157 + 129 + + + + + buttonBox + rejected() + QSpectrumAnalyzerSmoothingFrequency + reject() + + + 218 + 110 + + + 224 + 129 + + + + + diff --git a/qspectrumanalyzer/qspectrumanalyzer_smoothing.ui b/qspectrumanalyzer/qspectrumanalyzer_smoothing_temporal.ui similarity index 92% rename from qspectrumanalyzer/qspectrumanalyzer_smoothing.ui rename to qspectrumanalyzer/qspectrumanalyzer_smoothing_temporal.ui index 54f7b1d..0311c83 100644 --- a/qspectrumanalyzer/qspectrumanalyzer_smoothing.ui +++ b/qspectrumanalyzer/qspectrumanalyzer_smoothing_temporal.ui @@ -1,7 +1,7 @@ - QSpectrumAnalyzerSmoothing - + QSpectrumAnalyzerSmoothingTemporal + 0 @@ -11,7 +11,7 @@ - Smoothing - QSpectrumAnalyzer + Temporal Smoothing - QSpectrumAnalyzer @@ -118,7 +118,7 @@ buttonBox accepted() - QSpectrumAnalyzerSmoothing + QSpectrumAnalyzerSmoothingTemporal accept() @@ -134,7 +134,7 @@ buttonBox rejected() - QSpectrumAnalyzerSmoothing + QSpectrumAnalyzerSmoothingTemporal reject() diff --git a/qspectrumanalyzer/scripts/build_ui_code.sh b/qspectrumanalyzer/scripts/build_ui_code.sh new file mode 100755 index 0000000..c135e7e --- /dev/null +++ b/qspectrumanalyzer/scripts/build_ui_code.sh @@ -0,0 +1,9 @@ +outfolder="./" + +FILES=$(ls qspectrumanalyzer*.ui) +for i in $FILES ; do + outfile=$outfolder"ui_"`basename $i .ui`.py + echo $i + echo $outfile + pyuic5 -o $outfile $i +done \ No newline at end of file diff --git a/qspectrumanalyzer/scripts/start.sh b/qspectrumanalyzer/scripts/start.sh new file mode 100755 index 0000000..0645c4f --- /dev/null +++ b/qspectrumanalyzer/scripts/start.sh @@ -0,0 +1 @@ +python3 -m qspectrumanalyzer \ No newline at end of file diff --git a/qspectrumanalyzer/smoothing.py b/qspectrumanalyzer/smoothing_frequency.py similarity index 81% rename from qspectrumanalyzer/smoothing.py rename to qspectrumanalyzer/smoothing_frequency.py index 900b34e..1b3cfd6 100644 --- a/qspectrumanalyzer/smoothing.py +++ b/qspectrumanalyzer/smoothing_frequency.py @@ -1,9 +1,9 @@ from Qt import QtCore, QtWidgets -from qspectrumanalyzer.ui_qspectrumanalyzer_smoothing import Ui_QSpectrumAnalyzerSmoothing +from qspectrumanalyzer.ui_qspectrumanalyzer_smoothing_frequency import Ui_QSpectrumAnalyzerSmoothingFrequency -class QSpectrumAnalyzerSmoothing(QtWidgets.QDialog, Ui_QSpectrumAnalyzerSmoothing): +class QSpectrumAnalyzerSmoothingFrequency(QtWidgets.QDialog, Ui_QSpectrumAnalyzerSmoothingFrequency): """QSpectrumAnalyzer spectrum smoothing dialog""" def __init__(self, parent=None): # Initialize UI diff --git a/qspectrumanalyzer/smoothing_temporal.py b/qspectrumanalyzer/smoothing_temporal.py new file mode 100644 index 0000000..381e5a9 --- /dev/null +++ b/qspectrumanalyzer/smoothing_temporal.py @@ -0,0 +1,29 @@ +from Qt import QtCore, QtWidgets + +from qspectrumanalyzer.ui_qspectrumanalyzer_smoothing_temporal import Ui_QSpectrumAnalyzerSmoothingTemporal + + +class QSpectrumAnalyzerSmoothingTemporal(QtWidgets.QDialog, Ui_QSpectrumAnalyzerSmoothingTemporal): + """QSpectrumAnalyzer temporal smoothing dialog""" + def __init__(self, parent=None): + # Initialize UI + super().__init__(parent) + self.setupUi(self) + + # Load settings + settings = QtCore.QSettings() + self.windowLengthSpinBox.setValue(settings.value("temporal_smooth_length", 11, int)) + + window_function = settings.value("temporal_smooth_window", "hanning") + i = self.windowFunctionComboBox.findText(window_function) + if i == -1: + self.windowFunctionComboBox.setCurrentIndex(0) + else: + self.windowFunctionComboBox.setCurrentIndex(i) + + def accept(self): + """Save settings when dialog is accepted""" + settings = QtCore.QSettings() + settings.setValue("temporal_smooth_length", self.windowLengthSpinBox.value()) + settings.setValue("temporal_smooth_window", self.windowFunctionComboBox.currentText()) + QtWidgets.QDialog.accept(self) diff --git a/qspectrumanalyzer/ui_qspectrumanalyzer.py b/qspectrumanalyzer/ui_qspectrumanalyzer.py index 39b3609..8272c4c 100644 --- a/qspectrumanalyzer/ui_qspectrumanalyzer.py +++ b/qspectrumanalyzer/ui_qspectrumanalyzer.py @@ -1,17 +1,20 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'qspectrumanalyzer/qspectrumanalyzer.ui' +# Form implementation generated from reading ui file 'qspectrumanalyzer.ui' # -# Created by: PyQt5 UI code generator 5.8 +# Created by: PyQt5 UI code generator 5.15.6 # -# WARNING! All changes made in this file will be lost! +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets -from Qt import QtCore, QtGui, QtWidgets class Ui_QSpectrumAnalyzerMainWindow(object): def setupUi(self, QSpectrumAnalyzerMainWindow): QSpectrumAnalyzerMainWindow.setObjectName("QSpectrumAnalyzerMainWindow") - QSpectrumAnalyzerMainWindow.resize(1200, 892) + QSpectrumAnalyzerMainWindow.resize(1200, 907) self.centralwidget = QtWidgets.QWidget(QSpectrumAnalyzerMainWindow) self.centralwidget.setObjectName("centralwidget") self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget) @@ -41,7 +44,7 @@ def setupUi(self, QSpectrumAnalyzerMainWindow): self.horizontalLayout.addWidget(self.plotSplitter) QSpectrumAnalyzerMainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(QSpectrumAnalyzerMainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 1200, 32)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1200, 33)) self.menubar.setObjectName("menubar") self.menu_File = QtWidgets.QMenu(self.menubar) self.menu_File.setObjectName("menu_File") @@ -57,13 +60,12 @@ def setupUi(self, QSpectrumAnalyzerMainWindow): sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.controlsDockWidget.sizePolicy().hasHeightForWidth()) self.controlsDockWidget.setSizePolicy(sizePolicy) - self.controlsDockWidget.setMinimumSize(QtCore.QSize(190, 130)) + self.controlsDockWidget.setMinimumSize(QtCore.QSize(156, 130)) self.controlsDockWidget.setFeatures(QtWidgets.QDockWidget.DockWidgetFloatable|QtWidgets.QDockWidget.DockWidgetMovable) self.controlsDockWidget.setObjectName("controlsDockWidget") self.controlsDockWidgetContents = QtWidgets.QWidget() self.controlsDockWidgetContents.setObjectName("controlsDockWidgetContents") self.gridLayout_2 = QtWidgets.QGridLayout(self.controlsDockWidgetContents) - self.gridLayout_2.setContentsMargins(0, 0, 0, 0) self.gridLayout_2.setObjectName("gridLayout_2") self.startButton = QtWidgets.QPushButton(self.controlsDockWidgetContents) self.startButton.setObjectName("startButton") @@ -84,14 +86,13 @@ def setupUi(self, QSpectrumAnalyzerMainWindow): sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.frequencyDockWidget.sizePolicy().hasHeightForWidth()) self.frequencyDockWidget.setSizePolicy(sizePolicy) - self.frequencyDockWidget.setMinimumSize(QtCore.QSize(208, 166)) + self.frequencyDockWidget.setMinimumSize(QtCore.QSize(222, 199)) self.frequencyDockWidget.setFeatures(QtWidgets.QDockWidget.DockWidgetFloatable|QtWidgets.QDockWidget.DockWidgetMovable) self.frequencyDockWidget.setObjectName("frequencyDockWidget") self.frequencyDockWidgetContents = QtWidgets.QWidget() self.frequencyDockWidgetContents.setObjectName("frequencyDockWidgetContents") self.formLayout = QtWidgets.QFormLayout(self.frequencyDockWidgetContents) self.formLayout.setFieldGrowthPolicy(QtWidgets.QFormLayout.ExpandingFieldsGrow) - self.formLayout.setContentsMargins(0, 0, 0, 0) self.formLayout.setObjectName("formLayout") self.label_2 = QtWidgets.QLabel(self.frequencyDockWidgetContents) self.label_2.setObjectName("label_2") @@ -144,8 +145,35 @@ def setupUi(self, QSpectrumAnalyzerMainWindow): self.binSizeSpinBox.setProperty("value", 10.0) self.binSizeSpinBox.setObjectName("binSizeSpinBox") self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.binSizeSpinBox) - spacerItem1 = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.formLayout.setItem(3, QtWidgets.QFormLayout.SpanningRole, spacerItem1) + self.buttonsLayout = QtWidgets.QHBoxLayout() + self.buttonsLayout.setObjectName("buttonsLayout") + self.buttonFreqLeft = QtWidgets.QPushButton(self.frequencyDockWidgetContents) + self.buttonFreqLeft.setMinimumSize(QtCore.QSize(0, 0)) + self.buttonFreqLeft.setMaximumSize(QtCore.QSize(40, 16777215)) + self.buttonFreqLeft.setObjectName("buttonFreqLeft") + self.buttonsLayout.addWidget(self.buttonFreqLeft) + self.buttonFreqRight = QtWidgets.QPushButton(self.frequencyDockWidgetContents) + self.buttonFreqRight.setEnabled(True) + self.buttonFreqRight.setMaximumSize(QtCore.QSize(40, 16777215)) + self.buttonFreqRight.setDefault(False) + self.buttonFreqRight.setObjectName("buttonFreqRight") + self.buttonsLayout.addWidget(self.buttonFreqRight) + self.buttonZoomOut = QtWidgets.QPushButton(self.frequencyDockWidgetContents) + self.buttonZoomOut.setMaximumSize(QtCore.QSize(40, 16777215)) + self.buttonZoomOut.setObjectName("buttonZoomOut") + self.buttonsLayout.addWidget(self.buttonZoomOut) + self.buttonZoomIn = QtWidgets.QPushButton(self.frequencyDockWidgetContents) + self.buttonZoomIn.setMaximumSize(QtCore.QSize(40, 16777215)) + self.buttonZoomIn.setObjectName("buttonZoomIn") + self.buttonsLayout.addWidget(self.buttonZoomIn) + self.formLayout.setLayout(3, QtWidgets.QFormLayout.SpanningRole, self.buttonsLayout) + self.textLayout = QtWidgets.QHBoxLayout() + self.textLayout.setObjectName("textLayout") + self.labelBins = QtWidgets.QLabel(self.frequencyDockWidgetContents) + self.labelBins.setText("") + self.labelBins.setObjectName("labelBins") + self.textLayout.addWidget(self.labelBins) + self.formLayout.setLayout(4, QtWidgets.QFormLayout.SpanningRole, self.textLayout) self.frequencyDockWidget.setWidget(self.frequencyDockWidgetContents) QSpectrumAnalyzerMainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.frequencyDockWidget) self.settingsDockWidget = QtWidgets.QDockWidget(QSpectrumAnalyzerMainWindow) @@ -159,7 +187,6 @@ def setupUi(self, QSpectrumAnalyzerMainWindow): self.settingsDockWidgetContents = QtWidgets.QWidget() self.settingsDockWidgetContents.setObjectName("settingsDockWidgetContents") self.gridLayout = QtWidgets.QGridLayout(self.settingsDockWidgetContents) - self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setObjectName("gridLayout") self.label_4 = QtWidgets.QLabel(self.settingsDockWidgetContents) self.label_4.setObjectName("label_4") @@ -169,7 +196,9 @@ def setupUi(self, QSpectrumAnalyzerMainWindow): self.gridLayout.addWidget(self.label_6, 0, 1, 1, 1) self.intervalSpinBox = QtWidgets.QDoubleSpinBox(self.settingsDockWidgetContents) self.intervalSpinBox.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.intervalSpinBox.setDecimals(3) self.intervalSpinBox.setMaximum(999.0) + self.intervalSpinBox.setSingleStep(0.01) self.intervalSpinBox.setProperty("value", 1.0) self.intervalSpinBox.setObjectName("intervalSpinBox") self.gridLayout.addWidget(self.intervalSpinBox, 1, 0, 1, 1) @@ -201,22 +230,29 @@ def setupUi(self, QSpectrumAnalyzerMainWindow): self.averageCheckBox = QtWidgets.QCheckBox(self.settingsDockWidgetContents) self.averageCheckBox.setObjectName("averageCheckBox") self.gridLayout.addWidget(self.averageCheckBox, 6, 0, 1, 1) - self.smoothCheckBox = QtWidgets.QCheckBox(self.settingsDockWidgetContents) - self.smoothCheckBox.setObjectName("smoothCheckBox") - self.gridLayout.addWidget(self.smoothCheckBox, 7, 0, 1, 1) - self.smoothButton = QtWidgets.QToolButton(self.settingsDockWidgetContents) - self.smoothButton.setAutoRaise(False) - self.smoothButton.setObjectName("smoothButton") - self.gridLayout.addWidget(self.smoothButton, 7, 2, 1, 1) + self.freqSmoothCheckBox = QtWidgets.QCheckBox(self.settingsDockWidgetContents) + self.freqSmoothCheckBox.setObjectName("freqSmoothCheckBox") + self.gridLayout.addWidget(self.freqSmoothCheckBox, 7, 0, 1, 2) + self.freqSmoothButton = QtWidgets.QToolButton(self.settingsDockWidgetContents) + self.freqSmoothButton.setAutoRaise(False) + self.freqSmoothButton.setObjectName("freqSmoothButton") + self.gridLayout.addWidget(self.freqSmoothButton, 7, 2, 1, 1) + self.temporalSmoothCheckBox = QtWidgets.QCheckBox(self.settingsDockWidgetContents) + self.temporalSmoothCheckBox.setObjectName("temporalSmoothCheckBox") + self.gridLayout.addWidget(self.temporalSmoothCheckBox, 8, 0, 1, 2) + self.temporalSmoothButton = QtWidgets.QToolButton(self.settingsDockWidgetContents) + self.temporalSmoothButton.setAutoRaise(False) + self.temporalSmoothButton.setObjectName("temporalSmoothButton") + self.gridLayout.addWidget(self.temporalSmoothButton, 8, 2, 1, 1) self.persistenceCheckBox = QtWidgets.QCheckBox(self.settingsDockWidgetContents) self.persistenceCheckBox.setObjectName("persistenceCheckBox") - self.gridLayout.addWidget(self.persistenceCheckBox, 8, 0, 1, 1) + self.gridLayout.addWidget(self.persistenceCheckBox, 9, 0, 1, 1) self.persistenceButton = QtWidgets.QToolButton(self.settingsDockWidgetContents) self.persistenceButton.setAutoRaise(False) self.persistenceButton.setObjectName("persistenceButton") - self.gridLayout.addWidget(self.persistenceButton, 8, 2, 1, 1) - spacerItem2 = QtWidgets.QSpacerItem(20, 1, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.gridLayout.addItem(spacerItem2, 11, 0, 1, 1) + self.gridLayout.addWidget(self.persistenceButton, 9, 2, 1, 1) + spacerItem1 = QtWidgets.QSpacerItem(20, 1, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.gridLayout.addItem(spacerItem1, 12, 0, 1, 1) self.cropSpinBox = QtWidgets.QSpinBox(self.settingsDockWidgetContents) self.cropSpinBox.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.cropSpinBox.setObjectName("cropSpinBox") @@ -232,14 +268,14 @@ def setupUi(self, QSpectrumAnalyzerMainWindow): self.gridLayout.addWidget(self.gainSpinBox, 1, 1, 1, 2) self.baselineCheckBox = QtWidgets.QCheckBox(self.settingsDockWidgetContents) self.baselineCheckBox.setObjectName("baselineCheckBox") - self.gridLayout.addWidget(self.baselineCheckBox, 9, 0, 1, 1) + self.gridLayout.addWidget(self.baselineCheckBox, 10, 0, 1, 1) self.baselineButton = QtWidgets.QToolButton(self.settingsDockWidgetContents) self.baselineButton.setAutoRaise(False) self.baselineButton.setObjectName("baselineButton") - self.gridLayout.addWidget(self.baselineButton, 9, 2, 1, 1) + self.gridLayout.addWidget(self.baselineButton, 10, 2, 1, 1) self.subtractBaselineCheckBox = QtWidgets.QCheckBox(self.settingsDockWidgetContents) self.subtractBaselineCheckBox.setObjectName("subtractBaselineCheckBox") - self.gridLayout.addWidget(self.subtractBaselineCheckBox, 10, 0, 1, 1) + self.gridLayout.addWidget(self.subtractBaselineCheckBox, 11, 0, 1, 1) self.settingsDockWidget.setWidget(self.settingsDockWidgetContents) QSpectrumAnalyzerMainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.settingsDockWidget) self.levelsDockWidget = QtWidgets.QDockWidget(QSpectrumAnalyzerMainWindow) @@ -253,7 +289,6 @@ def setupUi(self, QSpectrumAnalyzerMainWindow): self.levelsDockWidgetContents = QtWidgets.QWidget() self.levelsDockWidgetContents.setObjectName("levelsDockWidgetContents") self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.levelsDockWidgetContents) - self.verticalLayout_6.setContentsMargins(0, 0, 0, 0) self.verticalLayout_6.setObjectName("verticalLayout_6") self.histogramPlotLayout = GraphicsLayoutWidget(self.levelsDockWidgetContents) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Expanding) @@ -301,9 +336,11 @@ def setupUi(self, QSpectrumAnalyzerMainWindow): QSpectrumAnalyzerMainWindow.setTabOrder(self.colorsButton, self.peakHoldMaxCheckBox) QSpectrumAnalyzerMainWindow.setTabOrder(self.peakHoldMaxCheckBox, self.peakHoldMinCheckBox) QSpectrumAnalyzerMainWindow.setTabOrder(self.peakHoldMinCheckBox, self.averageCheckBox) - QSpectrumAnalyzerMainWindow.setTabOrder(self.averageCheckBox, self.smoothCheckBox) - QSpectrumAnalyzerMainWindow.setTabOrder(self.smoothCheckBox, self.smoothButton) - QSpectrumAnalyzerMainWindow.setTabOrder(self.smoothButton, self.persistenceCheckBox) + QSpectrumAnalyzerMainWindow.setTabOrder(self.averageCheckBox, self.freqSmoothCheckBox) + QSpectrumAnalyzerMainWindow.setTabOrder(self.freqSmoothCheckBox, self.freqSmoothButton) + QSpectrumAnalyzerMainWindow.setTabOrder(self.freqSmoothButton, self.temporalSmoothCheckBox) + QSpectrumAnalyzerMainWindow.setTabOrder(self.temporalSmoothCheckBox, self.temporalSmoothButton) + QSpectrumAnalyzerMainWindow.setTabOrder(self.temporalSmoothButton, self.persistenceCheckBox) QSpectrumAnalyzerMainWindow.setTabOrder(self.persistenceCheckBox, self.persistenceButton) QSpectrumAnalyzerMainWindow.setTabOrder(self.persistenceButton, self.baselineCheckBox) QSpectrumAnalyzerMainWindow.setTabOrder(self.baselineCheckBox, self.baselineButton) @@ -314,7 +351,7 @@ def setupUi(self, QSpectrumAnalyzerMainWindow): def retranslateUi(self, QSpectrumAnalyzerMainWindow): _translate = QtCore.QCoreApplication.translate - QSpectrumAnalyzerMainWindow.setWindowTitle(_translate("QSpectrumAnalyzerMainWindow", "QSpectrumAnalyzer")) + QSpectrumAnalyzerMainWindow.setWindowTitle(_translate("QSpectrumAnalyzerMainWindow", "QSpectrumAnalyzer Enhanced")) self.menu_File.setTitle(_translate("QSpectrumAnalyzerMainWindow", "&File")) self.menu_Help.setTitle(_translate("QSpectrumAnalyzerMainWindow", "&Help")) self.controlsDockWidget.setWindowTitle(_translate("QSpectrumAnalyzerMainWindow", "Controls")) @@ -328,6 +365,10 @@ def retranslateUi(self, QSpectrumAnalyzerMainWindow): self.stopFreqSpinBox.setSuffix(_translate("QSpectrumAnalyzerMainWindow", " MHz")) self.label.setText(_translate("QSpectrumAnalyzerMainWindow", "&Bin size:")) self.binSizeSpinBox.setSuffix(_translate("QSpectrumAnalyzerMainWindow", " kHz")) + self.buttonFreqLeft.setText(_translate("QSpectrumAnalyzerMainWindow", "<")) + self.buttonFreqRight.setText(_translate("QSpectrumAnalyzerMainWindow", ">")) + self.buttonZoomOut.setText(_translate("QSpectrumAnalyzerMainWindow", "-")) + self.buttonZoomIn.setText(_translate("QSpectrumAnalyzerMainWindow", "+")) self.settingsDockWidget.setWindowTitle(_translate("QSpectrumAnalyzerMainWindow", "Settings")) self.label_4.setText(_translate("QSpectrumAnalyzerMainWindow", "&Interval [s]:")) self.label_6.setText(_translate("QSpectrumAnalyzerMainWindow", "&Gain [dB]:")) @@ -338,8 +379,10 @@ def retranslateUi(self, QSpectrumAnalyzerMainWindow): self.peakHoldMaxCheckBox.setText(_translate("QSpectrumAnalyzerMainWindow", "Max. hold")) self.peakHoldMinCheckBox.setText(_translate("QSpectrumAnalyzerMainWindow", "Min. hold")) self.averageCheckBox.setText(_translate("QSpectrumAnalyzerMainWindow", "Average")) - self.smoothCheckBox.setText(_translate("QSpectrumAnalyzerMainWindow", "Smoothing")) - self.smoothButton.setText(_translate("QSpectrumAnalyzerMainWindow", "...")) + self.freqSmoothCheckBox.setText(_translate("QSpectrumAnalyzerMainWindow", "Freq. Smoothing")) + self.freqSmoothButton.setText(_translate("QSpectrumAnalyzerMainWindow", "...")) + self.temporalSmoothCheckBox.setText(_translate("QSpectrumAnalyzerMainWindow", "Temporal Smoothing")) + self.temporalSmoothButton.setText(_translate("QSpectrumAnalyzerMainWindow", "...")) self.persistenceCheckBox.setText(_translate("QSpectrumAnalyzerMainWindow", "Persistence")) self.persistenceButton.setText(_translate("QSpectrumAnalyzerMainWindow", "...")) self.gainSpinBox.setSpecialValueText(_translate("QSpectrumAnalyzerMainWindow", "auto")) @@ -351,5 +394,4 @@ def retranslateUi(self, QSpectrumAnalyzerMainWindow): self.action_Quit.setText(_translate("QSpectrumAnalyzerMainWindow", "&Quit")) self.action_Quit.setShortcut(_translate("QSpectrumAnalyzerMainWindow", "Ctrl+Q")) self.action_About.setText(_translate("QSpectrumAnalyzerMainWindow", "&About")) - from pyqtgraph import GraphicsLayoutWidget diff --git a/qspectrumanalyzer/ui_qspectrumanalyzer_baseline.py b/qspectrumanalyzer/ui_qspectrumanalyzer_baseline.py index 50592f9..5971eeb 100644 --- a/qspectrumanalyzer/ui_qspectrumanalyzer_baseline.py +++ b/qspectrumanalyzer/ui_qspectrumanalyzer_baseline.py @@ -1,12 +1,15 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'qspectrumanalyzer/qspectrumanalyzer_baseline.ui' +# Form implementation generated from reading ui file 'qspectrumanalyzer_baseline.ui' # -# Created by: PyQt5 UI code generator 5.8 +# Created by: PyQt5 UI code generator 5.15.6 # -# WARNING! All changes made in this file will be lost! +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets -from Qt import QtCore, QtGui, QtWidgets class Ui_QSpectrumAnalyzerBaseline(object): def setupUi(self, QSpectrumAnalyzerBaseline): @@ -40,8 +43,8 @@ def setupUi(self, QSpectrumAnalyzerBaseline): self.label.setBuddy(self.baselineFileEdit) self.retranslateUi(QSpectrumAnalyzerBaseline) - self.buttonBox.accepted.connect(QSpectrumAnalyzerBaseline.accept) - self.buttonBox.rejected.connect(QSpectrumAnalyzerBaseline.reject) + self.buttonBox.accepted.connect(QSpectrumAnalyzerBaseline.accept) # type: ignore + self.buttonBox.rejected.connect(QSpectrumAnalyzerBaseline.reject) # type: ignore QtCore.QMetaObject.connectSlotsByName(QSpectrumAnalyzerBaseline) QSpectrumAnalyzerBaseline.setTabOrder(self.baselineFileEdit, self.baselineFileButton) @@ -50,4 +53,3 @@ def retranslateUi(self, QSpectrumAnalyzerBaseline): QSpectrumAnalyzerBaseline.setWindowTitle(_translate("QSpectrumAnalyzerBaseline", "Baseline - QSpectrumAnalyzer")) self.label.setText(_translate("QSpectrumAnalyzerBaseline", "Baseline &file:")) self.baselineFileButton.setText(_translate("QSpectrumAnalyzerBaseline", "...")) - diff --git a/qspectrumanalyzer/ui_qspectrumanalyzer_colors.py b/qspectrumanalyzer/ui_qspectrumanalyzer_colors.py index 150b303..51aba8d 100644 --- a/qspectrumanalyzer/ui_qspectrumanalyzer_colors.py +++ b/qspectrumanalyzer/ui_qspectrumanalyzer_colors.py @@ -1,12 +1,15 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'qspectrumanalyzer/qspectrumanalyzer_colors.ui' +# Form implementation generated from reading ui file 'qspectrumanalyzer_colors.ui' # -# Created by: PyQt5 UI code generator 5.8 +# Created by: PyQt5 UI code generator 5.15.6 # -# WARNING! All changes made in this file will be lost! +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets -from Qt import QtCore, QtGui, QtWidgets class Ui_QSpectrumAnalyzerColors(object): def setupUi(self, QSpectrumAnalyzerColors): @@ -98,8 +101,8 @@ def setupUi(self, QSpectrumAnalyzerColors): self.label.setBuddy(self.baselineColorButton) self.retranslateUi(QSpectrumAnalyzerColors) - self.buttonBox.accepted.connect(QSpectrumAnalyzerColors.accept) - self.buttonBox.rejected.connect(QSpectrumAnalyzerColors.reject) + self.buttonBox.accepted.connect(QSpectrumAnalyzerColors.accept) # type: ignore + self.buttonBox.rejected.connect(QSpectrumAnalyzerColors.reject) # type: ignore QtCore.QMetaObject.connectSlotsByName(QSpectrumAnalyzerColors) QSpectrumAnalyzerColors.setTabOrder(self.mainColorButton, self.peakHoldMaxColorButton) QSpectrumAnalyzerColors.setTabOrder(self.peakHoldMaxColorButton, self.peakHoldMinColorButton) @@ -122,5 +125,4 @@ def retranslateUi(self, QSpectrumAnalyzerColors): self.persistenceColorButton.setText(_translate("QSpectrumAnalyzerColors", "...")) self.label.setText(_translate("QSpectrumAnalyzerColors", "&Baseline color:")) self.baselineColorButton.setText(_translate("QSpectrumAnalyzerColors", "...")) - from pyqtgraph import ColorButton diff --git a/qspectrumanalyzer/ui_qspectrumanalyzer_persistence.py b/qspectrumanalyzer/ui_qspectrumanalyzer_persistence.py index 02ee4ee..db93fde 100644 --- a/qspectrumanalyzer/ui_qspectrumanalyzer_persistence.py +++ b/qspectrumanalyzer/ui_qspectrumanalyzer_persistence.py @@ -1,12 +1,15 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'qspectrumanalyzer/qspectrumanalyzer_persistence.ui' +# Form implementation generated from reading ui file 'qspectrumanalyzer_persistence.ui' # -# Created by: PyQt5 UI code generator 5.8 +# Created by: PyQt5 UI code generator 5.15.6 # -# WARNING! All changes made in this file will be lost! +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets -from Qt import QtCore, QtGui, QtWidgets class Ui_QSpectrumAnalyzerPersistence(object): def setupUi(self, QSpectrumAnalyzerPersistence): @@ -44,8 +47,8 @@ def setupUi(self, QSpectrumAnalyzerPersistence): self.retranslateUi(QSpectrumAnalyzerPersistence) self.decayFunctionComboBox.setCurrentIndex(1) - self.buttonBox.accepted.connect(QSpectrumAnalyzerPersistence.accept) - self.buttonBox.rejected.connect(QSpectrumAnalyzerPersistence.reject) + self.buttonBox.accepted.connect(QSpectrumAnalyzerPersistence.accept) # type: ignore + self.buttonBox.rejected.connect(QSpectrumAnalyzerPersistence.reject) # type: ignore QtCore.QMetaObject.connectSlotsByName(QSpectrumAnalyzerPersistence) QSpectrumAnalyzerPersistence.setTabOrder(self.decayFunctionComboBox, self.persistenceLengthSpinBox) QSpectrumAnalyzerPersistence.setTabOrder(self.persistenceLengthSpinBox, self.buttonBox) @@ -57,4 +60,3 @@ def retranslateUi(self, QSpectrumAnalyzerPersistence): self.decayFunctionComboBox.setItemText(0, _translate("QSpectrumAnalyzerPersistence", "linear")) self.decayFunctionComboBox.setItemText(1, _translate("QSpectrumAnalyzerPersistence", "exponential")) self.label.setText(_translate("QSpectrumAnalyzerPersistence", "Persistence length:")) - diff --git a/qspectrumanalyzer/ui_qspectrumanalyzer_settings.py b/qspectrumanalyzer/ui_qspectrumanalyzer_settings.py index e6773a5..1fe5462 100644 --- a/qspectrumanalyzer/ui_qspectrumanalyzer_settings.py +++ b/qspectrumanalyzer/ui_qspectrumanalyzer_settings.py @@ -1,12 +1,15 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'qspectrumanalyzer/qspectrumanalyzer_settings.ui' +# Form implementation generated from reading ui file 'qspectrumanalyzer_settings.ui' # -# Created by: PyQt5 UI code generator 5.8 +# Created by: PyQt5 UI code generator 5.15.6 # -# WARNING! All changes made in this file will be lost! +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets -from Qt import QtCore, QtGui, QtWidgets class Ui_QSpectrumAnalyzerSettings(object): def setupUi(self, QSpectrumAnalyzerSettings): @@ -129,8 +132,8 @@ def setupUi(self, QSpectrumAnalyzerSettings): self.label_6.setBuddy(self.paramsEdit) self.retranslateUi(QSpectrumAnalyzerSettings) - self.buttonBox.accepted.connect(QSpectrumAnalyzerSettings.accept) - self.buttonBox.rejected.connect(QSpectrumAnalyzerSettings.reject) + self.buttonBox.accepted.connect(QSpectrumAnalyzerSettings.accept) # type: ignore + self.buttonBox.rejected.connect(QSpectrumAnalyzerSettings.reject) # type: ignore QtCore.QMetaObject.connectSlotsByName(QSpectrumAnalyzerSettings) QSpectrumAnalyzerSettings.setTabOrder(self.backendComboBox, self.executableEdit) QSpectrumAnalyzerSettings.setTabOrder(self.executableEdit, self.executableButton) @@ -168,4 +171,3 @@ def retranslateUi(self, QSpectrumAnalyzerSettings): self.bandwidthSpinBox.setSuffix(_translate("QSpectrumAnalyzerSettings", " MHz")) self.lnbSpinBox.setToolTip(_translate("QSpectrumAnalyzerSettings", "Negative frequency for upconverters, positive frequency for downconverters.")) self.lnbSpinBox.setSuffix(_translate("QSpectrumAnalyzerSettings", " MHz")) - diff --git a/qspectrumanalyzer/ui_qspectrumanalyzer_settings_help.py b/qspectrumanalyzer/ui_qspectrumanalyzer_settings_help.py index 06b59cf..3e07347 100644 --- a/qspectrumanalyzer/ui_qspectrumanalyzer_settings_help.py +++ b/qspectrumanalyzer/ui_qspectrumanalyzer_settings_help.py @@ -1,12 +1,15 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'qspectrumanalyzer/qspectrumanalyzer_settings_help.ui' +# Form implementation generated from reading ui file 'qspectrumanalyzer_settings_help.ui' # -# Created by: PyQt5 UI code generator 5.8 +# Created by: PyQt5 UI code generator 5.15.6 # -# WARNING! All changes made in this file will be lost! +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets -from Qt import QtCore, QtGui, QtWidgets class Ui_QSpectrumAnalyzerSettingsHelp(object): def setupUi(self, QSpectrumAnalyzerSettingsHelp): @@ -26,12 +29,11 @@ def setupUi(self, QSpectrumAnalyzerSettingsHelp): self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(QSpectrumAnalyzerSettingsHelp) - self.buttonBox.accepted.connect(QSpectrumAnalyzerSettingsHelp.accept) - self.buttonBox.rejected.connect(QSpectrumAnalyzerSettingsHelp.reject) + self.buttonBox.accepted.connect(QSpectrumAnalyzerSettingsHelp.accept) # type: ignore + self.buttonBox.rejected.connect(QSpectrumAnalyzerSettingsHelp.reject) # type: ignore QtCore.QMetaObject.connectSlotsByName(QSpectrumAnalyzerSettingsHelp) QSpectrumAnalyzerSettingsHelp.setTabOrder(self.helpTextEdit, self.buttonBox) def retranslateUi(self, QSpectrumAnalyzerSettingsHelp): _translate = QtCore.QCoreApplication.translate QSpectrumAnalyzerSettingsHelp.setWindowTitle(_translate("QSpectrumAnalyzerSettingsHelp", "Help - QSpectrumAnalyzer")) - diff --git a/qspectrumanalyzer/ui_qspectrumanalyzer_smoothing_frequency.py b/qspectrumanalyzer/ui_qspectrumanalyzer_smoothing_frequency.py new file mode 100644 index 0000000..e34becf --- /dev/null +++ b/qspectrumanalyzer/ui_qspectrumanalyzer_smoothing_frequency.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'qspectrumanalyzer_smoothing_frequency.ui' +# +# Created by: PyQt5 UI code generator 5.15.6 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_QSpectrumAnalyzerSmoothingFrequency(object): + def setupUi(self, QSpectrumAnalyzerSmoothingFrequency): + QSpectrumAnalyzerSmoothingFrequency.setObjectName("QSpectrumAnalyzerSmoothingFrequency") + QSpectrumAnalyzerSmoothingFrequency.resize(250, 130) + self.verticalLayout = QtWidgets.QVBoxLayout(QSpectrumAnalyzerSmoothingFrequency) + self.verticalLayout.setObjectName("verticalLayout") + self.formLayout = QtWidgets.QFormLayout() + self.formLayout.setObjectName("formLayout") + self.label = QtWidgets.QLabel(QSpectrumAnalyzerSmoothingFrequency) + self.label.setObjectName("label") + self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label) + self.windowFunctionComboBox = QtWidgets.QComboBox(QSpectrumAnalyzerSmoothingFrequency) + self.windowFunctionComboBox.setObjectName("windowFunctionComboBox") + self.windowFunctionComboBox.addItem("") + self.windowFunctionComboBox.addItem("") + self.windowFunctionComboBox.addItem("") + self.windowFunctionComboBox.addItem("") + self.windowFunctionComboBox.addItem("") + self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.windowFunctionComboBox) + self.label_2 = QtWidgets.QLabel(QSpectrumAnalyzerSmoothingFrequency) + self.label_2.setObjectName("label_2") + self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2) + self.windowLengthSpinBox = QtWidgets.QSpinBox(QSpectrumAnalyzerSmoothingFrequency) + self.windowLengthSpinBox.setMinimum(3) + self.windowLengthSpinBox.setMaximum(1001) + self.windowLengthSpinBox.setProperty("value", 11) + self.windowLengthSpinBox.setObjectName("windowLengthSpinBox") + self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.windowLengthSpinBox) + self.verticalLayout.addLayout(self.formLayout) + spacerItem = QtWidgets.QSpacerItem(20, 1, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout.addItem(spacerItem) + self.buttonBox = QtWidgets.QDialogButtonBox(QSpectrumAnalyzerSmoothingFrequency) + self.buttonBox.setOrientation(QtCore.Qt.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) + self.buttonBox.setObjectName("buttonBox") + self.verticalLayout.addWidget(self.buttonBox) + self.label.setBuddy(self.windowFunctionComboBox) + self.label_2.setBuddy(self.windowLengthSpinBox) + + self.retranslateUi(QSpectrumAnalyzerSmoothingFrequency) + self.windowFunctionComboBox.setCurrentIndex(1) + self.buttonBox.accepted.connect(QSpectrumAnalyzerSmoothingFrequency.accept) # type: ignore + self.buttonBox.rejected.connect(QSpectrumAnalyzerSmoothingFrequency.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(QSpectrumAnalyzerSmoothingFrequency) + QSpectrumAnalyzerSmoothingFrequency.setTabOrder(self.windowFunctionComboBox, self.windowLengthSpinBox) + QSpectrumAnalyzerSmoothingFrequency.setTabOrder(self.windowLengthSpinBox, self.buttonBox) + + def retranslateUi(self, QSpectrumAnalyzerSmoothingFrequency): + _translate = QtCore.QCoreApplication.translate + QSpectrumAnalyzerSmoothingFrequency.setWindowTitle(_translate("QSpectrumAnalyzerSmoothingFrequency", "Frequency Smoothing - QSpectrumAnalyzer")) + self.label.setText(_translate("QSpectrumAnalyzerSmoothingFrequency", "&Window function:")) + self.windowFunctionComboBox.setItemText(0, _translate("QSpectrumAnalyzerSmoothingFrequency", "rectangular")) + self.windowFunctionComboBox.setItemText(1, _translate("QSpectrumAnalyzerSmoothingFrequency", "hanning")) + self.windowFunctionComboBox.setItemText(2, _translate("QSpectrumAnalyzerSmoothingFrequency", "hamming")) + self.windowFunctionComboBox.setItemText(3, _translate("QSpectrumAnalyzerSmoothingFrequency", "bartlett")) + self.windowFunctionComboBox.setItemText(4, _translate("QSpectrumAnalyzerSmoothingFrequency", "blackman")) + self.label_2.setText(_translate("QSpectrumAnalyzerSmoothingFrequency", "Window len>h:")) diff --git a/qspectrumanalyzer/ui_qspectrumanalyzer_smoothing.py b/qspectrumanalyzer/ui_qspectrumanalyzer_smoothing_temporal.py similarity index 65% rename from qspectrumanalyzer/ui_qspectrumanalyzer_smoothing.py rename to qspectrumanalyzer/ui_qspectrumanalyzer_smoothing_temporal.py index 7c8da5e..8c0fe0f 100644 --- a/qspectrumanalyzer/ui_qspectrumanalyzer_smoothing.py +++ b/qspectrumanalyzer/ui_qspectrumanalyzer_smoothing_temporal.py @@ -1,25 +1,28 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'qspectrumanalyzer/qspectrumanalyzer_smoothing.ui' +# Form implementation generated from reading ui file 'qspectrumanalyzer_smoothing_temporal.ui' # -# Created by: PyQt5 UI code generator 5.8 +# Created by: PyQt5 UI code generator 5.15.6 # -# WARNING! All changes made in this file will be lost! +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. -from Qt import QtCore, QtGui, QtWidgets -class Ui_QSpectrumAnalyzerSmoothing(object): - def setupUi(self, QSpectrumAnalyzerSmoothing): - QSpectrumAnalyzerSmoothing.setObjectName("QSpectrumAnalyzerSmoothing") - QSpectrumAnalyzerSmoothing.resize(250, 130) - self.verticalLayout = QtWidgets.QVBoxLayout(QSpectrumAnalyzerSmoothing) +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_QSpectrumAnalyzerSmoothingTemporal(object): + def setupUi(self, QSpectrumAnalyzerSmoothingTemporal): + QSpectrumAnalyzerSmoothingTemporal.setObjectName("QSpectrumAnalyzerSmoothingTemporal") + QSpectrumAnalyzerSmoothingTemporal.resize(250, 130) + self.verticalLayout = QtWidgets.QVBoxLayout(QSpectrumAnalyzerSmoothingTemporal) self.verticalLayout.setObjectName("verticalLayout") self.formLayout = QtWidgets.QFormLayout() self.formLayout.setObjectName("formLayout") - self.label = QtWidgets.QLabel(QSpectrumAnalyzerSmoothing) + self.label = QtWidgets.QLabel(QSpectrumAnalyzerSmoothingTemporal) self.label.setObjectName("label") self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label) - self.windowFunctionComboBox = QtWidgets.QComboBox(QSpectrumAnalyzerSmoothing) + self.windowFunctionComboBox = QtWidgets.QComboBox(QSpectrumAnalyzerSmoothingTemporal) self.windowFunctionComboBox.setObjectName("windowFunctionComboBox") self.windowFunctionComboBox.addItem("") self.windowFunctionComboBox.addItem("") @@ -27,10 +30,10 @@ def setupUi(self, QSpectrumAnalyzerSmoothing): self.windowFunctionComboBox.addItem("") self.windowFunctionComboBox.addItem("") self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.windowFunctionComboBox) - self.label_2 = QtWidgets.QLabel(QSpectrumAnalyzerSmoothing) + self.label_2 = QtWidgets.QLabel(QSpectrumAnalyzerSmoothingTemporal) self.label_2.setObjectName("label_2") self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2) - self.windowLengthSpinBox = QtWidgets.QSpinBox(QSpectrumAnalyzerSmoothing) + self.windowLengthSpinBox = QtWidgets.QSpinBox(QSpectrumAnalyzerSmoothingTemporal) self.windowLengthSpinBox.setMinimum(3) self.windowLengthSpinBox.setMaximum(1001) self.windowLengthSpinBox.setProperty("value", 11) @@ -39,7 +42,7 @@ def setupUi(self, QSpectrumAnalyzerSmoothing): self.verticalLayout.addLayout(self.formLayout) spacerItem = QtWidgets.QSpacerItem(20, 1, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) - self.buttonBox = QtWidgets.QDialogButtonBox(QSpectrumAnalyzerSmoothing) + self.buttonBox = QtWidgets.QDialogButtonBox(QSpectrumAnalyzerSmoothingTemporal) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) self.buttonBox.setObjectName("buttonBox") @@ -47,22 +50,21 @@ def setupUi(self, QSpectrumAnalyzerSmoothing): self.label.setBuddy(self.windowFunctionComboBox) self.label_2.setBuddy(self.windowLengthSpinBox) - self.retranslateUi(QSpectrumAnalyzerSmoothing) + self.retranslateUi(QSpectrumAnalyzerSmoothingTemporal) self.windowFunctionComboBox.setCurrentIndex(1) - self.buttonBox.accepted.connect(QSpectrumAnalyzerSmoothing.accept) - self.buttonBox.rejected.connect(QSpectrumAnalyzerSmoothing.reject) - QtCore.QMetaObject.connectSlotsByName(QSpectrumAnalyzerSmoothing) - QSpectrumAnalyzerSmoothing.setTabOrder(self.windowFunctionComboBox, self.windowLengthSpinBox) - QSpectrumAnalyzerSmoothing.setTabOrder(self.windowLengthSpinBox, self.buttonBox) + self.buttonBox.accepted.connect(QSpectrumAnalyzerSmoothingTemporal.accept) # type: ignore + self.buttonBox.rejected.connect(QSpectrumAnalyzerSmoothingTemporal.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(QSpectrumAnalyzerSmoothingTemporal) + QSpectrumAnalyzerSmoothingTemporal.setTabOrder(self.windowFunctionComboBox, self.windowLengthSpinBox) + QSpectrumAnalyzerSmoothingTemporal.setTabOrder(self.windowLengthSpinBox, self.buttonBox) - def retranslateUi(self, QSpectrumAnalyzerSmoothing): + def retranslateUi(self, QSpectrumAnalyzerSmoothingTemporal): _translate = QtCore.QCoreApplication.translate - QSpectrumAnalyzerSmoothing.setWindowTitle(_translate("QSpectrumAnalyzerSmoothing", "Smoothing - QSpectrumAnalyzer")) - self.label.setText(_translate("QSpectrumAnalyzerSmoothing", "&Window function:")) - self.windowFunctionComboBox.setItemText(0, _translate("QSpectrumAnalyzerSmoothing", "rectangular")) - self.windowFunctionComboBox.setItemText(1, _translate("QSpectrumAnalyzerSmoothing", "hanning")) - self.windowFunctionComboBox.setItemText(2, _translate("QSpectrumAnalyzerSmoothing", "hamming")) - self.windowFunctionComboBox.setItemText(3, _translate("QSpectrumAnalyzerSmoothing", "bartlett")) - self.windowFunctionComboBox.setItemText(4, _translate("QSpectrumAnalyzerSmoothing", "blackman")) - self.label_2.setText(_translate("QSpectrumAnalyzerSmoothing", "Window len>h:")) - + QSpectrumAnalyzerSmoothingTemporal.setWindowTitle(_translate("QSpectrumAnalyzerSmoothingTemporal", "Temporal Smoothing - QSpectrumAnalyzer")) + self.label.setText(_translate("QSpectrumAnalyzerSmoothingTemporal", "&Window function:")) + self.windowFunctionComboBox.setItemText(0, _translate("QSpectrumAnalyzerSmoothingTemporal", "rectangular")) + self.windowFunctionComboBox.setItemText(1, _translate("QSpectrumAnalyzerSmoothingTemporal", "hanning")) + self.windowFunctionComboBox.setItemText(2, _translate("QSpectrumAnalyzerSmoothingTemporal", "hamming")) + self.windowFunctionComboBox.setItemText(3, _translate("QSpectrumAnalyzerSmoothingTemporal", "bartlett")) + self.windowFunctionComboBox.setItemText(4, _translate("QSpectrumAnalyzerSmoothingTemporal", "blackman")) + self.label_2.setText(_translate("QSpectrumAnalyzerSmoothingTemporal", "Window len>h:"))