Add option to modify number of samples used for averaging

This commit is contained in:
Jonathan Martin 2017-10-23 10:02:54 +02:00
parent 625ba9d698
commit 05f6270244
7 changed files with 208 additions and 4 deletions

View File

@ -11,6 +11,7 @@ from qspectrumanalyzer.plot import SpectrumPlotWidget, WaterfallPlotWidget
from qspectrumanalyzer.utils import str_to_color, human_time from qspectrumanalyzer.utils import str_to_color, human_time
from qspectrumanalyzer.settings import QSpectrumAnalyzerSettings from qspectrumanalyzer.settings import QSpectrumAnalyzerSettings
from qspectrumanalyzer.average import QSpectrumAnalyzerAverage
from qspectrumanalyzer.smoothing import QSpectrumAnalyzerSmoothing from qspectrumanalyzer.smoothing import QSpectrumAnalyzerSmoothing
from qspectrumanalyzer.persistence import QSpectrumAnalyzerPersistence from qspectrumanalyzer.persistence import QSpectrumAnalyzerPersistence
from qspectrumanalyzer.colors import QSpectrumAnalyzerColors from qspectrumanalyzer.colors import QSpectrumAnalyzerColors
@ -445,6 +446,15 @@ class QSpectrumAnalyzerMainWindow(QtWidgets.QMainWindow, Ui_QSpectrumAnalyzerMai
settings.value("baseline_file", None) 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() @QtCore.Slot()
def on_smoothButton_clicked(self): def on_smoothButton_clicked(self):
dialog = QSpectrumAnalyzerSmoothing(self) dialog = QSpectrumAnalyzerSmoothing(self)

View File

@ -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)

View File

@ -77,6 +77,7 @@ class DataStorage(QtCore.QObject):
self.prev_baseline = None self.prev_baseline = None
self.baseline = None self.baseline = None
self.baseline_x = None self.baseline_x = None
self.average_samples = 0
# Use only one worker thread because it is not faster # Use only one worker thread because it is not faster
# with more threads (and memory consumption is much higher) # with more threads (and memory consumption is much higher)
@ -154,7 +155,8 @@ class DataStorage(QtCore.QObject):
if self.average is None: if self.average is None:
self.average = data["y"].copy() self.average = data["y"].copy()
else: 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) self.average_updated.emit(self)
def update_peak_hold_max(self, data): def update_peak_hold_max(self, data):
@ -177,6 +179,10 @@ class DataStorage(QtCore.QObject):
"""Apply smoothing function to data""" """Apply smoothing function to data"""
return smooth(y, window_len=self.smooth_length, window=self.smooth_window) 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"): def set_smooth(self, toggle, length=11, window="hanning"):
"""Toggle smoothing and set smoothing params""" """Toggle smoothing and set smoothing params"""
if toggle != self.smooth or length != self.smooth_length or window != self.smooth_window: if toggle != self.smooth or length != self.smooth_length or window != self.smooth_window:

View File

@ -52,7 +52,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1200</width> <width>1200</width>
<height>32</height> <height>22</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menu_File"> <widget class="QMenu" name="menu_File">
@ -525,6 +525,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="2">
<widget class="QToolButton" name="averageButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>

View File

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QSpectrumAnalyzerAverage</class>
<widget class="QDialog" name="QSpectrumAnalyzerAverage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>530</width>
<height>130</height>
</rect>
</property>
<property name="windowTitle">
<string>Average - QSpectrumAnalyzer</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Number of samples:</string>
</property>
<property name="buddy">
<cstring>averageSamplesSpinBox</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="averageSamplesSpinBox">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>5000</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>1</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>averageSamplesSpinBox</tabstop>
<tabstop>buttonBox</tabstop>
</tabstops>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>QSpectrumAnalyzerAverage</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>218</x>
<y>104</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>129</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>QSpectrumAnalyzerAverage</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>218</x>
<y>110</y>
</hint>
<hint type="destinationlabel">
<x>224</x>
<y>129</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'qspectrumanalyzer/qspectrumanalyzer.ui' # 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! # WARNING! All changes made in this file will be lost!
@ -41,7 +41,7 @@ class Ui_QSpectrumAnalyzerMainWindow(object):
self.horizontalLayout.addWidget(self.plotSplitter) self.horizontalLayout.addWidget(self.plotSplitter)
QSpectrumAnalyzerMainWindow.setCentralWidget(self.centralwidget) QSpectrumAnalyzerMainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(QSpectrumAnalyzerMainWindow) 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.menubar.setObjectName("menubar")
self.menu_File = QtWidgets.QMenu(self.menubar) self.menu_File = QtWidgets.QMenu(self.menubar)
self.menu_File.setObjectName("menu_File") self.menu_File.setObjectName("menu_File")
@ -240,6 +240,9 @@ class Ui_QSpectrumAnalyzerMainWindow(object):
self.subtractBaselineCheckBox = QtWidgets.QCheckBox(self.settingsDockWidgetContents) self.subtractBaselineCheckBox = QtWidgets.QCheckBox(self.settingsDockWidgetContents)
self.subtractBaselineCheckBox.setObjectName("subtractBaselineCheckBox") self.subtractBaselineCheckBox.setObjectName("subtractBaselineCheckBox")
self.gridLayout.addWidget(self.subtractBaselineCheckBox, 10, 0, 1, 1) 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) self.settingsDockWidget.setWidget(self.settingsDockWidgetContents)
QSpectrumAnalyzerMainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.settingsDockWidget) QSpectrumAnalyzerMainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.settingsDockWidget)
self.levelsDockWidget = QtWidgets.QDockWidget(QSpectrumAnalyzerMainWindow) self.levelsDockWidget = QtWidgets.QDockWidget(QSpectrumAnalyzerMainWindow)
@ -346,6 +349,7 @@ class Ui_QSpectrumAnalyzerMainWindow(object):
self.baselineCheckBox.setText(_translate("QSpectrumAnalyzerMainWindow", "Baseline")) self.baselineCheckBox.setText(_translate("QSpectrumAnalyzerMainWindow", "Baseline"))
self.baselineButton.setText(_translate("QSpectrumAnalyzerMainWindow", "...")) self.baselineButton.setText(_translate("QSpectrumAnalyzerMainWindow", "..."))
self.subtractBaselineCheckBox.setText(_translate("QSpectrumAnalyzerMainWindow", "Subtract baseline")) self.subtractBaselineCheckBox.setText(_translate("QSpectrumAnalyzerMainWindow", "Subtract baseline"))
self.averageButton.setText(_translate("QSpectrumAnalyzerMainWindow", "..."))
self.levelsDockWidget.setWindowTitle(_translate("QSpectrumAnalyzerMainWindow", "Levels")) self.levelsDockWidget.setWindowTitle(_translate("QSpectrumAnalyzerMainWindow", "Levels"))
self.action_Settings.setText(_translate("QSpectrumAnalyzerMainWindow", "&Settings...")) self.action_Settings.setText(_translate("QSpectrumAnalyzerMainWindow", "&Settings..."))
self.action_Quit.setText(_translate("QSpectrumAnalyzerMainWindow", "&Quit")) self.action_Quit.setText(_translate("QSpectrumAnalyzerMainWindow", "&Quit"))

View File

@ -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:"))