Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add default noise threshold setting #949

Merged
merged 2 commits into from
Feb 22, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 55 additions & 1 deletion data/ui/main.ui
Original file line number Diff line number Diff line change
@@ -341,7 +341,7 @@ image: url(:/icons/icons/splitter_handle_vertical.svg);
<x>0</x>
<y>0</y>
<width>798</width>
<height>28</height>
<height>27</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@@ -380,13 +380,24 @@ image: url(:/icons/icons/splitter_handle_vertical.svg);
<property name="title">
<string>Edi&amp;t</string>
</property>
<widget class="QMenu" name="menuDefault_noise_threshold">
<property name="title">
<string>Default noise threshold</string>
</property>
<addaction name="actionAutomaticNoiseThreshold"/>
<addaction name="action1NoiseThreshold"/>
<addaction name="action5NoiseThreshold"/>
<addaction name="action10NoiseThreshold"/>
<addaction name="action100NoiseThreshold"/>
</widget>
<addaction name="actionDecoding"/>
<addaction name="actionOptions"/>
<addaction name="separator"/>
<addaction name="actionShowFileTree"/>
<addaction name="actionFullscreen_mode"/>
<addaction name="separator"/>
<addaction name="actionAuto_detect_new_signals"/>
<addaction name="menuDefault_noise_threshold"/>
</widget>
<widget class="QMenu" name="menuHelp">
<property name="title">
@@ -768,6 +779,49 @@ image: url(:/icons/icons/splitter_handle_vertical.svg);
<string>Auto detect signals on loading</string>
</property>
</action>
<action name="actionAutomaticNoiseThreshold">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Automatic</string>
</property>
</action>
<action name="action1NoiseThreshold">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>1%</string>
</property>
</action>
<action name="action5NoiseThreshold">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>5%</string>
</property>
</action>
<action name="action10NoiseThreshold">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>10%</string>
</property>
</action>
<action name="action100NoiseThreshold">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>100% (disables demodulation)</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>
39 changes: 39 additions & 0 deletions src/urh/controller/MainController.py
Original file line number Diff line number Diff line change
@@ -99,6 +99,19 @@ def __init__(self, *args):
self.ui.actionNone.setActionGroup(group)
self.ui.actionPSK.setActionGroup(group)

noise_threshold_setting = settings.read("default_noise_threshold", "automatic")
noise_threshold_group = QActionGroup(self)
self.ui.actionAutomaticNoiseThreshold.setActionGroup(noise_threshold_group)
self.ui.actionAutomaticNoiseThreshold.setChecked(noise_threshold_setting == "automatic")
self.ui.action1NoiseThreshold.setActionGroup(noise_threshold_group)
self.ui.action1NoiseThreshold.setChecked(noise_threshold_setting == "1")
self.ui.action5NoiseThreshold.setActionGroup(noise_threshold_group)
self.ui.action5NoiseThreshold.setChecked(noise_threshold_setting == "5")
self.ui.action10NoiseThreshold.setActionGroup(noise_threshold_group)
self.ui.action10NoiseThreshold.setChecked(noise_threshold_setting == "10")
self.ui.action100NoiseThreshold.setActionGroup(noise_threshold_group)
self.ui.action100NoiseThreshold.setChecked(noise_threshold_setting == "100")

self.recentFileActionList = []
self.create_connects()
self.init_recent_file_action_list(settings.read("recentFiles", [], list))
@@ -182,6 +195,12 @@ def create_connects(self):
self.ui.actionSamples_from_csv.triggered.connect(self.on_import_samples_from_csv_action_triggered)
self.ui.actionAuto_detect_new_signals.triggered.connect(self.on_auto_detect_new_signals_action_triggered)

self.ui.actionAutomaticNoiseThreshold.triggered.connect(self.on_action_automatic_noise_threshold_triggered)
self.ui.action1NoiseThreshold.triggered.connect(self.on_action_1_noise_threshold_triggered)
self.ui.action5NoiseThreshold.triggered.connect(self.on_action_5_noise_threshold_triggered)
self.ui.action10NoiseThreshold.triggered.connect(self.on_action_10_noise_threshold_triggered)
self.ui.action100NoiseThreshold.triggered.connect(self.on_action_100_noise_threshold_triggered)

