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
+ -
+
+
+ ...
+
+
+
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:"))
+