diff options
-rw-r--r-- | doc/thesis/chapters/theory.tex | 4 | ||||
-rwxr-xr-x | tests/Simulation/AM&DSB_SC/AM_Resiver.py | 374 | ||||
-rw-r--r-- | tests/Simulation/AM&DSB_SC/AM_Resiver_Transmitter.grc | 681 | ||||
-rw-r--r-- | tests/Simulation/AM&DSB_SC/AM_Resiver_Transmitter.pdf | bin | 0 -> 25218 bytes | |||
-rw-r--r-- | tests/Simulation/AM&DSB_SC/SSB_Resiver_Transmitter.grc | 890 | ||||
-rwxr-xr-x | tests/Simulation/AM&DSB_SC/Simulation.py | 439 | ||||
-rw-r--r-- | tests/Simulation/AM/AM.grc | 2 | ||||
-rwxr-xr-x | tests/Simulation/AM/Simluation.py | 236 |
8 files changed, 2623 insertions, 3 deletions
diff --git a/doc/thesis/chapters/theory.tex b/doc/thesis/chapters/theory.tex index de1524d..67938f1 100644 --- a/doc/thesis/chapters/theory.tex +++ b/doc/thesis/chapters/theory.tex @@ -13,14 +13,14 @@ \subsection{Continuous time model} -Continuous time small scale fading channel response. +Continuous time small scale fading channel response. \cite{Alimohammad2009} time varying channel impulse response: \begin{equation} h(t, \tau) = \sum_k c_k (t) \delta(\tau - \tau_k(t)) \end{equation} -received signal \(y = h * x\), i.e. convolution with channel model. +received signal \(y = h * x\), i.e. convolution with channel model. \subsection{Time discretization of the model} diff --git a/tests/Simulation/AM&DSB_SC/AM_Resiver.py b/tests/Simulation/AM&DSB_SC/AM_Resiver.py new file mode 100755 index 0000000..e25d7de --- /dev/null +++ b/tests/Simulation/AM&DSB_SC/AM_Resiver.py @@ -0,0 +1,374 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# +# SPDX-License-Identifier: GPL-3.0 +# +# GNU Radio Python Flow Graph +# Title: AM resiver +# GNU Radio version: 3.8.2.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()") + +from PyQt5 import Qt +from gnuradio import qtgui +from gnuradio.filter import firdes +import sip +from gnuradio import analog +from gnuradio import blocks +from gnuradio import filter +from gnuradio import gr +import sys +import signal +from argparse import ArgumentParser +from gnuradio.eng_arg import eng_float, intx +from gnuradio import eng_notation + +from gnuradio import qtgui + +class AM_Resiver(gr.top_block, Qt.QWidget): + + def __init__(self): + gr.top_block.__init__(self, "AM resiver") + Qt.QWidget.__init__(self) + self.setWindowTitle("AM resiver") + 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", "AM_Resiver") + + 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.samp_rate = samp_rate = 768000 + self.decim = decim = 16 + + ################################################## + # Blocks + ################################################## + self.qtgui_time_sink_x_0_0_0_0 = qtgui.time_sink_f( + 256, #size + samp_rate, #samp_rate + "Demodulated", #name + 1 #number of inputs + ) + self.qtgui_time_sink_x_0_0_0_0.set_update_time(0.10) + self.qtgui_time_sink_x_0_0_0_0.set_y_axis(-1, 1) + + self.qtgui_time_sink_x_0_0_0_0.set_y_label('Amplitude', "") + + self.qtgui_time_sink_x_0_0_0_0.enable_tags(True) + self.qtgui_time_sink_x_0_0_0_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") + self.qtgui_time_sink_x_0_0_0_0.enable_autoscale(False) + self.qtgui_time_sink_x_0_0_0_0.enable_grid(False) + self.qtgui_time_sink_x_0_0_0_0.enable_axis_labels(True) + self.qtgui_time_sink_x_0_0_0_0.enable_control_panel(False) + self.qtgui_time_sink_x_0_0_0_0.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_0_0_0_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_time_sink_x_0_0_0_0.set_line_label(i, labels[i]) + self.qtgui_time_sink_x_0_0_0_0.set_line_width(i, widths[i]) + self.qtgui_time_sink_x_0_0_0_0.set_line_color(i, colors[i]) + self.qtgui_time_sink_x_0_0_0_0.set_line_style(i, styles[i]) + self.qtgui_time_sink_x_0_0_0_0.set_line_marker(i, markers[i]) + self.qtgui_time_sink_x_0_0_0_0.set_line_alpha(i, alphas[i]) + + self._qtgui_time_sink_x_0_0_0_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0_0_0_0.pyqwidget(), Qt.QWidget) + self.top_grid_layout.addWidget(self._qtgui_time_sink_x_0_0_0_0_win) + self.qtgui_time_sink_x_0_0_0 = qtgui.time_sink_f( + 256, #size + samp_rate, #samp_rate + "Demodulated nach Band Pass", #name + 1 #number of inputs + ) + self.qtgui_time_sink_x_0_0_0.set_update_time(0.10) + self.qtgui_time_sink_x_0_0_0.set_y_axis(-1, 1) + + self.qtgui_time_sink_x_0_0_0.set_y_label('Amplitude', "") + + self.qtgui_time_sink_x_0_0_0.enable_tags(True) + self.qtgui_time_sink_x_0_0_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") + self.qtgui_time_sink_x_0_0_0.enable_autoscale(False) + self.qtgui_time_sink_x_0_0_0.enable_grid(False) + self.qtgui_time_sink_x_0_0_0.enable_axis_labels(True) + self.qtgui_time_sink_x_0_0_0.enable_control_panel(False) + self.qtgui_time_sink_x_0_0_0.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_0_0_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_time_sink_x_0_0_0.set_line_label(i, labels[i]) + self.qtgui_time_sink_x_0_0_0.set_line_width(i, widths[i]) + self.qtgui_time_sink_x_0_0_0.set_line_color(i, colors[i]) + self.qtgui_time_sink_x_0_0_0.set_line_style(i, styles[i]) + self.qtgui_time_sink_x_0_0_0.set_line_marker(i, markers[i]) + self.qtgui_time_sink_x_0_0_0.set_line_alpha(i, alphas[i]) + + self._qtgui_time_sink_x_0_0_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0_0_0.pyqwidget(), Qt.QWidget) + self.top_grid_layout.addWidget(self._qtgui_time_sink_x_0_0_0_win) + self.qtgui_time_sink_x_0_0 = qtgui.time_sink_f( + 1024, #size + samp_rate, #samp_rate + "Modulated", #name + 1 #number of inputs + ) + self.qtgui_time_sink_x_0_0.set_update_time(0.10) + self.qtgui_time_sink_x_0_0.set_y_axis(-1, 1) + + self.qtgui_time_sink_x_0_0.set_y_label('Amplitude', "") + + self.qtgui_time_sink_x_0_0.enable_tags(True) + self.qtgui_time_sink_x_0_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") + self.qtgui_time_sink_x_0_0.enable_autoscale(False) + self.qtgui_time_sink_x_0_0.enable_grid(False) + self.qtgui_time_sink_x_0_0.enable_axis_labels(True) + self.qtgui_time_sink_x_0_0.enable_control_panel(False) + self.qtgui_time_sink_x_0_0.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_0_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_time_sink_x_0_0.set_line_label(i, labels[i]) + self.qtgui_time_sink_x_0_0.set_line_width(i, widths[i]) + self.qtgui_time_sink_x_0_0.set_line_color(i, colors[i]) + self.qtgui_time_sink_x_0_0.set_line_style(i, styles[i]) + self.qtgui_time_sink_x_0_0.set_line_marker(i, markers[i]) + self.qtgui_time_sink_x_0_0.set_line_alpha(i, alphas[i]) + + self._qtgui_time_sink_x_0_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0_0.pyqwidget(), Qt.QWidget) + self.top_grid_layout.addWidget(self._qtgui_time_sink_x_0_0_win) + self.qtgui_time_sink_x_0 = qtgui.time_sink_f( + 1024, #size + samp_rate, #samp_rate + "Source", #name + 1 #number of inputs + ) + self.qtgui_time_sink_x_0.set_update_time(0.10) + self.qtgui_time_sink_x_0.set_y_axis(-1, 1) + + self.qtgui_time_sink_x_0.set_y_label('Amplitude', "") + + self.qtgui_time_sink_x_0.enable_tags(True) + self.qtgui_time_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") + self.qtgui_time_sink_x_0.enable_autoscale(True) + self.qtgui_time_sink_x_0.enable_grid(True) + self.qtgui_time_sink_x_0.enable_axis_labels(True) + self.qtgui_time_sink_x_0.enable_control_panel(False) + self.qtgui_time_sink_x_0.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_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_time_sink_x_0.set_line_label(i, labels[i]) + self.qtgui_time_sink_x_0.set_line_width(i, widths[i]) + self.qtgui_time_sink_x_0.set_line_color(i, colors[i]) + self.qtgui_time_sink_x_0.set_line_style(i, styles[i]) + self.qtgui_time_sink_x_0.set_line_marker(i, markers[i]) + self.qtgui_time_sink_x_0.set_line_alpha(i, alphas[i]) + + self._qtgui_time_sink_x_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0.pyqwidget(), Qt.QWidget) + self.top_grid_layout.addWidget(self._qtgui_time_sink_x_0_win) + self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_fcf(decim, firdes.low_pass(1,samp_rate,samp_rate/(2*decim), 2000), 48e3, samp_rate) + self.blocks_throttle_0 = blocks.throttle(gr.sizeof_float*1, samp_rate,True) + self.blocks_repeat_1 = blocks.repeat(gr.sizeof_float*1, 16) + self.blocks_multiply_xx_0 = blocks.multiply_vff(1) + self.blocks_multiply_const_vxx_0 = blocks.multiply_const_ff(0.8) + self.blocks_complex_to_mag_0 = blocks.complex_to_mag(1) + self.blocks_add_const_vxx_0 = blocks.add_const_ff(1) + self.band_pass_filter_0 = filter.fir_filter_fff( + 1, + firdes.band_pass( + 1, + samp_rate, + 500, + 60000, + 400, + firdes.WIN_HAMMING, + 6.76)) + self.analog_sig_source_x_0_0 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 48000, 1, 0, 0) + self.analog_sig_source_x_0 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 48e3, 500e-3, 0, 0) + self.analog_agc_xx_0 = analog.agc_cc(625e-6, 1.0, 1.0) + self.analog_agc_xx_0.set_max_gain(65536) + + + + ################################################## + # Connections + ################################################## + self.connect((self.analog_agc_xx_0, 0), (self.blocks_complex_to_mag_0, 0)) + self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_xx_0, 1)) + self.connect((self.analog_sig_source_x_0_0, 0), (self.blocks_repeat_1, 0)) + self.connect((self.analog_sig_source_x_0_0, 0), (self.qtgui_time_sink_x_0, 0)) + self.connect((self.band_pass_filter_0, 0), (self.qtgui_time_sink_x_0_0_0, 0)) + self.connect((self.blocks_add_const_vxx_0, 0), (self.blocks_multiply_xx_0, 0)) + self.connect((self.blocks_complex_to_mag_0, 0), (self.band_pass_filter_0, 0)) + self.connect((self.blocks_complex_to_mag_0, 0), (self.qtgui_time_sink_x_0_0_0_0, 0)) + self.connect((self.blocks_multiply_const_vxx_0, 0), (self.blocks_add_const_vxx_0, 0)) + self.connect((self.blocks_multiply_xx_0, 0), (self.blocks_throttle_0, 0)) + self.connect((self.blocks_repeat_1, 0), (self.blocks_multiply_const_vxx_0, 0)) + self.connect((self.blocks_throttle_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) + self.connect((self.blocks_throttle_0, 0), (self.qtgui_time_sink_x_0_0, 0)) + self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.analog_agc_xx_0, 0)) + + + def closeEvent(self, event): + self.settings = Qt.QSettings("GNU Radio", "AM_Resiver") + self.settings.setValue("geometry", self.saveGeometry()) + event.accept() + + def get_samp_rate(self): + return self.samp_rate + + def set_samp_rate(self, samp_rate): + self.samp_rate = samp_rate + self.analog_sig_source_x_0.set_sampling_freq(self.samp_rate) + self.analog_sig_source_x_0_0.set_sampling_freq(self.samp_rate) + self.band_pass_filter_0.set_taps(firdes.band_pass(1, self.samp_rate, 500, 60000, 400, firdes.WIN_HAMMING, 6.76)) + self.blocks_throttle_0.set_sample_rate(self.samp_rate) + self.freq_xlating_fir_filter_xxx_0.set_taps(firdes.low_pass(1,self.samp_rate,self.samp_rate/(2*self.decim), 2000)) + self.qtgui_time_sink_x_0.set_samp_rate(self.samp_rate) + self.qtgui_time_sink_x_0_0.set_samp_rate(self.samp_rate) + self.qtgui_time_sink_x_0_0_0.set_samp_rate(self.samp_rate) + self.qtgui_time_sink_x_0_0_0_0.set_samp_rate(self.samp_rate) + + def get_decim(self): + return self.decim + + def set_decim(self, decim): + self.decim = decim + self.freq_xlating_fir_filter_xxx_0.set_taps(firdes.low_pass(1,self.samp_rate,self.samp_rate/(2*self.decim), 2000)) + + + + + +def main(top_block_cls=AM_Resiver, options=None): + + 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() diff --git a/tests/Simulation/AM&DSB_SC/AM_Resiver_Transmitter.grc b/tests/Simulation/AM&DSB_SC/AM_Resiver_Transmitter.grc new file mode 100644 index 0000000..b038a2e --- /dev/null +++ b/tests/Simulation/AM&DSB_SC/AM_Resiver_Transmitter.grc @@ -0,0 +1,681 @@ +options: + parameters: + author: '' + category: '[GRC Hier Blocks]' + cmake_opt: '' + comment: '' + copyright: '' + description: '' + gen_cmake: 'On' + gen_linking: dynamic + generate_options: qt_gui + hier_block_src_path: '.:' + id: AM_Resiver + max_nouts: '0' + output_language: python + placement: (0,0) + qt_qss_theme: '' + realtime_scheduling: '' + run: 'True' + run_command: '{python} -u {filename}' + run_options: prompt + sizing_mode: fixed + thread_safe_setters: '' + title: AM resiver + window_size: '' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [8, 8] + rotation: 0 + state: enabled + +blocks: +- name: decim + id: variable + parameters: + comment: '' + value: '16' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [272, 12.0] + rotation: 0 + state: true +- name: samp_rate + id: variable + parameters: + comment: '' + value: '768000' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [184, 12] + rotation: 0 + state: enabled +- name: analog_agc_xx_0 + id: analog_agc_xx + parameters: + affinity: '' + alias: '' + comment: '' + gain: '1.0' + max_gain: '65536' + maxoutbuf: '0' + minoutbuf: '0' + rate: 625e-6 + reference: '1.0' + type: complex + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1400, 276.0] + rotation: 0 + state: true +- name: analog_sig_source_x_0 + id: analog_sig_source_x + parameters: + affinity: '' + alias: '' + amp: 500e-3 + comment: '' + freq: 48e3 + maxoutbuf: '0' + minoutbuf: '0' + offset: '0' + phase: '0' + samp_rate: samp_rate + type: float + waveform: analog.GR_COS_WAVE + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [488, 332.0] + rotation: 0 + state: true +- name: analog_sig_source_x_0_0 + id: analog_sig_source_x + parameters: + affinity: '' + alias: '' + amp: '1' + comment: '' + freq: '48000' + maxoutbuf: '0' + minoutbuf: '0' + offset: '0' + phase: '0' + samp_rate: samp_rate + type: float + waveform: analog.GR_COS_WAVE + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [16, 228.0] + rotation: 0 + state: true +- name: band_pass_filter_0 + id: band_pass_filter + parameters: + affinity: '' + alias: '' + beta: '6.76' + comment: '' + decim: '1' + gain: '1' + high_cutoff_freq: '60000' + interp: '1' + low_cutoff_freq: '500' + maxoutbuf: '0' + minoutbuf: '0' + samp_rate: samp_rate + type: fir_filter_fff + width: '400' + win: firdes.WIN_HAMMING + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1792, 244.0] + rotation: 0 + state: true +- name: blocks_add_const_vxx_0 + id: blocks_add_const_vxx + parameters: + affinity: '' + alias: '' + comment: '' + const: '1' + maxoutbuf: '0' + minoutbuf: '0' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [600, 268.0] + rotation: 0 + state: true +- name: blocks_complex_to_mag_0 + id: blocks_complex_to_mag + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1584, 304.0] + rotation: 0 + state: true +- name: blocks_multiply_const_vxx_0 + id: blocks_multiply_const_vxx + parameters: + affinity: '' + alias: '' + comment: '' + const: '0.8' + maxoutbuf: '0' + minoutbuf: '0' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [400, 268.0] + rotation: 0 + state: true +- name: blocks_multiply_xx_0 + id: blocks_multiply_xx + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + num_inputs: '2' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [752, 272.0] + rotation: 0 + state: true +- name: blocks_repeat_1 + id: blocks_repeat + parameters: + affinity: '' + alias: '' + comment: '' + interp: '16' + maxoutbuf: '0' + minoutbuf: '0' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [240, 268.0] + rotation: 0 + state: true +- name: blocks_throttle_0 + id: blocks_throttle + parameters: + affinity: '' + alias: '' + comment: '' + ignoretag: 'True' + maxoutbuf: '0' + minoutbuf: '0' + samples_per_second: samp_rate + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [896, 284.0] + rotation: 0 + state: true +- name: freq_xlating_fir_filter_xxx_0 + id: freq_xlating_fir_filter_xxx + parameters: + affinity: '' + alias: '' + center_freq: 48e3 + comment: '' + decim: decim + maxoutbuf: '0' + minoutbuf: '0' + samp_rate: samp_rate + taps: firdes.low_pass(1,samp_rate,samp_rate/(2*decim), 2000) + type: fcf + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1136, 276.0] + rotation: 0 + state: true +- name: qtgui_time_sink_x_0 + id: qtgui_time_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'True' + axislabels: 'True' + color1: blue + color10: dark blue + color2: red + color3: green + color4: black + color5: cyan + color6: magenta + color7: yellow + color8: dark red + color9: dark green + comment: '' + ctrlpanel: 'False' + entags: 'True' + grid: 'True' + gui_hint: '' + label1: Signal 1 + label10: Signal 10 + label2: Signal 2 + label3: Signal 3 + label4: Signal 4 + label5: Signal 5 + label6: Signal 6 + label7: Signal 7 + label8: Signal 8 + label9: Signal 9 + legend: 'True' + marker1: '-1' + marker10: '-1' + marker2: '-1' + marker3: '-1' + marker4: '-1' + marker5: '-1' + marker6: '-1' + marker7: '-1' + marker8: '-1' + marker9: '-1' + name: '"Source"' + nconnections: '1' + size: '1024' + srate: samp_rate + stemplot: 'False' + style1: '1' + style10: '1' + style2: '1' + style3: '1' + style4: '1' + style5: '1' + style6: '1' + style7: '1' + style8: '1' + style9: '1' + tr_chan: '0' + tr_delay: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_slope: qtgui.TRIG_SLOPE_POS + tr_tag: '""' + type: float + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + ylabel: Amplitude + ymax: '1' + ymin: '-1' + yunit: '""' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [240, 108.0] + rotation: 0 + state: true +- name: qtgui_time_sink_x_0_0 + id: qtgui_time_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'False' + axislabels: 'True' + color1: blue + color10: dark blue + color2: red + color3: green + color4: black + color5: cyan + color6: magenta + color7: yellow + color8: dark red + color9: dark green + comment: '' + ctrlpanel: 'False' + entags: 'True' + grid: 'False' + gui_hint: '' + label1: Signal 1 + label10: Signal 10 + label2: Signal 2 + label3: Signal 3 + label4: Signal 4 + label5: Signal 5 + label6: Signal 6 + label7: Signal 7 + label8: Signal 8 + label9: Signal 9 + legend: 'True' + marker1: '-1' + marker10: '-1' + marker2: '-1' + marker3: '-1' + marker4: '-1' + marker5: '-1' + marker6: '-1' + marker7: '-1' + marker8: '-1' + marker9: '-1' + name: '"Modulated"' + nconnections: '1' + size: '1024' + srate: samp_rate + stemplot: 'False' + style1: '1' + style10: '1' + style2: '1' + style3: '1' + style4: '1' + style5: '1' + style6: '1' + style7: '1' + style8: '1' + style9: '1' + tr_chan: '0' + tr_delay: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_slope: qtgui.TRIG_SLOPE_POS + tr_tag: '""' + type: float + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + ylabel: Amplitude + ymax: '1' + ymin: '-1' + yunit: '""' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1088, 156.0] + rotation: 0 + state: true +- name: qtgui_time_sink_x_0_0_0 + id: qtgui_time_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'False' + axislabels: 'True' + color1: blue + color10: dark blue + color2: red + color3: green + color4: black + color5: cyan + color6: magenta + color7: yellow + color8: dark red + color9: dark green + comment: '' + ctrlpanel: 'False' + entags: 'True' + grid: 'False' + gui_hint: '' + label1: Signal 1 + label10: Signal 10 + label2: Signal 2 + label3: Signal 3 + label4: Signal 4 + label5: Signal 5 + label6: Signal 6 + label7: Signal 7 + label8: Signal 8 + label9: Signal 9 + legend: 'True' + marker1: '-1' + marker10: '-1' + marker2: '-1' + marker3: '-1' + marker4: '-1' + marker5: '-1' + marker6: '-1' + marker7: '-1' + marker8: '-1' + marker9: '-1' + name: '"Demodulated nach Band Pass"' + nconnections: '1' + size: '256' + srate: samp_rate + stemplot: 'False' + style1: '1' + style10: '1' + style2: '1' + style3: '1' + style4: '1' + style5: '1' + style6: '1' + style7: '1' + style8: '1' + style9: '1' + tr_chan: '0' + tr_delay: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_slope: qtgui.TRIG_SLOPE_POS + tr_tag: '""' + type: float + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + ylabel: Amplitude + ymax: '1' + ymin: '-1' + yunit: '""' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [2000, 276.0] + rotation: 0 + state: true +- name: qtgui_time_sink_x_0_0_0_0 + id: qtgui_time_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'False' + axislabels: 'True' + color1: blue + color10: dark blue + color2: red + color3: green + color4: black + color5: cyan + color6: magenta + color7: yellow + color8: dark red + color9: dark green + comment: '' + ctrlpanel: 'False' + entags: 'True' + grid: 'False' + gui_hint: '' + label1: Signal 1 + label10: Signal 10 + label2: Signal 2 + label3: Signal 3 + label4: Signal 4 + label5: Signal 5 + label6: Signal 6 + label7: Signal 7 + label8: Signal 8 + label9: Signal 9 + legend: 'True' + marker1: '-1' + marker10: '-1' + marker2: '-1' + marker3: '-1' + marker4: '-1' + marker5: '-1' + marker6: '-1' + marker7: '-1' + marker8: '-1' + marker9: '-1' + name: '"Demodulated"' + nconnections: '1' + size: '256' + srate: samp_rate + stemplot: 'False' + style1: '1' + style10: '1' + style2: '1' + style3: '1' + style4: '1' + style5: '1' + style6: '1' + style7: '1' + style8: '1' + style9: '1' + tr_chan: '0' + tr_delay: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_slope: qtgui.TRIG_SLOPE_POS + tr_tag: '""' + type: float + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + ylabel: Amplitude + ymax: '1' + ymin: '-1' + yunit: '""' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1800, 460.0] + rotation: 0 + state: true + +connections: +- [analog_agc_xx_0, '0', blocks_complex_to_mag_0, '0'] +- [analog_sig_source_x_0, '0', blocks_multiply_xx_0, '1'] +- [analog_sig_source_x_0_0, '0', blocks_repeat_1, '0'] +- [analog_sig_source_x_0_0, '0', qtgui_time_sink_x_0, '0'] +- [band_pass_filter_0, '0', qtgui_time_sink_x_0_0_0, '0'] +- [blocks_add_const_vxx_0, '0', blocks_multiply_xx_0, '0'] +- [blocks_complex_to_mag_0, '0', band_pass_filter_0, '0'] +- [blocks_complex_to_mag_0, '0', qtgui_time_sink_x_0_0_0_0, '0'] +- [blocks_multiply_const_vxx_0, '0', blocks_add_const_vxx_0, '0'] +- [blocks_multiply_xx_0, '0', blocks_throttle_0, '0'] +- [blocks_repeat_1, '0', blocks_multiply_const_vxx_0, '0'] +- [blocks_throttle_0, '0', freq_xlating_fir_filter_xxx_0, '0'] +- [blocks_throttle_0, '0', qtgui_time_sink_x_0_0, '0'] +- [freq_xlating_fir_filter_xxx_0, '0', analog_agc_xx_0, '0'] + +metadata: + file_format: 1 diff --git a/tests/Simulation/AM&DSB_SC/AM_Resiver_Transmitter.pdf b/tests/Simulation/AM&DSB_SC/AM_Resiver_Transmitter.pdf Binary files differnew file mode 100644 index 0000000..fc61159 --- /dev/null +++ b/tests/Simulation/AM&DSB_SC/AM_Resiver_Transmitter.pdf diff --git a/tests/Simulation/AM&DSB_SC/SSB_Resiver_Transmitter.grc b/tests/Simulation/AM&DSB_SC/SSB_Resiver_Transmitter.grc new file mode 100644 index 0000000..df9db74 --- /dev/null +++ b/tests/Simulation/AM&DSB_SC/SSB_Resiver_Transmitter.grc @@ -0,0 +1,890 @@ +options: + parameters: + author: Sara Halter + category: '[GRC Hier Blocks]' + cmake_opt: '' + comment: '' + copyright: '' + description: '' + gen_cmake: 'On' + gen_linking: dynamic + generate_options: qt_gui + hier_block_src_path: '.:' + id: Simulation + max_nouts: '0' + output_language: python + placement: (0,0) + qt_qss_theme: '' + realtime_scheduling: '1' + run: 'True' + run_command: '{python} -u {filename}' + run_options: prompt + sizing_mode: fixed + thread_safe_setters: '' + title: 'SSB Simulation ' + window_size: '' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [8, 8] + rotation: 0 + state: enabled + +blocks: +- name: audio_rate + id: variable + parameters: + comment: '' + value: '32000' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [280, 12.0] + rotation: 0 + state: enabled +- name: carrier_freq + id: variable + parameters: + comment: '' + value: '16000' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [296, 84.0] + rotation: 0 + state: enabled +- name: decim + id: variable + parameters: + comment: '' + value: samp_rate/audio_rate + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [376, 12.0] + rotation: 0 + state: enabled +- name: reverse + id: variable_qtgui_chooser + parameters: + comment: '' + gui_hint: '' + label: Sideband + label0: Upper + label1: Lower + label2: '' + label3: '' + label4: '' + labels: '[]' + num_opts: '2' + option0: '-1' + option1: '1' + option2: '2' + option3: '3' + option4: '4' + options: '[0, 1, 2]' + orient: Qt.QVBoxLayout + type: int + value: '1' + widget: combo_box + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [600, 12.0] + rotation: 0 + state: true +- name: samp_rate + id: variable + parameters: + comment: '' + value: '256000' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [184, 12] + rotation: 0 + state: enabled +- name: samp_rate_1 + id: variable + parameters: + comment: '' + value: '192000' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [184, 84.0] + rotation: 0 + state: enabled +- name: tuning + id: variable_qtgui_range + parameters: + comment: '' + gui_hint: '' + label: tuning + min_len: '200' + orient: Qt.Horizontal + rangeType: float + start: '48000' + step: '100' + stop: '58000' + value: '51500' + widget: counter_slider + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [456, 12.0] + rotation: 0 + state: true +- name: analog_const_source_x_0 + id: analog_const_source_x + parameters: + affinity: '' + alias: '' + comment: '' + const: '0' + maxoutbuf: '0' + minoutbuf: '0' + type: float + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1744, 516.0] + rotation: 0 + state: true +- name: analog_sig_source_x_0 + id: analog_sig_source_x + parameters: + affinity: '' + alias: '' + amp: '1' + comment: '' + freq: '5000' + maxoutbuf: '0' + minoutbuf: '0' + offset: '0' + phase: '0' + samp_rate: samp_rate + type: complex + waveform: analog.GR_TRI_WAVE + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [72, 284.0] + rotation: 0 + state: true +- name: analog_sig_source_x_0_0 + id: analog_sig_source_x + parameters: + affinity: '' + alias: '' + amp: '1' + comment: '' + freq: '1500' + maxoutbuf: '0' + minoutbuf: '0' + offset: '0' + phase: '0' + samp_rate: audio_rate + type: float + waveform: analog.GR_COS_WAVE + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [656, 180.0] + rotation: 0 + state: true +- name: analog_sig_source_x_0_0_0 + id: analog_sig_source_x + parameters: + affinity: '' + alias: '' + amp: '1' + comment: '' + freq: '1500' + maxoutbuf: '0' + minoutbuf: '0' + offset: '0' + phase: '0' + samp_rate: audio_rate + type: float + waveform: analog.GR_SIN_WAVE + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [664, 428.0] + rotation: 0 + state: true +- name: analog_sig_source_x_1 + id: analog_sig_source_x + parameters: + affinity: '' + alias: '' + amp: '1' + comment: '' + freq: '16000' + maxoutbuf: '0' + minoutbuf: '0' + offset: '0' + phase: '0' + samp_rate: samp_rate_1 + type: complex + waveform: analog.GR_SIN_WAVE + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1896, 356.0] + rotation: 0 + state: true +- name: band_pass_filter_0 + id: band_pass_filter + parameters: + affinity: '' + alias: '' + beta: '6.76' + comment: '' + decim: '1' + gain: '1' + high_cutoff_freq: '19000' + interp: '1' + low_cutoff_freq: '16300' + maxoutbuf: '0' + minoutbuf: '0' + samp_rate: samp_rate_1 + type: fir_filter_ccf + width: '200' + win: firdes.WIN_HAMMING + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [2352, 412.0] + rotation: 0 + state: true +- name: blocks_add_xx_0 + id: blocks_add_xx + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + num_inputs: '2' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1200, 280.0] + rotation: 0 + state: true +- name: blocks_complex_to_float_0 + id: blocks_complex_to_float + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [736, 328.0] + rotation: 0 + state: true +- name: blocks_float_to_complex_0 + id: blocks_float_to_complex + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1928, 544.0] + rotation: 0 + state: true +- name: blocks_multiply_const_vxx_0 + id: blocks_multiply_const_vxx + parameters: + affinity: '' + alias: '' + comment: '' + const: 100e-6 + maxoutbuf: '0' + minoutbuf: '0' + type: complex + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [296, 324.0] + rotation: 0 + state: true +- name: blocks_multiply_const_vxx_0_0 + id: blocks_multiply_const_vxx + parameters: + affinity: '' + alias: '' + comment: '' + const: 100e-3 + maxoutbuf: '0' + minoutbuf: '0' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1312, 292.0] + rotation: 0 + state: true +- name: blocks_multiply_const_vxx_0_0_0 + id: blocks_multiply_const_vxx + parameters: + affinity: '' + alias: '' + comment: '' + const: '1' + maxoutbuf: '0' + minoutbuf: '0' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1080, 404.0] + rotation: 0 + state: true +- name: blocks_multiply_const_vxx_0_0_1 + id: blocks_multiply_const_vxx + parameters: + affinity: '' + alias: '' + comment: '' + const: '10' + maxoutbuf: '0' + minoutbuf: '0' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1592, 572.0] + rotation: 0 + state: true +- name: blocks_multiply_xx_0 + id: blocks_multiply_xx + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + num_inputs: '2' + type: complex + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [2176, 456.0] + rotation: 0 + state: true +- name: blocks_multiply_xx_0_0 + id: blocks_multiply_xx + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + num_inputs: '2' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [928, 264.0] + rotation: 0 + state: true +- name: blocks_multiply_xx_0_0_0 + id: blocks_multiply_xx + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + num_inputs: '2' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [936, 392.0] + rotation: 0 + state: true +- name: blocks_repeat_0 + id: blocks_repeat + parameters: + affinity: '' + alias: '' + comment: '' + interp: '4' + maxoutbuf: '0' + minoutbuf: '0' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1752, 572.0] + rotation: 0 + state: true +- name: blocks_throttle_0 + id: blocks_throttle + parameters: + affinity: '' + alias: '' + comment: '' + ignoretag: 'True' + maxoutbuf: '0' + minoutbuf: '0' + samples_per_second: '48000' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1408, 572.0] + rotation: 0 + state: true +- name: fosphor_glfw_sink_c_0 + id: fosphor_glfw_sink_c + parameters: + affinity: '' + alias: '' + comment: '' + freq_center: '0' + freq_span: samp_rate + wintype: firdes.WIN_BLACKMAN_hARRIS + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [2616, 596.0] + rotation: 0 + state: true +- name: freq_xlating_fir_filter_xxx_0 + id: freq_xlating_fir_filter_xxx + parameters: + affinity: '' + alias: '' + center_freq: '0' + comment: '' + decim: '8' + maxoutbuf: '0' + minoutbuf: '0' + samp_rate: samp_rate + taps: firdes.low_pass(1.0,samp_rate,3000,100) + type: ccc + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [480, 316.0] + rotation: 0 + state: true +- name: qtgui_freq_sink_x_0 + id: qtgui_freq_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'False' + average: '1.0' + axislabels: 'True' + bw: samp_rate + color1: '"blue"' + color10: '"dark blue"' + color2: '"red"' + color3: '"green"' + color4: '"black"' + color5: '"cyan"' + color6: '"magenta"' + color7: '"yellow"' + color8: '"dark red"' + color9: '"dark green"' + comment: '' + ctrlpanel: 'False' + fc: '0' + fftsize: '1024' + freqhalf: 'True' + grid: 'False' + gui_hint: '' + label: Relative Gain + label1: '' + label10: '''''' + label2: '''''' + label3: '''''' + label4: '''''' + label5: '''''' + label6: '''''' + label7: '''''' + label8: '''''' + label9: '''''' + legend: 'True' + maxoutbuf: '0' + minoutbuf: '0' + name: '""' + nconnections: '1' + showports: 'False' + tr_chan: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_tag: '""' + type: float + units: dB + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + wintype: firdes.WIN_BLACKMAN_hARRIS + ymax: '10' + ymin: '-140' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1520, 352.0] + rotation: 0 + state: true +- name: qtgui_freq_sink_x_0_0 + id: qtgui_freq_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'False' + average: '1.0' + axislabels: 'True' + bw: samp_rate_1 + color1: '"blue"' + color10: '"dark blue"' + color2: '"red"' + color3: '"green"' + color4: '"black"' + color5: '"cyan"' + color6: '"magenta"' + color7: '"yellow"' + color8: '"dark red"' + color9: '"dark green"' + comment: '' + ctrlpanel: 'False' + fc: '0' + fftsize: '2048' + freqhalf: 'True' + grid: 'False' + gui_hint: '' + label: Relative Gain + label1: '' + label10: '''''' + label2: '''''' + label3: '''''' + label4: '''''' + label5: '''''' + label6: '''''' + label7: '''''' + label8: '''''' + label9: '''''' + legend: 'True' + maxoutbuf: '0' + minoutbuf: '0' + name: '""' + nconnections: '1' + showports: 'False' + tr_chan: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_tag: '""' + type: complex + units: dB + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + wintype: firdes.WIN_BLACKMAN_hARRIS + ymax: '10' + ymin: '-140' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [2304, 272.0] + rotation: 0 + state: true +- name: qtgui_freq_sink_x_0_0_0 + id: qtgui_freq_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'False' + average: '1.0' + axislabels: 'True' + bw: samp_rate_1 + color1: '"blue"' + color10: '"dark blue"' + color2: '"red"' + color3: '"green"' + color4: '"black"' + color5: '"cyan"' + color6: '"magenta"' + color7: '"yellow"' + color8: '"dark red"' + color9: '"dark green"' + comment: '' + ctrlpanel: 'False' + fc: '0' + fftsize: '2048' + freqhalf: 'True' + grid: 'False' + gui_hint: '' + label: Relative Gain + label1: '' + label10: '''''' + label2: '''''' + label3: '''''' + label4: '''''' + label5: '''''' + label6: '''''' + label7: '''''' + label8: '''''' + label9: '''''' + legend: 'True' + maxoutbuf: '0' + minoutbuf: '0' + name: '""' + nconnections: '1' + showports: 'False' + tr_chan: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_tag: '""' + type: complex + units: dB + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + wintype: firdes.WIN_BLACKMAN_hARRIS + ymax: '10' + ymin: '-140' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [2600, 472.0] + rotation: 0 + state: true +- name: qtgui_time_sink_x_0 + id: qtgui_time_sink_x + parameters: + affinity: '' + alias: '' + alpha1: '1.0' + alpha10: '1.0' + alpha2: '1.0' + alpha3: '1.0' + alpha4: '1.0' + alpha5: '1.0' + alpha6: '1.0' + alpha7: '1.0' + alpha8: '1.0' + alpha9: '1.0' + autoscale: 'False' + axislabels: 'True' + color1: blue + color10: dark blue + color2: red + color3: green + color4: black + color5: cyan + color6: magenta + color7: yellow + color8: dark red + color9: dark green + comment: '' + ctrlpanel: 'False' + entags: 'True' + grid: 'False' + gui_hint: '' + label1: 'Signal ' + label10: Signal 10 + label2: "Tr\xE4ger" + label3: Signal 3 + label4: Signal 4 + label5: Signal 5 + label6: Signal 6 + label7: Signal 7 + label8: Signal 8 + label9: Signal 9 + legend: 'True' + marker1: '-1' + marker10: '-1' + marker2: '-1' + marker3: '-1' + marker4: '-1' + marker5: '-1' + marker6: '-1' + marker7: '-1' + marker8: '-1' + marker9: '-1' + name: '"Modulated"' + nconnections: '1' + size: '1024' + srate: audio_rate + stemplot: 'False' + style1: '1' + style10: '1' + style2: '1' + style3: '1' + style4: '1' + style5: '1' + style6: '1' + style7: '1' + style8: '1' + style9: '1' + tr_chan: '0' + tr_delay: '0' + tr_level: '0.0' + tr_mode: qtgui.TRIG_MODE_FREE + tr_slope: qtgui.TRIG_SLOPE_POS + tr_tag: '""' + type: float + update_time: '0.10' + width1: '1' + width10: '1' + width2: '1' + width3: '1' + width4: '1' + width5: '1' + width6: '1' + width7: '1' + width8: '1' + width9: '1' + ylabel: Amplitude + ymax: '1' + ymin: '-1' + yunit: '""' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1512, 212.0] + rotation: 0 + state: true + +connections: +- [analog_const_source_x_0, '0', blocks_float_to_complex_0, '0'] +- [analog_sig_source_x_0, '0', blocks_multiply_const_vxx_0, '0'] +- [analog_sig_source_x_0_0, '0', blocks_multiply_xx_0_0, '0'] +- [analog_sig_source_x_0_0_0, '0', blocks_multiply_xx_0_0_0, '1'] +- [analog_sig_source_x_1, '0', blocks_multiply_xx_0, '0'] +- [band_pass_filter_0, '0', fosphor_glfw_sink_c_0, '0'] +- [band_pass_filter_0, '0', qtgui_freq_sink_x_0_0_0, '0'] +- [blocks_add_xx_0, '0', blocks_multiply_const_vxx_0_0, '0'] +- [blocks_complex_to_float_0, '0', blocks_multiply_xx_0_0, '1'] +- [blocks_complex_to_float_0, '1', blocks_multiply_xx_0_0_0, '0'] +- [blocks_float_to_complex_0, '0', blocks_multiply_xx_0, '1'] +- [blocks_multiply_const_vxx_0, '0', freq_xlating_fir_filter_xxx_0, '0'] +- [blocks_multiply_const_vxx_0_0, '0', blocks_throttle_0, '0'] +- [blocks_multiply_const_vxx_0_0, '0', qtgui_freq_sink_x_0, '0'] +- [blocks_multiply_const_vxx_0_0, '0', qtgui_time_sink_x_0, '0'] +- [blocks_multiply_const_vxx_0_0_0, '0', blocks_add_xx_0, '1'] +- [blocks_multiply_const_vxx_0_0_1, '0', blocks_repeat_0, '0'] +- [blocks_multiply_xx_0, '0', band_pass_filter_0, '0'] +- [blocks_multiply_xx_0, '0', qtgui_freq_sink_x_0_0, '0'] +- [blocks_multiply_xx_0_0, '0', blocks_add_xx_0, '0'] +- [blocks_multiply_xx_0_0_0, '0', blocks_multiply_const_vxx_0_0_0, '0'] +- [blocks_repeat_0, '0', blocks_float_to_complex_0, '1'] +- [blocks_throttle_0, '0', blocks_multiply_const_vxx_0_0_1, '0'] +- [freq_xlating_fir_filter_xxx_0, '0', blocks_complex_to_float_0, '0'] + +metadata: + file_format: 1 diff --git a/tests/Simulation/AM&DSB_SC/Simulation.py b/tests/Simulation/AM&DSB_SC/Simulation.py new file mode 100755 index 0000000..86fa17d --- /dev/null +++ b/tests/Simulation/AM&DSB_SC/Simulation.py @@ -0,0 +1,439 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# +# SPDX-License-Identifier: GPL-3.0 +# +# GNU Radio Python Flow Graph +# Title: SSB Simulation +# Author: Sara Halter +# GNU Radio version: 3.8.2.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()") + +from PyQt5 import Qt +from PyQt5.QtCore import QObject, pyqtSlot +from gnuradio import qtgui +from gnuradio.filter import firdes +import sip +from gnuradio import analog +from gnuradio import blocks +from gnuradio import filter +from gnuradio import fosphor +from gnuradio.fft import window +from gnuradio import gr +import sys +import signal +from argparse import ArgumentParser +from gnuradio.eng_arg import eng_float, intx +from gnuradio import eng_notation +from gnuradio.qtgui import Range, RangeWidget + +from gnuradio import qtgui + +class Simulation(gr.top_block, Qt.QWidget): + + def __init__(self): + gr.top_block.__init__(self, "SSB Simulation ") + Qt.QWidget.__init__(self) + self.setWindowTitle("SSB Simulation ") + 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", "Simulation") + + 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.samp_rate = samp_rate = 256000 + self.audio_rate = audio_rate = 32000 + self.tuning = tuning = 51500 + self.samp_rate_1 = samp_rate_1 = 192000 + self.reverse = reverse = 1 + self.decim = decim = samp_rate/audio_rate + self.carrier_freq = carrier_freq = 16000 + + ################################################## + # Blocks + ################################################## + self._tuning_range = Range(48000, 58000, 100, 51500, 200) + self._tuning_win = RangeWidget(self._tuning_range, self.set_tuning, 'tuning', "counter_slider", float) + self.top_grid_layout.addWidget(self._tuning_win) + # Create the options list + self._reverse_options = (-1, 1, ) + # Create the labels list + self._reverse_labels = ('Upper', 'Lower', ) + # Create the combo box + self._reverse_tool_bar = Qt.QToolBar(self) + self._reverse_tool_bar.addWidget(Qt.QLabel('Sideband' + ": ")) + self._reverse_combo_box = Qt.QComboBox() + self._reverse_tool_bar.addWidget(self._reverse_combo_box) + for _label in self._reverse_labels: self._reverse_combo_box.addItem(_label) + self._reverse_callback = lambda i: Qt.QMetaObject.invokeMethod(self._reverse_combo_box, "setCurrentIndex", Qt.Q_ARG("int", self._reverse_options.index(i))) + self._reverse_callback(self.reverse) + self._reverse_combo_box.currentIndexChanged.connect( + lambda i: self.set_reverse(self._reverse_options[i])) + # Create the radio buttons + self.top_grid_layout.addWidget(self._reverse_tool_bar) + self.qtgui_time_sink_x_0 = qtgui.time_sink_f( + 1024, #size + audio_rate, #samp_rate + "Modulated", #name + 1 #number of inputs + ) + self.qtgui_time_sink_x_0.set_update_time(0.10) + self.qtgui_time_sink_x_0.set_y_axis(-1, 1) + + self.qtgui_time_sink_x_0.set_y_label('Amplitude', "") + + self.qtgui_time_sink_x_0.enable_tags(True) + self.qtgui_time_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") + self.qtgui_time_sink_x_0.enable_autoscale(False) + self.qtgui_time_sink_x_0.enable_grid(False) + self.qtgui_time_sink_x_0.enable_axis_labels(True) + self.qtgui_time_sink_x_0.enable_control_panel(False) + self.qtgui_time_sink_x_0.enable_stem_plot(False) + + + labels = ['Signal ', 'Träger', '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_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_time_sink_x_0.set_line_label(i, labels[i]) + self.qtgui_time_sink_x_0.set_line_width(i, widths[i]) + self.qtgui_time_sink_x_0.set_line_color(i, colors[i]) + self.qtgui_time_sink_x_0.set_line_style(i, styles[i]) + self.qtgui_time_sink_x_0.set_line_marker(i, markers[i]) + self.qtgui_time_sink_x_0.set_line_alpha(i, alphas[i]) + + self._qtgui_time_sink_x_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0.pyqwidget(), Qt.QWidget) + self.top_grid_layout.addWidget(self._qtgui_time_sink_x_0_win) + self.qtgui_freq_sink_x_0_0_0 = qtgui.freq_sink_c( + 2048, #size + firdes.WIN_BLACKMAN_hARRIS, #wintype + 0, #fc + samp_rate_1, #bw + "", #name + 1 + ) + self.qtgui_freq_sink_x_0_0_0.set_update_time(0.10) + self.qtgui_freq_sink_x_0_0_0.set_y_axis(-140, 10) + self.qtgui_freq_sink_x_0_0_0.set_y_label('Relative Gain', 'dB') + self.qtgui_freq_sink_x_0_0_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "") + self.qtgui_freq_sink_x_0_0_0.enable_autoscale(False) + self.qtgui_freq_sink_x_0_0_0.enable_grid(False) + self.qtgui_freq_sink_x_0_0_0.set_fft_average(1.0) + self.qtgui_freq_sink_x_0_0_0.enable_axis_labels(True) + self.qtgui_freq_sink_x_0_0_0.enable_control_panel(False) + + + + labels = ['', '', '', '', '', + '', '', '', '', ''] + 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] + + for i in range(1): + if len(labels[i]) == 0: + self.qtgui_freq_sink_x_0_0_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_freq_sink_x_0_0_0.set_line_label(i, labels[i]) + self.qtgui_freq_sink_x_0_0_0.set_line_width(i, widths[i]) + self.qtgui_freq_sink_x_0_0_0.set_line_color(i, colors[i]) + self.qtgui_freq_sink_x_0_0_0.set_line_alpha(i, alphas[i]) + + self._qtgui_freq_sink_x_0_0_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0_0_0.pyqwidget(), Qt.QWidget) + self.top_grid_layout.addWidget(self._qtgui_freq_sink_x_0_0_0_win) + self.qtgui_freq_sink_x_0_0 = qtgui.freq_sink_c( + 2048, #size + firdes.WIN_BLACKMAN_hARRIS, #wintype + 0, #fc + samp_rate_1, #bw + "", #name + 1 + ) + self.qtgui_freq_sink_x_0_0.set_update_time(0.10) + self.qtgui_freq_sink_x_0_0.set_y_axis(-140, 10) + self.qtgui_freq_sink_x_0_0.set_y_label('Relative Gain', 'dB') + self.qtgui_freq_sink_x_0_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "") + self.qtgui_freq_sink_x_0_0.enable_autoscale(False) + self.qtgui_freq_sink_x_0_0.enable_grid(False) + self.qtgui_freq_sink_x_0_0.set_fft_average(1.0) + self.qtgui_freq_sink_x_0_0.enable_axis_labels(True) + self.qtgui_freq_sink_x_0_0.enable_control_panel(False) + + + + labels = ['', '', '', '', '', + '', '', '', '', ''] + 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] + + for i in range(1): + if len(labels[i]) == 0: + self.qtgui_freq_sink_x_0_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_freq_sink_x_0_0.set_line_label(i, labels[i]) + self.qtgui_freq_sink_x_0_0.set_line_width(i, widths[i]) + self.qtgui_freq_sink_x_0_0.set_line_color(i, colors[i]) + self.qtgui_freq_sink_x_0_0.set_line_alpha(i, alphas[i]) + + self._qtgui_freq_sink_x_0_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0_0.pyqwidget(), Qt.QWidget) + self.top_grid_layout.addWidget(self._qtgui_freq_sink_x_0_0_win) + self.qtgui_freq_sink_x_0 = qtgui.freq_sink_f( + 1024, #size + firdes.WIN_BLACKMAN_hARRIS, #wintype + 0, #fc + samp_rate, #bw + "", #name + 1 + ) + self.qtgui_freq_sink_x_0.set_update_time(0.10) + self.qtgui_freq_sink_x_0.set_y_axis(-140, 10) + self.qtgui_freq_sink_x_0.set_y_label('Relative Gain', 'dB') + self.qtgui_freq_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "") + self.qtgui_freq_sink_x_0.enable_autoscale(False) + self.qtgui_freq_sink_x_0.enable_grid(False) + self.qtgui_freq_sink_x_0.set_fft_average(1.0) + self.qtgui_freq_sink_x_0.enable_axis_labels(True) + self.qtgui_freq_sink_x_0.enable_control_panel(False) + + + self.qtgui_freq_sink_x_0.set_plot_pos_half(not True) + + labels = ['', '', '', '', '', + '', '', '', '', ''] + 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] + + for i in range(1): + if len(labels[i]) == 0: + self.qtgui_freq_sink_x_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_freq_sink_x_0.set_line_label(i, labels[i]) + self.qtgui_freq_sink_x_0.set_line_width(i, widths[i]) + self.qtgui_freq_sink_x_0.set_line_color(i, colors[i]) + self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i]) + + self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget) + self.top_grid_layout.addWidget(self._qtgui_freq_sink_x_0_win) + self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(8, firdes.low_pass(1.0,samp_rate,3000,100), 0, samp_rate) + self.fosphor_glfw_sink_c_0 = fosphor.glfw_sink_c() + self.fosphor_glfw_sink_c_0.set_fft_window(firdes.WIN_BLACKMAN_hARRIS) + self.fosphor_glfw_sink_c_0.set_frequency_range(0, samp_rate) + self.blocks_throttle_0 = blocks.throttle(gr.sizeof_float*1, 48000,True) + self.blocks_repeat_0 = blocks.repeat(gr.sizeof_float*1, 4) + self.blocks_multiply_xx_0_0_0 = blocks.multiply_vff(1) + self.blocks_multiply_xx_0_0 = blocks.multiply_vff(1) + self.blocks_multiply_xx_0 = blocks.multiply_vcc(1) + self.blocks_multiply_const_vxx_0_0_1 = blocks.multiply_const_ff(10) + self.blocks_multiply_const_vxx_0_0_0 = blocks.multiply_const_ff(1) + self.blocks_multiply_const_vxx_0_0 = blocks.multiply_const_ff(100e-3) + self.blocks_multiply_const_vxx_0 = blocks.multiply_const_cc(100e-6) + self.blocks_float_to_complex_0 = blocks.float_to_complex(1) + self.blocks_complex_to_float_0 = blocks.complex_to_float(1) + self.blocks_add_xx_0 = blocks.add_vff(1) + self.band_pass_filter_0 = filter.fir_filter_ccf( + 1, + firdes.band_pass( + 1, + samp_rate_1, + 16300, + 19000, + 200, + firdes.WIN_HAMMING, + 6.76)) + self.analog_sig_source_x_1 = analog.sig_source_c(samp_rate_1, analog.GR_SIN_WAVE, 16000, 1, 0, 0) + self.analog_sig_source_x_0_0_0 = analog.sig_source_f(audio_rate, analog.GR_SIN_WAVE, 1500, 1, 0, 0) + self.analog_sig_source_x_0_0 = analog.sig_source_f(audio_rate, analog.GR_COS_WAVE, 1500, 1, 0, 0) + self.analog_sig_source_x_0 = analog.sig_source_c(samp_rate, analog.GR_TRI_WAVE, 5000, 1, 0, 0) + self.analog_const_source_x_0 = analog.sig_source_f(0, analog.GR_CONST_WAVE, 0, 0, 0) + + + + ################################################## + # Connections + ################################################## + self.connect((self.analog_const_source_x_0, 0), (self.blocks_float_to_complex_0, 0)) + self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_const_vxx_0, 0)) + self.connect((self.analog_sig_source_x_0_0, 0), (self.blocks_multiply_xx_0_0, 0)) + self.connect((self.analog_sig_source_x_0_0_0, 0), (self.blocks_multiply_xx_0_0_0, 1)) + self.connect((self.analog_sig_source_x_1, 0), (self.blocks_multiply_xx_0, 0)) + self.connect((self.band_pass_filter_0, 0), (self.fosphor_glfw_sink_c_0, 0)) + self.connect((self.band_pass_filter_0, 0), (self.qtgui_freq_sink_x_0_0_0, 0)) + self.connect((self.blocks_add_xx_0, 0), (self.blocks_multiply_const_vxx_0_0, 0)) + self.connect((self.blocks_complex_to_float_0, 0), (self.blocks_multiply_xx_0_0, 1)) + self.connect((self.blocks_complex_to_float_0, 1), (self.blocks_multiply_xx_0_0_0, 0)) + self.connect((self.blocks_float_to_complex_0, 0), (self.blocks_multiply_xx_0, 1)) + self.connect((self.blocks_multiply_const_vxx_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) + self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.blocks_throttle_0, 0)) + self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.qtgui_freq_sink_x_0, 0)) + self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.qtgui_time_sink_x_0, 0)) + self.connect((self.blocks_multiply_const_vxx_0_0_0, 0), (self.blocks_add_xx_0, 1)) + self.connect((self.blocks_multiply_const_vxx_0_0_1, 0), (self.blocks_repeat_0, 0)) + self.connect((self.blocks_multiply_xx_0, 0), (self.band_pass_filter_0, 0)) + self.connect((self.blocks_multiply_xx_0, 0), (self.qtgui_freq_sink_x_0_0, 0)) + self.connect((self.blocks_multiply_xx_0_0, 0), (self.blocks_add_xx_0, 0)) + self.connect((self.blocks_multiply_xx_0_0_0, 0), (self.blocks_multiply_const_vxx_0_0_0, 0)) + self.connect((self.blocks_repeat_0, 0), (self.blocks_float_to_complex_0, 1)) + self.connect((self.blocks_throttle_0, 0), (self.blocks_multiply_const_vxx_0_0_1, 0)) + self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.blocks_complex_to_float_0, 0)) + + + def closeEvent(self, event): + self.settings = Qt.QSettings("GNU Radio", "Simulation") + self.settings.setValue("geometry", self.saveGeometry()) + event.accept() + + def get_samp_rate(self): + return self.samp_rate + + def set_samp_rate(self, samp_rate): + self.samp_rate = samp_rate + self.set_decim(self.samp_rate/self.audio_rate) + self.analog_sig_source_x_0.set_sampling_freq(self.samp_rate) + self.freq_xlating_fir_filter_xxx_0.set_taps(firdes.low_pass(1.0,self.samp_rate,3000,100)) + self.qtgui_freq_sink_x_0.set_frequency_range(0, self.samp_rate) + self.fosphor_glfw_sink_c_0.set_frequency_range(0, self.samp_rate) + + def get_audio_rate(self): + return self.audio_rate + + def set_audio_rate(self, audio_rate): + self.audio_rate = audio_rate + self.set_decim(self.samp_rate/self.audio_rate) + self.analog_sig_source_x_0_0.set_sampling_freq(self.audio_rate) + self.analog_sig_source_x_0_0_0.set_sampling_freq(self.audio_rate) + self.qtgui_time_sink_x_0.set_samp_rate(self.audio_rate) + + def get_tuning(self): + return self.tuning + + def set_tuning(self, tuning): + self.tuning = tuning + + def get_samp_rate_1(self): + return self.samp_rate_1 + + def set_samp_rate_1(self, samp_rate_1): + self.samp_rate_1 = samp_rate_1 + self.analog_sig_source_x_1.set_sampling_freq(self.samp_rate_1) + self.band_pass_filter_0.set_taps(firdes.band_pass(1, self.samp_rate_1, 16300, 19000, 200, firdes.WIN_HAMMING, 6.76)) + self.qtgui_freq_sink_x_0_0.set_frequency_range(0, self.samp_rate_1) + self.qtgui_freq_sink_x_0_0_0.set_frequency_range(0, self.samp_rate_1) + + def get_reverse(self): + return self.reverse + + def set_reverse(self, reverse): + self.reverse = reverse + self._reverse_callback(self.reverse) + + def get_decim(self): + return self.decim + + def set_decim(self, decim): + self.decim = decim + + def get_carrier_freq(self): + return self.carrier_freq + + def set_carrier_freq(self, carrier_freq): + self.carrier_freq = carrier_freq + + + + + +def main(top_block_cls=Simulation, 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() diff --git a/tests/Simulation/AM/AM.grc b/tests/Simulation/AM/AM.grc index 2a40da6..db9525a 100644 --- a/tests/Simulation/AM/AM.grc +++ b/tests/Simulation/AM/AM.grc @@ -27,7 +27,7 @@ options: bus_sink: false bus_source: false bus_structure: null - coordinate: [8, 8] + coordinate: [16, 12.0] rotation: 0 state: enabled diff --git a/tests/Simulation/AM/Simluation.py b/tests/Simulation/AM/Simluation.py new file mode 100755 index 0000000..e9986ee --- /dev/null +++ b/tests/Simulation/AM/Simluation.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# +# SPDX-License-Identifier: GPL-3.0 +# +# GNU Radio Python Flow Graph +# Title: Simulation of a fading channel +# Author: Naoki Pross +# GNU Radio version: 3.8.2.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()") + +from PyQt5 import Qt +from gnuradio import qtgui +from gnuradio.filter import firdes +import sip +from gnuradio import analog +from gnuradio import blocks +from gnuradio import fosphor +from gnuradio.fft import window +from gnuradio import gr +import sys +import signal +from argparse import ArgumentParser +from gnuradio.eng_arg import eng_float, intx +from gnuradio import eng_notation + +from gnuradio import qtgui + +class Simluation(gr.top_block, Qt.QWidget): + + def __init__(self): + gr.top_block.__init__(self, "Simulation of a fading channel") + Qt.QWidget.__init__(self) + self.setWindowTitle("Simulation of a fading channel") + 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", "Simluation") + + 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.samp_rate = samp_rate = 128e3 + self.modulation_factor = modulation_factor = .7 + self.carrier_freq = carrier_freq = 5e3 + + ################################################## + # Blocks + ################################################## + self.qtgui_time_sink_x_0 = qtgui.time_sink_f( + 1024, #size + samp_rate, #samp_rate + "Demodulated AM signal", #name + 2 #number of inputs + ) + self.qtgui_time_sink_x_0.set_update_time(1e-1) + self.qtgui_time_sink_x_0.set_y_axis(-1, 1) + + self.qtgui_time_sink_x_0.set_y_label('Amplitude', "") + + self.qtgui_time_sink_x_0.enable_tags(True) + self.qtgui_time_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_NORM, qtgui.TRIG_SLOPE_POS, 0.0, 1e-3, 0, "") + self.qtgui_time_sink_x_0.enable_autoscale(True) + self.qtgui_time_sink_x_0.enable_grid(True) + self.qtgui_time_sink_x_0.enable_axis_labels(True) + self.qtgui_time_sink_x_0.enable_control_panel(False) + self.qtgui_time_sink_x_0.enable_stem_plot(False) + + + labels = ['Original', 'Demodulated', '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(2): + if len(labels[i]) == 0: + self.qtgui_time_sink_x_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_time_sink_x_0.set_line_label(i, labels[i]) + self.qtgui_time_sink_x_0.set_line_width(i, widths[i]) + self.qtgui_time_sink_x_0.set_line_color(i, colors[i]) + self.qtgui_time_sink_x_0.set_line_style(i, styles[i]) + self.qtgui_time_sink_x_0.set_line_marker(i, markers[i]) + self.qtgui_time_sink_x_0.set_line_alpha(i, alphas[i]) + + self._qtgui_time_sink_x_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0.pyqwidget(), Qt.QWidget) + self.top_grid_layout.addWidget(self._qtgui_time_sink_x_0_win) + self.fosphor_glfw_sink_c_0 = fosphor.glfw_sink_c() + self.fosphor_glfw_sink_c_0.set_fft_window(firdes.WIN_BLACKMAN_hARRIS) + self.fosphor_glfw_sink_c_0.set_frequency_range(0, samp_rate) + self.blocks_throttle_0 = blocks.throttle(gr.sizeof_gr_complex*1, samp_rate * 2,True) + self.blocks_multiply_xx_1 = blocks.multiply_vcc(1) + self.blocks_multiply_xx_0 = blocks.multiply_vcc(1) + self.blocks_complex_to_real_0 = blocks.complex_to_real(1) + self.blocks_add_xx_0 = blocks.add_vcc(1) + self.analog_sig_source_x_1 = analog.sig_source_c(samp_rate, analog.GR_SQR_WAVE, 50, 1, 0, 0) + self.analog_sig_source_x_0 = analog.sig_source_c(samp_rate, analog.GR_COS_WAVE, carrier_freq, 1, 0, 0) + self.analog_const_source_x_1 = analog.sig_source_c(0, analog.GR_CONST_WAVE, 0, 0, modulation_factor) + self.analog_const_source_x_0 = analog.sig_source_c(0, analog.GR_CONST_WAVE, 0, 0, 1) + self.analog_am_demod_cf_0 = analog.am_demod_cf( + channel_rate=samp_rate, + audio_decim=1, + audio_pass=5000, + audio_stop=5500, + ) + + + + ################################################## + # Connections + ################################################## + self.connect((self.analog_am_demod_cf_0, 0), (self.qtgui_time_sink_x_0, 1)) + self.connect((self.analog_const_source_x_0, 0), (self.blocks_add_xx_0, 1)) + self.connect((self.analog_const_source_x_1, 0), (self.blocks_multiply_xx_1, 0)) + self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_xx_0, 1)) + self.connect((self.analog_sig_source_x_1, 0), (self.blocks_multiply_xx_1, 1)) + self.connect((self.blocks_add_xx_0, 0), (self.blocks_complex_to_real_0, 0)) + self.connect((self.blocks_add_xx_0, 0), (self.blocks_multiply_xx_0, 0)) + self.connect((self.blocks_complex_to_real_0, 0), (self.qtgui_time_sink_x_0, 0)) + self.connect((self.blocks_multiply_xx_0, 0), (self.blocks_throttle_0, 0)) + self.connect((self.blocks_multiply_xx_1, 0), (self.blocks_add_xx_0, 0)) + self.connect((self.blocks_throttle_0, 0), (self.analog_am_demod_cf_0, 0)) + self.connect((self.blocks_throttle_0, 0), (self.fosphor_glfw_sink_c_0, 0)) + + + def closeEvent(self, event): + self.settings = Qt.QSettings("GNU Radio", "Simluation") + self.settings.setValue("geometry", self.saveGeometry()) + event.accept() + + def get_samp_rate(self): + return self.samp_rate + + def set_samp_rate(self, samp_rate): + self.samp_rate = samp_rate + self.analog_sig_source_x_0.set_sampling_freq(self.samp_rate) + self.analog_sig_source_x_1.set_sampling_freq(self.samp_rate) + self.blocks_throttle_0.set_sample_rate(self.samp_rate * 2) + self.fosphor_glfw_sink_c_0.set_frequency_range(0, self.samp_rate) + self.qtgui_time_sink_x_0.set_samp_rate(self.samp_rate) + + def get_modulation_factor(self): + return self.modulation_factor + + def set_modulation_factor(self, modulation_factor): + self.modulation_factor = modulation_factor + self.analog_const_source_x_1.set_offset(self.modulation_factor) + + def get_carrier_freq(self): + return self.carrier_freq + + def set_carrier_freq(self, carrier_freq): + self.carrier_freq = carrier_freq + self.analog_sig_source_x_0.set_frequency(self.carrier_freq) + + + + + +def main(top_block_cls=Simluation, 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() |