This commit is contained in:
RocketGod
2022-09-22 13:46:47 -07:00
parent f65104c2ab
commit e7667c1d93
565 changed files with 165005 additions and 0 deletions

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

View 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_()

View 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()

View 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()

View 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()