Files
urh/tests/performance/live_spectrogram.py
Johannes Pohl 12389953c6 Enhance Spectrum Analyzer (#365)
* add cython method for abs2

* add arr2decibel method

* add timings

* add fft benchmark

* add live spectrogram test

* add test for spectrum analyzer

* tune thread count

* add spectrogram to spectrum dialog

* integrate waterfall

* fix unittest

* improve grid scene

* draw frequency marker in spectrum analyzer

* clear spectrogram on clear button + remove marker on leave

* eliminate spectrogram graphic view on close

* ensure spectrogram fits in view

* guard resize

* add test for clear button in spectrum dialog
2017-11-26 12:23:59 +01:00

76 lines
2.5 KiB
Python

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