self.ui.btnFileTreeGoUp.clicked.connect(self.on_btn_file_tree_go_up_clicked)
self.ui.fileTree.directory_open_wanted.connect(self.project_manager.set_project_folder)

@@ -926,3 +945,23 @@ def on_simulator_open_in_analysis_requested(self, text: str):
self.ui.tabWidget.setCurrentIndex(1)
self.compare_frame_controller.add_protocol(protocol)
self.compare_frame_controller.refresh()

@pyqtSlot()
def on_action_automatic_noise_threshold_triggered(self):
settings.write("default_noise_threshold", "automatic")

@pyqtSlot()
def on_action_1_noise_threshold_triggered(self):
settings.write("default_noise_threshold", "1")

@pyqtSlot()
def on_action_5_noise_threshold_triggered(self):
settings.write("default_noise_threshold", "5")

@pyqtSlot()
def on_action_10_noise_threshold_triggered(self):
settings.write("default_noise_threshold", "10")

@pyqtSlot()
def on_action_100_noise_threshold_triggered(self):
settings.write("default_noise_threshold", "100")
18 changes: 14 additions & 4 deletions src/urh/signalprocessing/Signal.py
Original file line number Diff line number Diff line change
@@ -8,6 +8,8 @@
from PyQt5.QtWidgets import QApplication

import urh.cythonext.signal_functions as signal_functions

