Minor changes on Tempest HDMI simulator

This commit is contained in:
Emilio Martínez 2022-12-23 12:06:19 -03:00
parent 78c352565b
commit 04a2a2532f
10 changed files with 872 additions and 45 deletions

View File

@ -98,7 +98,7 @@ blocks:
start: '0'
step: '1'
stop: int(4096*1.5)
value: '1800'
value: '2600'
widget: counter
states:
bus_sink: false
@ -143,7 +143,7 @@ blocks:
start: '0'
step: '1'
stop: int(2160*1.5)
value: '1000'
value: '1200'
widget: counter
states:
bus_sink: false
@ -176,6 +176,27 @@ blocks:
coordinate: [226, 244]
rotation: 0
state: true
- name: freq_slider
id: variable_qtgui_range
parameters:
comment: ''
gui_hint: tab_m@0
label: Frequency slider
min_len: '200'
orient: Qt.Horizontal
rangeType: float
start: 40e6
step: 1e6
stop: 5e9
value: '206200000'
widget: counter_slider
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [224, 308.0]
rotation: 0
state: enabled
- name: harmonic
id: variable_qtgui_range
parameters:
@ -989,7 +1010,379 @@ blocks:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [240, 438]
coordinate: [248, 636.0]
rotation: 0
state: disabled
- name: uhd_usrp_source_0_0
id: uhd_usrp_source
parameters:
affinity: ''
alias: ''
ant0: ''
ant1: ''
ant10: ''
ant11: ''
ant12: ''
ant13: ''
ant14: ''
ant15: ''
ant16: ''
ant17: ''
ant18: ''
ant19: ''
ant2: ''
ant20: ''
ant21: ''
ant22: ''
ant23: ''
ant24: ''
ant25: ''
ant26: ''
ant27: ''
ant28: ''
ant29: ''
ant3: ''
ant30: ''
ant31: ''
ant4: ''
ant5: ''
ant6: ''
ant7: ''
ant8: ''
ant9: ''
bw0: '0'
bw1: '0'
bw10: '0'
bw11: '0'
bw12: '0'
bw13: '0'
bw14: '0'
bw15: '0'
bw16: '0'
bw17: '0'
bw18: '0'
bw19: '0'
bw2: '0'
bw20: '0'
bw21: '0'
bw22: '0'
bw23: '0'
bw24: '0'
bw25: '0'
bw26: '0'
bw27: '0'
bw28: '0'
bw29: '0'
bw3: '0'
bw30: '0'
bw31: '0'
bw4: '0'
bw5: '0'
bw6: '0'
bw7: '0'
bw8: '0'
bw9: '0'
center_freq0: freq_slider
center_freq1: '0'
center_freq10: '0'
center_freq11: '0'
center_freq12: '0'
center_freq13: '0'
center_freq14: '0'
center_freq15: '0'
center_freq16: '0'
center_freq17: '0'
center_freq18: '0'
center_freq19: '0'
center_freq2: '0'
center_freq20: '0'
center_freq21: '0'
center_freq22: '0'
center_freq23: '0'
center_freq24: '0'
center_freq25: '0'
center_freq26: '0'
center_freq27: '0'
center_freq28: '0'
center_freq29: '0'
center_freq3: '0'
center_freq30: '0'
center_freq31: '0'
center_freq4: '0'
center_freq5: '0'
center_freq6: '0'
center_freq7: '0'
center_freq8: '0'
center_freq9: '0'
clock_rate: '0.0'
clock_source0: ''
clock_source1: ''
clock_source2: ''
clock_source3: ''
clock_source4: ''
clock_source5: ''
clock_source6: ''
clock_source7: ''
comment: ''
dc_offs_enb0: '""'
dc_offs_enb1: '""'
dc_offs_enb10: '""'
dc_offs_enb11: '""'
dc_offs_enb12: '""'
dc_offs_enb13: '""'
dc_offs_enb14: '""'
dc_offs_enb15: '""'
dc_offs_enb16: '""'
dc_offs_enb17: '""'
dc_offs_enb18: '""'
dc_offs_enb19: '""'
dc_offs_enb2: '""'
dc_offs_enb20: '""'
dc_offs_enb21: '""'
dc_offs_enb22: '""'
dc_offs_enb23: '""'
dc_offs_enb24: '""'
dc_offs_enb25: '""'
dc_offs_enb26: '""'
dc_offs_enb27: '""'
dc_offs_enb28: '""'
dc_offs_enb29: '""'
dc_offs_enb3: '""'
dc_offs_enb30: '""'
dc_offs_enb31: '""'
dc_offs_enb4: '""'
dc_offs_enb5: '""'
dc_offs_enb6: '""'
dc_offs_enb7: '""'
dc_offs_enb8: '""'
dc_offs_enb9: '""'
dev_addr: '""'
dev_args: '"recv_frame_size= 65536, num_recv_frames=128"'
gain0: '50'
gain1: '0'
gain10: '0'
gain11: '0'
gain12: '0'
gain13: '0'
gain14: '0'
gain15: '0'
gain16: '0'
gain17: '0'
gain18: '0'
gain19: '0'
gain2: '0'
gain20: '0'
gain21: '0'
gain22: '0'
gain23: '0'
gain24: '0'
gain25: '0'
gain26: '0'
gain27: '0'
gain28: '0'
gain29: '0'
gain3: '0'
gain30: '0'
gain31: '0'
gain4: '0'
gain5: '0'
gain6: '0'
gain7: '0'
gain8: '0'
gain9: '0'
iq_imbal_enb0: '""'
iq_imbal_enb1: '""'
iq_imbal_enb10: '""'
iq_imbal_enb11: '""'
iq_imbal_enb12: '""'
iq_imbal_enb13: '""'
iq_imbal_enb14: '""'
iq_imbal_enb15: '""'
iq_imbal_enb16: '""'
iq_imbal_enb17: '""'
iq_imbal_enb18: '""'
iq_imbal_enb19: '""'
iq_imbal_enb2: '""'
iq_imbal_enb20: '""'
iq_imbal_enb21: '""'
iq_imbal_enb22: '""'
iq_imbal_enb23: '""'
iq_imbal_enb24: '""'
iq_imbal_enb25: '""'
iq_imbal_enb26: '""'
iq_imbal_enb27: '""'
iq_imbal_enb28: '""'
iq_imbal_enb29: '""'
iq_imbal_enb3: '""'
iq_imbal_enb30: '""'
iq_imbal_enb31: '""'
iq_imbal_enb4: '""'
iq_imbal_enb5: '""'
iq_imbal_enb6: '""'
iq_imbal_enb7: '""'
iq_imbal_enb8: '""'
iq_imbal_enb9: '""'
lo_export0: 'False'
lo_export1: 'False'
lo_export10: 'False'
lo_export11: 'False'
lo_export12: 'False'
lo_export13: 'False'
lo_export14: 'False'
lo_export15: 'False'
lo_export16: 'False'
lo_export17: 'False'
lo_export18: 'False'
lo_export19: 'False'
lo_export2: 'False'
lo_export20: 'False'
lo_export21: 'False'
lo_export22: 'False'
lo_export23: 'False'
lo_export24: 'False'
lo_export25: 'False'
lo_export26: 'False'
lo_export27: 'False'
lo_export28: 'False'
lo_export29: 'False'
lo_export3: 'False'
lo_export30: 'False'
lo_export31: 'False'
lo_export4: 'False'
lo_export5: 'False'
lo_export6: 'False'
lo_export7: 'False'
lo_export8: 'False'
lo_export9: 'False'
lo_source0: internal
lo_source1: internal
lo_source10: internal
lo_source11: internal
lo_source12: internal
lo_source13: internal
lo_source14: internal
lo_source15: internal
lo_source16: internal
lo_source17: internal
lo_source18: internal
lo_source19: internal
lo_source2: internal
lo_source20: internal
lo_source21: internal
lo_source22: internal
lo_source23: internal
lo_source24: internal
lo_source25: internal
lo_source26: internal
lo_source27: internal
lo_source28: internal
lo_source29: internal
lo_source3: internal
lo_source30: internal
lo_source31: internal
lo_source4: internal
lo_source5: internal
lo_source6: internal
lo_source7: internal
lo_source8: internal
lo_source9: internal
maxoutbuf: '0'
minoutbuf: '0'
nchan: '1'
norm_gain0: 'False'
norm_gain1: 'False'
norm_gain10: 'False'
norm_gain11: 'False'
norm_gain12: 'False'
norm_gain13: 'False'
norm_gain14: 'False'
norm_gain15: 'False'
norm_gain16: 'False'
norm_gain17: 'False'
norm_gain18: 'False'
norm_gain19: 'False'
norm_gain2: 'False'
norm_gain20: 'False'
norm_gain21: 'False'
norm_gain22: 'False'
norm_gain23: 'False'
norm_gain24: 'False'
norm_gain25: 'False'
norm_gain26: 'False'
norm_gain27: 'False'
norm_gain28: 'False'
norm_gain29: 'False'
norm_gain3: 'False'
norm_gain30: 'False'
norm_gain31: 'False'
norm_gain4: 'False'
norm_gain5: 'False'
norm_gain6: 'False'
norm_gain7: 'False'
norm_gain8: 'False'
norm_gain9: 'False'
num_mboards: '1'
otw: ''
rx_agc0: Default
rx_agc1: Default
rx_agc10: Default
rx_agc11: Default
rx_agc12: Default
rx_agc13: Default
rx_agc14: Default
rx_agc15: Default
rx_agc16: Default
rx_agc17: Default
rx_agc18: Default
rx_agc19: Default
rx_agc2: Default
rx_agc20: Default
rx_agc21: Default
rx_agc22: Default
rx_agc23: Default
rx_agc24: Default
rx_agc25: Default
rx_agc26: Default
rx_agc27: Default
rx_agc28: Default
rx_agc29: Default
rx_agc3: Default
rx_agc30: Default
rx_agc31: Default
rx_agc4: Default
rx_agc5: Default
rx_agc6: Default
rx_agc7: Default
rx_agc8: Default
rx_agc9: Default
samp_rate: samp_rate
sd_spec0: ''
sd_spec1: ''
sd_spec2: ''
sd_spec3: ''
sd_spec4: ''
sd_spec5: ''
sd_spec6: ''
sd_spec7: ''
show_lo_controls: 'False'
start_time: '-1.0'
stream_args: ''
stream_chans: '[]'
sync: sync
time_source0: ''
time_source1: ''
time_source2: ''
time_source3: ''
time_source4: ''
time_source5: ''
time_source6: ''
time_source7: ''
type: fc32
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [256, 452.0]
rotation: 0
state: enabled
- name: video_sdl_sink_0_0_0
@ -1027,9 +1420,11 @@ connections:
- [tempest_fft_peak_fine_sampling_sync_0_0, en, FFT_autocorrelation_0_0, en]
- [tempest_fft_peak_fine_sampling_sync_0_0, en, tempest_sync_detector_0_0, en]
- [tempest_fft_peak_fine_sampling_sync_0_0, rate, uhd_usrp_source_0, command]
- [tempest_fft_peak_fine_sampling_sync_0_0, rate, uhd_usrp_source_0_0, command]
- [tempest_normalize_flow_0, '0', blocks_float_to_short_0, '0']
- [tempest_sync_detector_0_0, '0', blocks_delay_0_0, '0']
- [uhd_usrp_source_0, '0', Keep_1_in_N_Frames_0, '0']
- [uhd_usrp_source_0_0, '0', Keep_1_in_N_Frames_0, '0']
metadata:
file_format: 1

