Add URH
This commit is contained in:
42
Software/urh/tests/performance/fft.py
Normal file
42
Software/urh/tests/performance/fft.py
Normal file
@ -0,0 +1,42 @@
|
||||
import numpy as np
|
||||
import time
|
||||
|
||||
|
||||
def init_array(size: int):
|
||||
result = np.empty((size, size), dtype=np.complex64)
|
||||
result.real = np.random.rand(size)
|
||||
result.imag = np.random.rand(size)
|
||||
return result
|
||||
|
||||
def numpy_fft(array, window_size:int):
|
||||
np.fft.fft(array, window_size)
|
||||
|
||||
def scipy_fft(array, window_size: int):
|
||||
import scipy.fftpack
|
||||
scipy.fftpack.fft(array, window_size)
|
||||
|
||||
def pyfftw_fft(array):
|
||||
import pyfftw
|
||||
pyfftw.interfaces.cache.enable()
|
||||
fft_a = pyfftw.interfaces.numpy_fft.fft(array, threads=2, overwrite_input=True)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("Size\tIterations\tNumpy\tScipy\tPyFFTW")
|
||||
iterations = 70
|
||||
arr = init_array(1024)
|
||||
numpy_time = time.time()
|
||||
for _ in range(iterations):
|
||||
numpy_fft(arr, 1024)
|
||||
numpy_time = time.time()-numpy_time
|
||||
|
||||
scipy_time = time.time()
|
||||
for _ in range(iterations):
|
||||
scipy_fft(arr, 1024)
|
||||
scipy_time = time.time()-scipy_time
|
||||
|
||||
pyfftw_time = time.time()
|
||||
for _ in range(iterations):
|
||||
pyfftw_fft(arr)
|
||||
pyfftw_time = time.time()-pyfftw_time
|
||||
|
||||
print("{0}\t{1}\t\t\t{2:.4f}\t{3:.4f}\t{4:.4f}".format(1024, iterations, numpy_time, scipy_time, pyfftw_time))
|
75
Software/urh/tests/performance/live_spectrogram.py
Normal file
75
Software/urh/tests/performance/live_spectrogram.py
Normal file
@ -0,0 +1,75 @@
|
||||
import time
|
||||
from multiprocessing import Process, Pipe
|
||||
from multiprocessing.connection import Connection
|
||||
|
||||
import numpy as np
|
||||
from PyQt5.QtGui import QPixmap
|
||||
from PyQt5.QtWidgets import QApplication, QFrame, QVBoxLayout, QGraphicsView, QPushButton, QGraphicsScene, QLabel
|
||||
|
||||
from urh.signalprocessing.Spectrogram import Spectrogram
|
||||
|
||||
|
||||
def generate_data(connection: Connection, num_samples=32768):
|
||||
frequency = 0.1
|
||||
divisor = 200
|
||||
pos = 0
|
||||
while True:
|
||||
result = np.zeros(num_samples, dtype=np.complex64)
|
||||
result.real = np.cos(2 * np.pi * frequency * np.arange(pos, pos + num_samples))
|
||||
result.imag = np.sin(2 * np.pi * frequency * np.arange(pos, pos + num_samples))
|
||||
pos += num_samples
|
||||
if pos / num_samples >= divisor:
|
||||
frequency *= 2
|
||||
if frequency >= 1:
|
||||
frequency = 0.1
|
||||
pos = 0
|
||||
connection.send(result)
|
||||
|
||||
|
||||
def go():
|
||||
global graphic_view, status_label
|
||||
data_parent, data_child = Pipe(duplex=False)
|
||||
receiver = Process(target=generate_data, args=(data_child,))
|
||||
receiver.daemon = True
|
||||
receiver.start()
|
||||
|
||||
scene = QGraphicsScene()
|
||||
graphic_view.setScene(scene)
|
||||
scene.setSceneRect(0, 0, 1024, 1024)
|
||||
|
||||
x_pos = 0
|
||||
y_pos = 0
|
||||
t = time.time()
|
||||
while True:
|
||||
speed = time.time()
|
||||
data = data_parent.recv()
|
||||
spectrogram = Spectrogram(data)
|
||||
pixmap = QPixmap.fromImage(spectrogram.create_spectrogram_image(transpose=True))
|
||||
|
||||
scene.setSceneRect(scene.sceneRect().adjusted(0, 0, 0, pixmap.height()))
|
||||
item = scene.addPixmap(pixmap)
|
||||
item.setPos(x_pos, y_pos)
|
||||
y_pos += pixmap.height()
|
||||
graphic_view.fitInView(scene.sceneRect())
|
||||
status_label.setText("Height: {0:.0f} // Speed: {1:.2f} // Total Time: {2:.2f}".format(scene.sceneRect().height(),
|
||||
1/(time.time()-speed),
|
||||
time.time()-t))
|
||||
QApplication.instance().processEvents()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
global graphic_view, status_label
|
||||
app = QApplication(["spectrum"])
|
||||
widget = QFrame()
|
||||
layout = QVBoxLayout()
|
||||
graphic_view = QGraphicsView()
|
||||
layout.addWidget(graphic_view)
|
||||
status_label = QLabel()
|
||||
layout.addWidget(status_label)
|
||||
btn = QPushButton("Go")
|
||||
layout.addWidget(btn)
|
||||
btn.clicked.connect(go)
|
||||
widget.setLayout(layout)
|
||||
|
||||
widget.showMaximized()
|
||||
app.exec_()
|
53
Software/urh/tests/performance/modulator_performance.py
Normal file
53
Software/urh/tests/performance/modulator_performance.py
Normal file
@ -0,0 +1,53 @@
|
||||
import time
|
||||
|
||||
from urh.signalprocessing.Modulator import Modulator
|
||||
|
||||
|
||||
def test_fsk_performance():
|
||||
bit_data = "10" * 100 + "0000011111" + "001101011" * 100 + "111111100000" * 100
|
||||
modulator = Modulator("Perf")
|
||||
modulator.modulation_type = "FSK"
|
||||
t = time.time()
|
||||
result = modulator.modulate(bit_data, pause=10000000)
|
||||
elapsed = time.time() - t
|
||||
|
||||
result.tofile("/tmp/fsk.complex")
|
||||
print("FSK {}ms".format(elapsed * 1000))
|
||||
|
||||
|
||||
def test_ask_performance():
|
||||
bit_data = "10" * 100 + "0000011111" + "001101011" * 100 + "111111100000" * 1000
|
||||
modulator = Modulator("Perf")
|
||||
modulator.modulation_type = "ASK"
|
||||
t = time.time()
|
||||
result = modulator.modulate(bit_data, pause=10000000)
|
||||
elapsed = time.time() - t
|
||||
|
||||
result.tofile("/tmp/ask.complex")
|
||||
print("ASK {}ms".format(elapsed * 1000))
|
||||
|
||||
|
||||
def test_psk_performance():
|
||||
bit_data = "10" * 100 + "0000011111" + "001101011" * 100 + "111111100000" * 1000
|
||||
modulator = Modulator("Perf")
|
||||
modulator.modulation_type = "PSK"
|
||||
t = time.time()
|
||||
result = modulator.modulate(bit_data, pause=10000000)
|
||||
elapsed = time.time() - t
|
||||
|
||||
result.tofile("/tmp/psk.complex")
|
||||
print("PSK {}ms".format(elapsed * 1000))
|
||||
|
||||
def test_gfsk_performance():
|
||||
bit_data = "10" * 100 + "0000011111" + "001101011" * 100 + "111111100000" * 100
|
||||
modulator = Modulator("Perf")
|
||||
modulator.modulation_type = "GFSK"
|
||||
t = time.time()
|
||||
result = modulator.modulate(bit_data, pause=10000000)
|
||||
elapsed = time.time() - t
|
||||
|
||||
result.tofile("/tmp/gfsk.complex")
|
||||
print("GFSK {}ms".format(elapsed * 1000))
|
||||
|
||||
if __name__ == '__main__':
|
||||
test_fsk_performance()
|
147
Software/urh/tests/performance/simulator_perfomance.py
Normal file
147
Software/urh/tests/performance/simulator_perfomance.py
Normal file
@ -0,0 +1,147 @@
|
||||
import socket
|
||||
import time
|
||||
from multiprocessing import Value, Process
|
||||
|
||||
import numpy as np
|
||||
|
||||
from tests.QtTestCase import QtTestCase
|
||||
from tests.utils_testing import get_path_for_data_file
|
||||
from urh.controller.MainController import MainController
|
||||
from urh.dev.BackendHandler import BackendHandler
|
||||
from urh.dev.EndlessSender import EndlessSender
|
||||
from urh.plugins.NetworkSDRInterface.NetworkSDRInterfacePlugin import NetworkSDRInterfacePlugin
|
||||
from urh.signalprocessing.MessageType import MessageType
|
||||
from urh.signalprocessing.Modulator import Modulator
|
||||
from urh.signalprocessing.Participant import Participant
|
||||
from urh.signalprocessing.ProtocolSniffer import ProtocolSniffer
|
||||
from urh.simulator.Simulator import Simulator
|
||||
from urh.simulator.SimulatorMessage import SimulatorMessage
|
||||
from urh.util import util
|
||||
from urh.util.Logger import logger
|
||||
|
||||
|
||||
def receive(port, current_index, target_index, elapsed):
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
||||
s.bind(("", port))
|
||||
s.listen(1)
|
||||
|
||||
conn, addr = s.accept()
|
||||
logger.debug('Receiver got connection from address:'.format(addr))
|
||||
|
||||
start = False
|
||||
while True:
|
||||
data = conn.recv(65536 * 8)
|
||||
|
||||
if not start:
|
||||
start = True
|
||||
t = time.time()
|
||||
|
||||
if len(data) > 0:
|
||||
while len(data) % 8 != 0:
|
||||
data += conn.recv(len(data) % 8)
|
||||
|
||||
arr = np.frombuffer(data, dtype=np.complex64)
|
||||
current_index.value += len(arr)
|
||||
|
||||
if current_index.value == target_index:
|
||||
break
|
||||
|
||||
conn.close()
|
||||
elapsed.value = 1000 * (time.time() - t)
|
||||
s.close()
|
||||
|
||||
|
||||
class TestSimulatorPerfomance(QtTestCase):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.num_zeros_for_pause = 1000
|
||||
|
||||
def test_performance(self):
|
||||
self.form = MainController()
|
||||
self.cfc = self.form.compare_frame_controller
|
||||
self.stc = self.form.simulator_tab_controller
|
||||
self.gtc = self.form.generator_tab_controller
|
||||
|
||||
self.form.add_signalfile(get_path_for_data_file("esaver.complex16s"))
|
||||
self.sframe = self.form.signal_tab_controller.signal_frames[0]
|
||||
self.sim_frame = self.form.simulator_tab_controller
|
||||
self.form.ui.tabWidget.setCurrentIndex(3)
|
||||
self.cfc.proto_analyzer.auto_assign_labels()
|
||||
|
||||
self.network_sdr_plugin_sender = NetworkSDRInterfacePlugin(raw_mode=True)
|
||||
|
||||
part_a = Participant("Device A", shortname="A", color_index=0)
|
||||
part_b = Participant("Device B", shortname="B", color_index=1)
|
||||
part_b.simulate = True
|
||||
|
||||
self.form.project_manager.participants.append(part_a)
|
||||
self.form.project_manager.participants.append(part_b)
|
||||
self.form.project_manager.project_updated.emit()
|
||||
|
||||
sniffer = ProtocolSniffer(100, 0.01, 0.01, 0.1, 5, "FSK", 1,
|
||||
NetworkSDRInterfacePlugin.NETWORK_SDR_NAME, BackendHandler(),
|
||||
network_raw_mode=True)
|
||||
sender = EndlessSender(BackendHandler(), NetworkSDRInterfacePlugin.NETWORK_SDR_NAME)
|
||||
|
||||
simulator = Simulator(self.stc.simulator_config, self.gtc.modulators, self.stc.sim_expression_parser,
|
||||
self.form.project_manager, sniffer=sniffer, sender=sender)
|
||||
|
||||
pause = 100
|
||||
msg_a = SimulatorMessage(part_b,
|
||||
[1, 0] * 16 + [1, 1, 0, 0] * 8 + [0, 0, 1, 1] * 8 + [1, 0, 1, 1, 1, 0, 0, 1, 1, 1] * 4,
|
||||
pause=pause, message_type=MessageType("empty_message_type"), source=part_a)
|
||||
|
||||
msg_b = SimulatorMessage(part_a,
|
||||
[1, 0] * 16 + [1, 1, 0, 0] * 8 + [1, 1, 0, 0] * 8 + [1, 0, 1, 1, 1, 0, 0, 1, 1, 1] * 4,
|
||||
pause=pause, message_type=MessageType("empty_message_type"), source=part_b)
|
||||
|
||||
self.stc.simulator_config.add_items([msg_a, msg_b], 0, None)
|
||||
self.stc.simulator_config.update_active_participants()
|
||||
|
||||
port = util.get_free_port()
|
||||
sniffer = simulator.sniffer
|
||||
sniffer.rcv_device.set_server_port(port)
|
||||
|
||||
self.network_sdr_plugin_sender.client_port = port
|
||||
|
||||
sender = simulator.sender
|
||||
port = util.get_free_port()
|
||||
sender.device.set_client_port(port)
|
||||
sender.device._VirtualDevice__dev.name = "simulator_sender"
|
||||
|
||||
current_index = Value("L")
|
||||
elapsed = Value("f")
|
||||
target_num_samples = 13600 + pause
|
||||
receive_process = Process(target=receive, args=(port, current_index, target_num_samples, elapsed))
|
||||
receive_process.daemon = True
|
||||
receive_process.start()
|
||||
|
||||
# Ensure receiver is running
|
||||
time.sleep(2)
|
||||
|
||||
# spy = QSignalSpy(self.network_sdr_plugin_receiver.rcv_index_changed)
|
||||
simulator.start()
|
||||
|
||||
modulator = Modulator("test_modulator")
|
||||
modulator.samples_per_symbol = 100
|
||||
modulator.carrier_freq_hz = 55e3
|
||||
|
||||
# yappi.start()
|
||||
|
||||
self.network_sdr_plugin_sender.send_raw_data(modulator.modulate(msg_a.encoded_bits), 1)
|
||||
time.sleep(0.5)
|
||||
# send some zeros to simulate the end of a message
|
||||
self.network_sdr_plugin_sender.send_raw_data(np.zeros(self.num_zeros_for_pause, dtype=np.complex64), 1)
|
||||
time.sleep(0.5)
|
||||
receive_process.join(15)
|
||||
|
||||
logger.info("PROCESS TIME: {0:.2f}ms".format(elapsed.value))
|
||||
|
||||
# self.assertEqual(current_index.value, target_num_samples)
|
||||
self.assertLess(elapsed.value, 200)
|
||||
|
||||
# timeout = spy.wait(2000)
|
||||
# yappi.get_func_stats().print_all()
|
||||
# yappi.get_thread_stats().print_all()
|
68
Software/urh/tests/performance/spectrum_analyzer.py
Normal file
68
Software/urh/tests/performance/spectrum_analyzer.py
Normal file
@ -0,0 +1,68 @@
|
||||
import socket
|
||||
from multiprocessing import Process
|
||||
|
||||
import numpy as np
|
||||
from PyQt5.QtWidgets import QApplication
|
||||
|
||||
from urh import settings
|
||||
from urh.controller.MainController import MainController
|
||||
from urh.controller.dialogs.SpectrumDialogController import SpectrumDialogController
|
||||
from urh.util import util
|
||||
from urh.util.ProjectManager import ProjectManager
|
||||
|
||||
def send_data(port):
|
||||
num_samples = settings.SPECTRUM_BUFFER_SIZE
|
||||
frequency = 0.1
|
||||
divisor = 200
|
||||
pos = 0
|
||||
while True:
|
||||
sock = open_socket(port)
|
||||
result = np.zeros(num_samples, dtype=np.complex64)
|
||||
result.real = np.cos(2 * np.pi * frequency * np.arange(pos, pos + num_samples))
|
||||
result.imag = np.sin(2 * np.pi * frequency * np.arange(pos, pos + num_samples))
|
||||
pos += num_samples
|
||||
if pos / num_samples >= divisor:
|
||||
frequency *= 2
|
||||
if frequency >= 1:
|
||||
frequency = 0.1
|
||||
pos = 0
|
||||
sock.sendall(result.tostring())
|
||||
close_socket(sock)
|
||||
|
||||
|
||||
def open_socket(port):
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
||||
|
||||
sock.connect(("127.0.0.1", port))
|
||||
return sock
|
||||
|
||||
|
||||
def close_socket(sock):
|
||||
sock.shutdown(socket.SHUT_RDWR)
|
||||
sock.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app = QApplication(["test"])
|
||||
main = MainController()
|
||||
port = util.get_free_port()
|
||||
dialog = SpectrumDialogController(ProjectManager(main))
|
||||
dialog.showMaximized()
|
||||
dialog.ui.cbDevice.setCurrentText("Network SDR")
|
||||
dialog.device.set_server_port(port)
|
||||
dialog.ui.btnStart.click()
|
||||
|
||||
p = Process(target=send_data, args=(port,))
|
||||
p.daemon = True
|
||||
p.start()
|
||||
|
||||
num_samples = 32768
|
||||
frequency = 0.1
|
||||
divisor = 200
|
||||
pos = 0
|
||||
app.exec_()
|
||||
p.terminate()
|
||||
p.join()
|
||||
|
Reference in New Issue
Block a user