From 05f6270244f8ed555713db763e0427c37c0780db Mon Sep 17 00:00:00 2001 From: Jonathan Martin Date: Mon, 23 Oct 2017 10:02:54 +0200 Subject: [PATCH] Add option to modify number of samples used for averaging --- qspectrumanalyzer/__main__.py | 10 ++ qspectrumanalyzer/average.py | 21 ++++ qspectrumanalyzer/data.py | 8 +- qspectrumanalyzer/qspectrumanalyzer.ui | 9 +- .../qspectrumanalyzer_average.ui | 108 ++++++++++++++++++ qspectrumanalyzer/ui_qspectrumanalyzer.py | 8 +- .../ui_qspectrumanalyzer_average.py | 48 ++++++++ 7 files changed, 208 insertions(+), 4 deletions(-) create mode 100644 qspectrumanalyzer/average.py create mode 100644 qspectrumanalyzer/qspectrumanalyzer_average.ui create mode 100644 qspectrumanalyzer/ui_qspectrumanalyzer_average.py diff --git a/qspectrumanalyzer/__main__.py b/qspectrumanalyzer/__main__.py index 2a87922..1b77941 100644 --- a/qspectrumanalyzer/__main__.py +++ b/qspectrumanalyzer/__main__.py @@ -11,6 +11,7 @@ from qspectrumanalyzer.utils import str_to_color, human_time from qspectrumanalyzer.settings import QSpectrumAnalyzerSettings +from qspectrumanalyzer.average import QSpectrumAnalyzerAverage from qspectrumanalyzer.smoothing import QSpectrumAnalyzerSmoothing from qspectrumanalyzer.persistence import QSpectrumAnalyzerPersistence from qspectrumanalyzer.colors import QSpectrumAnalyzerColors @@ -445,6 +446,15 @@ def on_baselineButton_clicked(self): settings.value("baseline_file", None) ) + @QtCore.Slot() + def on_averageButton_clicked(self): + dialog = QSpectrumAnalyzerAverage(self) + if dialog.exec_(): + settings = QtCore.QSettings() + self.data_storage.set_average( + settings.value("average_samples", 0, int) + ) + @QtCore.Slot() def on_smoothButton_clicked(self): dialog = QSpectrumAnalyzerSmoothing(self) diff --git a/qspectrumanalyzer/average.py b/qspectrumanalyzer/average.py new file mode 100644 index 0000000..4c012c7 --- /dev/null +++ b/qspectrumanalyzer/average.py @@ -0,0 +1,21 @@ +from Qt import QtCore, QtWidgets + +from qspectrumanalyzer.ui_qspectrumanalyzer_average import Ui_QSpectrumAnalyzerAverage + + +class QSpectrumAnalyzerAverage(QtWidgets.QDialog, Ui_QSpectrumAnalyzerAverage): + """QSpectrumAnalyzer spectrum smoothing dialog""" + def __init__(self, parent=None): + # Initialize UI + super().__init__(parent) + self.setupUi(self) + + # Load settings + settings = QtCore.QSettings() + self.averageSamplesSpinBox.setValue(settings.value("average_samples", 0, int)) + + def accept(self): + """Save settings when dialog is accepted""" + settings = QtCore.QSettings() + settings.setValue("average_samples", self.averageSamplesSpinBox.value()) + QtWidgets.QDialog.accept(self) diff --git a/qspectrumanalyzer/data.py b/qspectrumanalyzer/data.py index 283237a..5c1d9d0 100644 --- a/qspectrumanalyzer/data.py +++ b/qspectrumanalyzer/data.py @@ -77,6 +77,7 @@ def __init__(self, max_history_size=100, parent=None): self.prev_baseline = None self.baseline = None self.baseline_x = None + self.average_samples = 0 # Use only one worker thread because it is not faster # with more threads (and memory consumption is much higher) @@ -154,7 +155,8 @@ def update_average(self, data): if self.average is None: self.average = data["y"].copy() else: - self.average = np.average((self.average, data["y"]), axis=0, weights=(self.average_counter - 1, 1)) + weight = self.average_samples if self.average_samples > 0 else self.average_counter - 1 + self.average = np.average((self.average, data["y"]), axis=0, weights=(weight, 1)) self.average_updated.emit(self) def update_peak_hold_max(self, data): @@ -177,6 +179,10 @@ def smooth_data(self, y): """Apply smoothing function to data""" return smooth(y, window_len=self.smooth_length, window=self.smooth_window) + def set_average(self, average=0): + """Set average params""" + self.average_samples = average + 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: diff --git a/qspectrumanalyzer/qspectrumanalyzer.ui b/qspectrumanalyzer/qspectrumanalyzer.ui index b65c947..ffde7d7 100644 --- a/qspectrumanalyzer/qspectrumanalyzer.ui +++ b/qspectrumanalyzer/qspectrumanalyzer.ui @@ -52,7 +52,7 @@ 0 0 1200 - 32 + 22 @@ -525,6 +525,13 @@ + + + + ... + + + diff --git a/qspectrumanalyzer/qspectrumanalyzer_average.ui b/qspectrumanalyzer/qspectrumanalyzer_average.ui new file mode 100644 index 0000000..011dffb --- /dev/null +++ b/qspectrumanalyzer/qspectrumanalyzer_average.ui @@ -0,0 +1,108 @@ + + + QSpectrumAnalyzerAverage + + + + 0 + 0 + 530 + 130 + + + + Average - QSpectrumAnalyzer + + + + + + + + Number of samples: + + + averageSamplesSpinBox + + + + + + + 0 + + + 5000 + + + 0 + + + + + + + + + Qt::Vertical + + + + 20 + 1 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + averageSamplesSpinBox + buttonBox + + + + + buttonBox + accepted() + QSpectrumAnalyzerAverage + accept() + + + 218 + 104 + + + 157 + 129 + + + + + buttonBox + rejected() + QSpectrumAnalyzerAverage + reject() + + + 218 + 110 + + + 224 + 129 + + + + + diff --git a/qspectrumanalyzer/ui_qspectrumanalyzer.py b/qspectrumanalyzer/ui_qspectrumanalyzer.py index 39b3609..65e971e 100644 --- a/qspectrumanalyzer/ui_qspectrumanalyzer.py +++ b/qspectrumanalyzer/ui_qspectrumanalyzer.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'qspectrumanalyzer/qspectrumanalyzer.ui' # -# Created by: PyQt5 UI code generator 5.8 +# Created by: PyQt5 UI code generator 5.9 # # WARNING! All changes made in this file will be lost! @@ -41,7 +41,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, 22)) self.menubar.setObjectName("menubar") self.menu_File = QtWidgets.QMenu(self.menubar) self.menu_File.setObjectName("menu_File") @@ -240,6 +240,9 @@ def setupUi(self, QSpectrumAnalyzerMainWindow): self.subtractBaselineCheckBox = QtWidgets.QCheckBox(self.settingsDockWidgetContents) self.subtractBaselineCheckBox.setObjectName("subtractBaselineCheckBox") self.gridLayout.addWidget(self.subtractBaselineCheckBox, 10, 0, 1, 1) + self.averageButton = QtWidgets.QToolButton(self.settingsDockWidgetContents) + self.averageButton.setObjectName("averageButton") + self.gridLayout.addWidget(self.averageButton, 6, 2, 1, 1) self.settingsDockWidget.setWidget(self.settingsDockWidgetContents) QSpectrumAnalyzerMainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.settingsDockWidget) self.levelsDockWidget = QtWidgets.QDockWidget(QSpectrumAnalyzerMainWindow) @@ -346,6 +349,7 @@ def retranslateUi(self, QSpectrumAnalyzerMainWindow): self.baselineCheckBox.setText(_translate("QSpectrumAnalyzerMainWindow", "Baseline")) self.baselineButton.setText(_translate("QSpectrumAnalyzerMainWindow", "...")) self.subtractBaselineCheckBox.setText(_translate("QSpectrumAnalyzerMainWindow", "Subtract baseline")) + self.averageButton.setText(_translate("QSpectrumAnalyzerMainWindow", "...")) self.levelsDockWidget.setWindowTitle(_translate("QSpectrumAnalyzerMainWindow", "Levels")) self.action_Settings.setText(_translate("QSpectrumAnalyzerMainWindow", "&Settings...")) self.action_Quit.setText(_translate("QSpectrumAnalyzerMainWindow", "&Quit")) diff --git a/qspectrumanalyzer/ui_qspectrumanalyzer_average.py b/qspectrumanalyzer/ui_qspectrumanalyzer_average.py new file mode 100644 index 0000000..8ed2f1a --- /dev/null +++ b/qspectrumanalyzer/ui_qspectrumanalyzer_average.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'qspectrumanalyzer/qspectrumanalyzer_average.ui' +# +# Created by: PyQt5 UI code generator 5.9 +# +# WARNING! All changes made in this file will be lost! + +from Qt import QtCore, QtGui, QtWidgets + +class Ui_QSpectrumAnalyzerAverage(object): + def setupUi(self, QSpectrumAnalyzerAverage): + QSpectrumAnalyzerAverage.setObjectName("QSpectrumAnalyzerAverage") + QSpectrumAnalyzerAverage.resize(530, 130) + self.verticalLayout = QtWidgets.QVBoxLayout(QSpectrumAnalyzerAverage) + self.verticalLayout.setObjectName("verticalLayout") + self.formLayout = QtWidgets.QFormLayout() + self.formLayout.setObjectName("formLayout") + self.label = QtWidgets.QLabel(QSpectrumAnalyzerAverage) + self.label.setObjectName("label") + self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label) + self.averageSamplesSpinBox = QtWidgets.QSpinBox(QSpectrumAnalyzerAverage) + self.averageSamplesSpinBox.setMinimum(0) + self.averageSamplesSpinBox.setMaximum(5000) + self.averageSamplesSpinBox.setProperty("value", 0) + self.averageSamplesSpinBox.setObjectName("averageSamplesSpinBox") + self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.averageSamplesSpinBox) + self.verticalLayout.addLayout(self.formLayout) + spacerItem = QtWidgets.QSpacerItem(20, 1, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout.addItem(spacerItem) + self.buttonBox = QtWidgets.QDialogButtonBox(QSpectrumAnalyzerAverage) + 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.averageSamplesSpinBox) + + self.retranslateUi(QSpectrumAnalyzerAverage) + self.buttonBox.accepted.connect(QSpectrumAnalyzerAverage.accept) + self.buttonBox.rejected.connect(QSpectrumAnalyzerAverage.reject) + QtCore.QMetaObject.connectSlotsByName(QSpectrumAnalyzerAverage) + QSpectrumAnalyzerAverage.setTabOrder(self.averageSamplesSpinBox, self.buttonBox) + + def retranslateUi(self, QSpectrumAnalyzerAverage): + _translate = QtCore.QCoreApplication.translate + QSpectrumAnalyzerAverage.setWindowTitle(_translate("QSpectrumAnalyzerAverage", "Average - QSpectrumAnalyzer")) + self.label.setText(_translate("QSpectrumAnalyzerAverage", "Number of samples:")) +