View File

@ -0,0 +1,431 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# SPDX-License-Identifier: GPL-3.0
#
# GNU Radio Python Flow Graph
# Title: Manual Tempest Example
# GNU Radio version: 3.8.5.0
from distutils.version import StrictVersion
if __name__ == '__main__':
import ctypes
import sys
if sys.platform.startswith('linux'):
try:
x11 = ctypes.cdll.LoadLibrary('libX11.so')
x11.XInitThreads()
except:
print("Warning: failed to XInitThreads()")
import os
import sys
sys.path.append(os.environ.get('GRC_HIER_PATH', os.path.expanduser('~/.grc_gnuradio')))
from FFT_autocorrelation import FFT_autocorrelation # grc-generated hier_block
from Keep_1_in_N_Frames import Keep_1_in_N_Frames # grc-generated hier_block
from PyQt5 import Qt
from PyQt5.QtCore import QObject, pyqtSlot
from gnuradio import qtgui
from gnuradio.filter import firdes
import sip
from gnuradio import blocks
from gnuradio import gr
import signal
from argparse import ArgumentParser
from gnuradio.eng_arg import eng_float, intx
from gnuradio import eng_notation
from gnuradio import uhd
import time
from gnuradio import video_sdl
from gnuradio.qtgui import Range, RangeWidget
from math import pi
import tempest
from gnuradio import qtgui
class manual_tempest_example(gr.top_block, Qt.QWidget):
def __init__(self):
gr.top_block.__init__(self, "Manual Tempest Example")
Qt.QWidget.__init__(self)
self.setWindowTitle("Manual Tempest Example")
qtgui.util.check_set_qss()
try:
self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
except:
pass
self.top_scroll_layout = Qt.QVBoxLayout()
self.setLayout(self.top_scroll_layout)
self.top_scroll = Qt.QScrollArea()
self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
self.top_scroll_layout.addWidget(self.top_scroll)
self.top_scroll.setWidgetResizable(True)
self.top_widget = Qt.QWidget()
self.top_scroll.setWidget(self.top_widget)
self.top_layout = Qt.QVBoxLayout(self.top_widget)
self.top_grid_layout = Qt.QGridLayout()
self.top_layout.addLayout(self.top_grid_layout)
self.settings = Qt.QSettings("GNU Radio", "manual_tempest_example")
try:
if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
self.restoreGeometry(self.settings.value("geometry").toByteArray())
else:
self.restoreGeometry(self.settings.value("geometry"))
except:
pass
##################################################
# Variables
##################################################
self.refresh_rate = refresh_rate = 60
self.Vsize = Vsize = 1200
self.Hsize = Hsize = 2600
self.samp_rate = samp_rate = int(50e6)
self.px_rate = px_rate = Hsize*Vsize*refresh_rate
self.Hvisible = Hvisible = 800
self.interpolatedHsize = interpolatedHsize = int(Hsize/float(px_rate)*samp_rate)
self.Vvisible = Vvisible = 600
self.Hblank = Hblank = Hsize-Hvisible
self.inverted = inverted = 1
self.interpolatedHscreen = interpolatedHscreen = int(Hvisible/float(px_rate)*samp_rate)
self.interpolatedHblank = interpolatedHblank = int(Hblank/float(px_rate)*samp_rate)
self.harmonic = harmonic = 1
self.freq_slider = freq_slider = 206200000
self.fft_size = fft_size = 2**21
self.Vblank = Vblank = Vsize-Vvisible
self.DroppedFrames = DroppedFrames = 50
self.DelaySyncDetector = DelaySyncDetector = interpolatedHsize*1
##################################################
# Blocks
##################################################
self.tab_m = Qt.QTabWidget()
self.tab_m_widget_0 = Qt.QWidget()
self.tab_m_layout_0 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.tab_m_widget_0)
self.tab_m_grid_layout_0 = Qt.QGridLayout()
self.tab_m_layout_0.addLayout(self.tab_m_grid_layout_0)
self.tab_m.addTab(self.tab_m_widget_0, 'Tempest Main Tab')
self.tab_m_widget_1 = Qt.QWidget()
self.tab_m_layout_1 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.tab_m_widget_1)
self.tab_m_grid_layout_1 = Qt.QGridLayout()
self.tab_m_layout_1.addLayout(self.tab_m_grid_layout_1)
self.tab_m.addTab(self.tab_m_widget_1, 'Autocorrelation Plot Tab')
self.top_layout.addWidget(self.tab_m)
self._Vsize_range = Range(0, int(2160*1.5), 1, 1200, 200)
self._Vsize_win = RangeWidget(self._Vsize_range, self.set_Vsize, 'Vertical resolution (total)', "counter", int)
self.tab_m_layout_0.addWidget(self._Vsize_win)
self._refresh_rate_range = Range(0, 240, 1, 60, 200)
self._refresh_rate_win = RangeWidget(self._refresh_rate_range, self.set_refresh_rate, 'Refresh Rate (Hz)', "counter", float)
self.tab_m_layout_0.addWidget(self._refresh_rate_win)
# Create the options list
self._inverted_options = [0, 1]
# Create the labels list
self._inverted_labels = ['Yes', 'No']
# Create the combo box
self._inverted_tool_bar = Qt.QToolBar(self)
self._inverted_tool_bar.addWidget(Qt.QLabel('Inverted colors?' + ": "))
self._inverted_combo_box = Qt.QComboBox()
self._inverted_tool_bar.addWidget(self._inverted_combo_box)
for _label in self._inverted_labels: self._inverted_combo_box.addItem(_label)
self._inverted_callback = lambda i: Qt.QMetaObject.invokeMethod(self._inverted_combo_box, "setCurrentIndex", Qt.Q_ARG("int", self._inverted_options.index(i)))
self._inverted_callback(self.inverted)
self._inverted_combo_box.currentIndexChanged.connect(
lambda i: self.set_inverted(self._inverted_options[i]))
# Create the radio buttons
self.tab_m_layout_0.addWidget(self._inverted_tool_bar)
self._freq_slider_range = Range(40e6, 5e9, 1e6, 206200000, 200)
self._freq_slider_win = RangeWidget(self._freq_slider_range, self.set_freq_slider, 'Frequency slider', "counter_slider", float)
self.tab_m_layout_0.addWidget(self._freq_slider_win)
self._DroppedFrames_range = Range(1, 100, 1, 50, 200)
self._DroppedFrames_win = RangeWidget(self._DroppedFrames_range, self.set_DroppedFrames, 'DroppedFrames', "counter_slider", float)
self.tab_m_layout_0.addWidget(self._DroppedFrames_win)
self._DelaySyncDetector_range = Range(0, Vsize*interpolatedHsize, interpolatedHsize*1, interpolatedHsize*1, 200)
self._DelaySyncDetector_win = RangeWidget(self._DelaySyncDetector_range, self.set_DelaySyncDetector, 'DelaySyncDetector', "counter_slider", float)
self.tab_m_layout_0.addWidget(self._DelaySyncDetector_win)
self.video_sdl_sink_0_0_0 = video_sdl.sink_s(0, interpolatedHsize, Vsize, 0, 1920, 1080)
self.uhd_usrp_source_0_0 = uhd.usrp_source(
",".join(("", "recv_frame_size= 65536, num_recv_frames=128")),
uhd.stream_args(
cpu_format="fc32",
args='',
channels=list(range(0,1)),
),
)
self.uhd_usrp_source_0_0.set_center_freq(freq_slider, 0)
self.uhd_usrp_source_0_0.set_gain(50, 0)
self.uhd_usrp_source_0_0.set_samp_rate(samp_rate)
self.uhd_usrp_source_0_0.set_time_unknown_pps(uhd.time_spec())
self.tempest_sync_detector_0_0 = tempest.sync_detector(interpolatedHscreen, Vsize-Vblank, interpolatedHblank, Vblank)
self.tempest_normalize_flow_0 = tempest.normalize_flow(10, 245, interpolatedHsize, 1e-2, 0.1)
self.tempest_fft_peak_fine_sampling_sync_0_0 = tempest.fft_peak_fine_sampling_sync(samp_rate, int(fft_size), refresh_rate, Vsize, interpolatedHsize, True)
self.ratio_finder_toggle_on_and_off = _ratio_finder_toggle_on_and_off_toggle_button = tempest.tempest_msgbtn('Ratio Finder Toggle ON or OFF (FFT peaks)', 'pressed',True,"default","default")
self.ratio_finder_toggle_on_and_off = _ratio_finder_toggle_on_and_off_toggle_button
self.top_layout.addWidget(_ratio_finder_toggle_on_and_off_toggle_button)
self.qtgui_time_sink_x_1 = qtgui.time_sink_f(
int(fft_size/2), #size
samp_rate, #samp_rate
"", #name
1 #number of inputs
)
self.qtgui_time_sink_x_1.set_update_time(2.0)
self.qtgui_time_sink_x_1.set_y_axis(-1, 1)
self.qtgui_time_sink_x_1.set_y_label('Amplitude', "")
self.qtgui_time_sink_x_1.enable_tags(True)
self.qtgui_time_sink_x_1.set_trigger_mode(qtgui.TRIG_MODE_NORM, qtgui.TRIG_SLOPE_POS, 15.0, 0, 0, "peak_1")
self.qtgui_time_sink_x_1.enable_autoscale(False)
self.qtgui_time_sink_x_1.enable_grid(True)
self.qtgui_time_sink_x_1.enable_axis_labels(True)
self.qtgui_time_sink_x_1.enable_control_panel(False)
self.qtgui_time_sink_x_1.enable_stem_plot(False)
labels = ['Signal 1', 'Signal 2', 'Signal 3', 'Signal 4', 'Signal 5',
'Signal 6', 'Signal 7', 'Signal 8', 'Signal 9', 'Signal 10']
widths = [1, 1, 1, 1, 1,
1, 1, 1, 1, 1]
colors = ['blue', 'red', 'green', 'black', 'cyan',
'magenta', 'yellow', 'dark red', 'dark green', 'dark blue']
alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0]
styles = [1, 1, 1, 1, 1,
1, 1, 1, 1, 1]
markers = [-1, -1, -1, -1, -1,
-1, -1, -1, -1, -1]
for i in range(1):
if len(labels[i]) == 0:
self.qtgui_time_sink_x_1.set_line_label(i, "Data {0}".format(i))
else:
self.qtgui_time_sink_x_1.set_line_label(i, labels[i])
self.qtgui_time_sink_x_1.set_line_width(i, widths[i])
self.qtgui_time_sink_x_1.set_line_color(i, colors[i])
self.qtgui_time_sink_x_1.set_line_style(i, styles[i])
self.qtgui_time_sink_x_1.set_line_marker(i, markers[i])
self.qtgui_time_sink_x_1.set_line_alpha(i, alphas[i])
self._qtgui_time_sink_x_1_win = sip.wrapinstance(self.qtgui_time_sink_x_1.pyqwidget(), Qt.QWidget)
self.tab_m_layout_1.addWidget(self._qtgui_time_sink_x_1_win)
self._harmonic_range = Range(1, 10, 1, 1, 200)
self._harmonic_win = RangeWidget(self._harmonic_range, self.set_harmonic, 'Harmonic', "counter_slider", float)
self.tab_m_layout_0.addWidget(self._harmonic_win)
self.blocks_float_to_short_0 = blocks.float_to_short(1, inverted)
self.blocks_delay_0_0 = blocks.delay(gr.sizeof_gr_complex*1, DelaySyncDetector)
self.blocks_complex_to_mag_0 = blocks.complex_to_mag(1)
self.Keep_1_in_N_Frames_0 = Keep_1_in_N_Frames(
fac_decimation=DroppedFrames,
fft_size=interpolatedHsize*Vsize*4,
)
self._Hsize_range = Range(0, int(4096*1.5), 1, 2600, 200)
self._Hsize_win = RangeWidget(self._Hsize_range, self.set_Hsize, 'Horizontal resolution (total)', "counter", int)
self.tab_m_layout_0.addWidget(self._Hsize_win)
self.FFT_autocorrelation_0_0 = FFT_autocorrelation(
alpha=1.0,
fft_size=int(fft_size),
)
##################################################
# Connections
##################################################
self.msg_connect((self.ratio_finder_toggle_on_and_off, 'pressed'), (self.tempest_fft_peak_fine_sampling_sync_0_0, 'en'))
self.msg_connect((self.tempest_fft_peak_fine_sampling_sync_0_0, 'en'), (self.FFT_autocorrelation_0_0, 'en'))
self.msg_connect((self.tempest_fft_peak_fine_sampling_sync_0_0, 'en'), (self.tempest_sync_detector_0_0, 'en'))
self.msg_connect((self.tempest_fft_peak_fine_sampling_sync_0_0, 'rate'), (self.uhd_usrp_source_0_0, 'command'))
self.connect((self.FFT_autocorrelation_0_0, 0), (self.tempest_fft_peak_fine_sampling_sync_0_0, 0))
self.connect((self.Keep_1_in_N_Frames_0, 0), (self.FFT_autocorrelation_0_0, 0))
self.connect((self.Keep_1_in_N_Frames_0, 0), (self.tempest_sync_detector_0_0, 0))
self.connect((self.blocks_complex_to_mag_0, 0), (self.tempest_normalize_flow_0, 0))
self.connect((self.blocks_delay_0_0, 0), (self.blocks_complex_to_mag_0, 0))
self.connect((self.blocks_float_to_short_0, 0), (self.video_sdl_sink_0_0_0, 0))
self.connect((self.tempest_fft_peak_fine_sampling_sync_0_0, 0), (self.qtgui_time_sink_x_1, 0))
self.connect((self.tempest_normalize_flow_0, 0), (self.blocks_float_to_short_0, 0))
self.connect((self.tempest_sync_detector_0_0, 0), (self.blocks_delay_0_0, 0))
self.connect((self.uhd_usrp_source_0_0, 0), (self.Keep_1_in_N_Frames_0, 0))
def closeEvent(self, event):
self.settings = Qt.QSettings("GNU Radio", "manual_tempest_example")
self.settings.setValue("geometry", self.saveGeometry())
event.accept()
def get_refresh_rate(self):
return self.refresh_rate
def set_refresh_rate(self, refresh_rate):
self.refresh_rate = refresh_rate
self.set_px_rate(self.Hsize*self.Vsize*self.refresh_rate)
def get_Vsize(self):
return self.Vsize
def set_Vsize(self, Vsize):
self.Vsize = Vsize
self.set_Vblank(self.Vsize-self.Vvisible)
self.set_px_rate(self.Hsize*self.Vsize*self.refresh_rate)
self.Keep_1_in_N_Frames_0.set_fft_size(self.interpolatedHsize*self.Vsize*4)
def get_Hsize(self):
return self.Hsize
def set_Hsize(self, Hsize):
self.Hsize = Hsize
self.set_Hblank(self.Hsize-self.Hvisible)
self.set_interpolatedHsize(int(self.Hsize/float(self.px_rate)*self.samp_rate))
self.set_px_rate(self.Hsize*self.Vsize*self.refresh_rate)
def get_samp_rate(self):
return self.samp_rate
def set_samp_rate(self, samp_rate):
self.samp_rate = samp_rate
self.set_interpolatedHblank(int(self.Hblank/float(self.px_rate)*self.samp_rate))
self.set_interpolatedHscreen(int(self.Hvisible/float(self.px_rate)*self.samp_rate))
self.set_interpolatedHsize(int(self.Hsize/float(self.px_rate)*self.samp_rate))
self.qtgui_time_sink_x_1.set_samp_rate(self.samp_rate)
self.uhd_usrp_source_0_0.set_samp_rate(self.samp_rate)
def get_px_rate(self):
return self.px_rate
def set_px_rate(self, px_rate):
self.px_rate = px_rate
self.set_interpolatedHblank(int(self.Hblank/float(self.px_rate)*self.samp_rate))
self.set_interpolatedHscreen(int(self.Hvisible/float(self.px_rate)*self.samp_rate))
self.set_interpolatedHsize(int(self.Hsize/float(self.px_rate)*self.samp_rate))
def get_Hvisible(self):
return self.Hvisible
def set_Hvisible(self, Hvisible):
self.Hvisible = Hvisible
self.set_Hblank(self.Hsize-self.Hvisible)
self.set_interpolatedHscreen(int(self.Hvisible/float(self.px_rate)*self.samp_rate))
def get_interpolatedHsize(self):
return self.interpolatedHsize
def set_interpolatedHsize(self, interpolatedHsize):
self.interpolatedHsize = interpolatedHsize
self.set_DelaySyncDetector(self.interpolatedHsize*1)
self.Keep_1_in_N_Frames_0.set_fft_size(self.interpolatedHsize*self.Vsize*4)
def get_Vvisible(self):
return self.Vvisible
def set_Vvisible(self, Vvisible):
self.Vvisible = Vvisible
self.set_Vblank(self.Vsize-self.Vvisible)
def get_Hblank(self):
return self.Hblank
def set_Hblank(self, Hblank):
self.Hblank = Hblank
self.set_interpolatedHblank(int(self.Hblank/float(self.px_rate)*self.samp_rate))
def get_inverted(self):
return self.inverted
def set_inverted(self, inverted):
self.inverted = inverted
self._inverted_callback(self.inverted)
self.blocks_float_to_short_0.set_scale(self.inverted)
def get_interpolatedHscreen(self):
return self.interpolatedHscreen
def set_interpolatedHscreen(self, interpolatedHscreen):
self.interpolatedHscreen = interpolatedHscreen
def get_interpolatedHblank(self):
return self.interpolatedHblank
def set_interpolatedHblank(self, interpolatedHblank):
self.interpolatedHblank = interpolatedHblank
def get_harmonic(self):
return self.harmonic
def set_harmonic(self, harmonic):
self.harmonic = harmonic
def get_freq_slider(self):
return self.freq_slider
def set_freq_slider(self, freq_slider):
self.freq_slider = freq_slider
self.uhd_usrp_source_0_0.set_center_freq(self.freq_slider, 0)
def get_fft_size(self):
return self.fft_size
def set_fft_size(self, fft_size):
self.fft_size = fft_size
self.FFT_autocorrelation_0_0.set_fft_size(int(self.fft_size))
def get_Vblank(self):
return self.Vblank
def set_Vblank(self, Vblank):
self.Vblank = Vblank
def get_DroppedFrames(self):
return self.DroppedFrames
def set_DroppedFrames(self, DroppedFrames):
self.DroppedFrames = DroppedFrames
self.Keep_1_in_N_Frames_0.set_fac_decimation(self.DroppedFrames)
def get_DelaySyncDetector(self):
return self.DelaySyncDetector
def set_DelaySyncDetector(self, DelaySyncDetector):
self.DelaySyncDetector = DelaySyncDetector
self.blocks_delay_0_0.set_dly(self.DelaySyncDetector)
def main(top_block_cls=manual_tempest_example, options=None):
if gr.enable_realtime_scheduling() != gr.RT_OK:
print("Error: failed to enable real-time scheduling.")
if StrictVersion("4.5.0") <= StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
style = gr.prefs().get_string('qtgui', 'style', 'raster')
Qt.QApplication.setGraphicsSystem(style)
qapp = Qt.QApplication(sys.argv)
tb = top_block_cls()
tb.start()
tb.show()
def sig_handler(sig=None, frame=None):
Qt.QApplication.quit()
signal.signal(signal.SIGINT, sig_handler)
signal.signal(signal.SIGTERM, sig_handler)
timer = Qt.QTimer()
timer.start(500)
timer.timeout.connect(lambda: None)
def quitting():
tb.stop()
tb.wait()
qapp.aboutToQuit.connect(quitting)
qapp.exec_()
if __name__ == '__main__':
main()

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

