Minor changes on Tempest HDMI simulator
This commit is contained in:
parent
78c352565b
commit
04a2a2532f
|
@ -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
|
||||
|
|
|
@ -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 |
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
|
@ -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'))
|
||||
|
|
Loading…
Reference in New Issue