from urh import settings
from urh.ainterpretation import AutoInterpretation
from urh.signalprocessing.Filter import Filter
from urh.signalprocessing.IQArray import IQArray
@@ -75,7 +77,12 @@ def __init__(self, filename: str, name="Signal", modulation: str = None, sample_
self.__load_complex_file(filename)

self.filename = filename
self.noise_threshold = AutoInterpretation.detect_noise_level(self.iq_array.magnitudes)

default_noise_threshold = settings.read("default_noise_threshold", "automatic")
if default_noise_threshold == "automatic":
self.noise_threshold = AutoInterpretation.detect_noise_level(self.iq_array.magnitudes)
else:
self.noise_threshold = float(default_noise_threshold) / 100 * self.max_magnitude
else:
self.filename = ""

@@ -375,9 +382,12 @@ def save_as(self, filename: str):
QApplication.instance().restoreOverrideCursor()

def quad_demod(self):
return signal_functions.afp_demod(self.iq_array.data, self.noise_threshold,
self.modulation_type, self.modulation_order,
self.costas_loop_bandwidth)
if self.noise_threshold < self.max_magnitude:
return signal_functions.afp_demod(self.iq_array.data, self.noise_threshold,
self.modulation_type, self.modulation_order,
self.costas_loop_bandwidth)
else:
return np.zeros(2, dtype=np.float32)

def calc_relative_noise_threshold_from_range(self, noise_start: int, noise_end: int):
num_digits = 4
35 changes: 33 additions & 2 deletions src/urh/ui/ui_main.py
Original file line number Diff line number Diff line change
@@ -2,7 +2,8 @@

#
#
# 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
@@ -150,7 +151,7 @@ def setupUi(self, MainWindow):
self.verticalLayout_4.setStretch(1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 798, 28))
self.menubar.setGeometry(QtCore.QRect(0, 0, 798, 27))
self.menubar.setObjectName("menubar")
self.menuFile = QtWidgets.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile")
@@ -160,6 +161,8 @@ def setupUi(self, MainWindow):
self.menuImport.setObjectName("menuImport")
self.menuEdit = QtWidgets.QMenu(self.menubar)
self.menuEdit.setObjectName("menuEdit")
self.menuDefault_noise_threshold = QtWidgets.QMenu(self.menuEdit)
self.menuDefault_noise_threshold.setObjectName("menuDefault_noise_threshold")
self.menuHelp = QtWidgets.QMenu(self.menubar)
self.menuHelp.setObjectName("menuHelp")
MainWindow.setMenuBar(self.menubar)
@@ -315,6 +318,22 @@ def setupUi(self, MainWindow):
self.actionAuto_detect_new_signals.setCheckable(True)
self.actionAuto_detect_new_signals.setChecked(True)
self.actionAuto_detect_new_signals.setObjectName("actionAuto_detect_new_signals")
self.actionAutomaticNoiseThreshold = QtWidgets.QAction(MainWindow)
self.actionAutomaticNoiseThreshold.setCheckable(True)
self.actionAutomaticNoiseThreshold.setChecked(True)
self.actionAutomaticNoiseThreshold.setObjectName("actionAutomaticNoiseThreshold")
self.action1NoiseThreshold = QtWidgets.QAction(MainWindow)
self.action1NoiseThreshold.setCheckable(True)
self.action1NoiseThreshold.setObjectName("action1NoiseThreshold")
self.action5NoiseThreshold = QtWidgets.QAction(MainWindow)
self.action5NoiseThreshold.setCheckable(True)
self.action5NoiseThreshold.setObjectName("action5NoiseThreshold")
self.action10NoiseThreshold = QtWidgets.QAction(MainWindow)
self.action10NoiseThreshold.setCheckable(True)
self.action10NoiseThreshold.setObjectName("action10NoiseThreshold")
self.action100NoiseThreshold = QtWidgets.QAction(MainWindow)
self.action100NoiseThreshold.setCheckable(True)
self.action100NoiseThreshold.setObjectName("action100NoiseThreshold")
self.menuImport.addAction(self.actionSamples_from_csv)
self.menuFile.addAction(self.actionNew_Project)
self.menuFile.addAction(self.actionProject_settings)
@@ -333,13 +352,19 @@ def setupUi(self, MainWindow):
self.menuFile.addAction(self.actionCloseAllFiles)
self.menuFile.addSeparator()
self.menuFile.addAction(self.actionConvert_Folder_to_Project)
self.menuDefault_noise_threshold.addAction(self.actionAutomaticNoiseThreshold)
self.menuDefault_noise_threshold.addAction(self.action1NoiseThreshold)
self.menuDefault_noise_threshold.addAction(self.action5NoiseThreshold)
self.menuDefault_noise_threshold.addAction(self.action10NoiseThreshold)
self.menuDefault_noise_threshold.addAction(self.action100NoiseThreshold)
self.menuEdit.addAction(self.actionDecoding)
self.menuEdit.addAction(self.actionOptions)
self.menuEdit.addSeparator()
self.menuEdit.addAction(self.actionShowFileTree)
self.menuEdit.addAction(self.actionFullscreen_mode)
self.menuEdit.addSeparator()
self.menuEdit.addAction(self.actionAuto_detect_new_signals)
self.menuEdit.addAction(self.menuDefault_noise_threshold.menuAction())
self.menuHelp.addAction(self.actionAbout_AutomaticHacker)
self.menuHelp.addAction(self.actionAbout_Qt)
self.menubar.addAction(self.menuFile.menuAction())
@@ -365,6 +390,7 @@ def retranslateUi(self, MainWindow):
self.menuFile.setTitle(_translate("MainWindow", "Fi&le"))
self.menuImport.setTitle(_translate("MainWindow", "Import"))
self.menuEdit.setTitle(_translate("MainWindow", "Edi&t"))
self.menuDefault_noise_threshold.setTitle(_translate("MainWindow", "Default noise threshold"))
self.menuHelp.setTitle(_translate("MainWindow", "Hel&p"))
self.actionFSK.setText(_translate("MainWindow", "Undo"))
self.actionOOK.setText(_translate("MainWindow", "Redo"))
@@ -406,5 +432,10 @@ def retranslateUi(self, MainWindow):
self.actionSamples_from_csv.setText(_translate("MainWindow", "IQ samples from csv"))
self.actionClose_project.setText(_translate("MainWindow", "Close project"))
self.actionAuto_detect_new_signals.setText(_translate("MainWindow", "Auto detect signals on loading"))
self.actionAutomaticNoiseThreshold.setText(_translate("MainWindow", "Automatic"))
self.action1NoiseThreshold.setText(_translate("MainWindow", "1%"))
self.action5NoiseThreshold.setText(_translate("MainWindow", "5%"))
self.action10NoiseThreshold.setText(_translate("MainWindow", "10%"))
self.action100NoiseThreshold.setText(_translate("MainWindow", "100% (disables demodulation)"))
from urh.ui.views.DirectoryTreeView import DirectoryTreeView
from . import urh_rc