BIN
images/test.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 399 KiB

After

Width:  |  Height:  |  Size: 969 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

File diff suppressed because one or more lines are too long

View File

@ -20,7 +20,8 @@ from DTutils import TMDS_encoding, TMDS_serial
#%%
# Cargar imagen prueba
I=imread('../images/VAMO!!.png')
# I=imread('../images/VAMO!!.png')
I=imread('../images/test.jpeg')
# I=imread('../images/black_cube_800x600.jpg')
# I=imread('../images/1920x1080_test.png')
# I=imread('../images/1920x1080_test2.png')
@ -61,7 +62,7 @@ bit_rate = 10*px_rate
t_continuous = np.arange(len(I_TMDS_Tx))/bit_rate
# Armónico elegido para centrar el espectro
N_harm = 1
N_harm = 3
harm = N_harm*px_rate
# Llevada a bandabase
@ -83,8 +84,8 @@ plt.imshow(np.abs(I_reconst_px), cmap='gray')
plt.show()
#%%
I_reconst_px_norm = I_reconst_px - np.min(I_reconst_px)
I_reconst_px_norm = np.abs(I_reconst_px)
I_reconst_px_norm = I_reconst_px_norm - np.min(I_reconst_px_norm)
I_reconst_px_norm = 255*I_reconst_px_norm/np.max(I_reconst_px_norm)
im = Image.fromarray(I_reconst_px_norm.astype('uint8'))