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.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 @@ class QSpectrumAnalyzerMainWindow(QtWidgets.QMainWindow, Ui_QSpectrumAnalyzerMai
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)

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.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 @@ class DataStorage(QtCore.QObject):
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 @@ class DataStorage(QtCore.QObject):
"""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:

View File

@ -52,7 +52,7 @@
<x>0</x>
<y>0</y>
<width>1200</width>
<height>32</height>
<height>22</height>
</rect>
</property>
<widget class="QMenu" name="menu_File">
@ -525,6 +525,13 @@
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QToolButton" name="averageButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</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'
#
# 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 @@ class Ui_QSpectrumAnalyzerMainWindow(object):
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 @@ class Ui_QSpectrumAnalyzerMainWindow(object):
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 @@ class Ui_QSpectrumAnalyzerMainWindow(object):
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"))

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