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