11.12.2020, 12:50
Guten Tag.
Da ich auch nach längerer Suche keine Möglichkeit gefunden habe in GnuRadio Untermodule zu erstellen um den Sender übersichtlicher zu gestalten, habe ich mich an ein Neudesign gewagt. Durch Neuplatzierung einiger Blöcke ist das Sendeprogramm sogar noch etwas sparsamer im Umgang mit dem Prozessor. Ich denke jetzt ist das ganze auch übersichtlicher gestaltet.
Links im Bild ist die MPX-Signalerzeugung im Basisband zu sehen. Es sind 5 UKW-Stationen die dann im rechten Teil um eine frei einstellbare Mittenfrequenz abgelegt werden. Den Kanalabstand zur Mittenfrequenz kann man in den Signalgeneratorblöcken festlegen. Das aus vielen UKW-Stationen zusammengebaute Basisband wird mit dem Signalblock PlutoSDRSink über USB zum Adalm Pluto übertragen und ausgesendet.
Ich habe zunächst einen Adapter SMA auf F-Buchse, einen zusätzlichen Bandpass und eine Teleskopantenne an den Pluto angeschlossen und die Sendeleistung so geregelt das die Stationen nur auf dem eigenen Grundstück hörbar waren. Im Spektrum sind auch keine Oberwellen auszumachen die durch Grenzwertverletzung eine Störung anderer Frequenzbereiche und Grundstücke verursachen würden. Leistungsmäßig bin ich hier im mW-Bereich, mehr als die päbstlich festgelegten 50nW, aber halt kontrolliert in der Reichweite.
Das hat also schon sehr gut funktioniert. Die Tuner habe ich von allen TAD getrennt und auf die Endstücken in jeden Raum einen UKW-Dipol angesteckt. Damit empfange ich neben dem sowieso vorhandenen lokalen UKW-Rundfunk in den Lücken auch meine eigenerzeugten Stationen. Ich denke das wäre eine praxistaugliche Lösung und man umgeht das Docsis3.1 Problem so generell.
Den von GNU-Radio aus dem Diagramm erzeugten Programmcode meines 5-UKW-Stationen Senders hänge ich mal an.
Man braucht am Modulationsrechner also nur den Adalm Pluto anstecken und das erzeugte Pythonprogramm aufrufen.
Das Modulationssignal wird von fünf vlc Programmen mit unterschiedlichen Internetradioadressen in die Dateien fifo1 bis fifo5 gestreamt. Diese sind jeweils 128 MB groß und puffern somit einige Sekunden lang unkomprimiertes 2k-Audio. Wenn jemand mehr als 5 Kanäle benötigt, braucht er nur das Signaldiagramm erweitern und von GNU-Radio ein neues Pythonprogramm erstellen lassen. Mein alter Laptop der als Signalquelle für das Adalm SDR herhält schafft vom Prozesser her die Erzeugung von 9 UKW-Sendern. Danach fängt die Wiedergabe an zu stottern. Noch mehr Sender benötigen also einen besseren PC oder einen zweiten PC und Adalm Pluto. Der Pluto ist gerade für 132 Euro bei mouser.de zu bekommen, die Lieferzeit aus den USA ist sehr kurz. 2-3 Tage. Zoll fällt nicht an, da Niederlassung in Deutschland ist.
Mit freundlichen Grüßen Ronald
Da ich auch nach längerer Suche keine Möglichkeit gefunden habe in GnuRadio Untermodule zu erstellen um den Sender übersichtlicher zu gestalten, habe ich mich an ein Neudesign gewagt. Durch Neuplatzierung einiger Blöcke ist das Sendeprogramm sogar noch etwas sparsamer im Umgang mit dem Prozessor. Ich denke jetzt ist das ganze auch übersichtlicher gestaltet.
Links im Bild ist die MPX-Signalerzeugung im Basisband zu sehen. Es sind 5 UKW-Stationen die dann im rechten Teil um eine frei einstellbare Mittenfrequenz abgelegt werden. Den Kanalabstand zur Mittenfrequenz kann man in den Signalgeneratorblöcken festlegen. Das aus vielen UKW-Stationen zusammengebaute Basisband wird mit dem Signalblock PlutoSDRSink über USB zum Adalm Pluto übertragen und ausgesendet.
Ich habe zunächst einen Adapter SMA auf F-Buchse, einen zusätzlichen Bandpass und eine Teleskopantenne an den Pluto angeschlossen und die Sendeleistung so geregelt das die Stationen nur auf dem eigenen Grundstück hörbar waren. Im Spektrum sind auch keine Oberwellen auszumachen die durch Grenzwertverletzung eine Störung anderer Frequenzbereiche und Grundstücke verursachen würden. Leistungsmäßig bin ich hier im mW-Bereich, mehr als die päbstlich festgelegten 50nW, aber halt kontrolliert in der Reichweite.
Das hat also schon sehr gut funktioniert. Die Tuner habe ich von allen TAD getrennt und auf die Endstücken in jeden Raum einen UKW-Dipol angesteckt. Damit empfange ich neben dem sowieso vorhandenen lokalen UKW-Rundfunk in den Lücken auch meine eigenerzeugten Stationen. Ich denke das wäre eine praxistaugliche Lösung und man umgeht das Docsis3.1 Problem so generell.
Den von GNU-Radio aus dem Diagramm erzeugten Programmcode meines 5-UKW-Stationen Senders hänge ich mal an.
Man braucht am Modulationsrechner also nur den Adalm Pluto anstecken und das erzeugte Pythonprogramm aufrufen.
Das Modulationssignal wird von fünf vlc Programmen mit unterschiedlichen Internetradioadressen in die Dateien fifo1 bis fifo5 gestreamt. Diese sind jeweils 128 MB groß und puffern somit einige Sekunden lang unkomprimiertes 2k-Audio. Wenn jemand mehr als 5 Kanäle benötigt, braucht er nur das Signaldiagramm erweitern und von GNU-Radio ein neues Pythonprogramm erstellen lassen. Mein alter Laptop der als Signalquelle für das Adalm SDR herhält schafft vom Prozesser her die Erzeugung von 9 UKW-Sendern. Danach fängt die Wiedergabe an zu stottern. Noch mehr Sender benötigen also einen besseren PC oder einen zweiten PC und Adalm Pluto. Der Pluto ist gerade für 132 Euro bei mouser.de zu bekommen, die Lieferzeit aus den USA ist sehr kurz. 2-3 Tage. Zoll fällt nicht an, da Niederlassung in Deutschland ist.
PHP-Code:
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
##################################################
# GNU Radio Python Flow Graph
# Title: Pluto Multiple Stereofm Tx
# Generated: Thu Dec 10 09:50:22 2020
##################################################
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 gnuradio import analog
from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import filter
from gnuradio import gr
from gnuradio import iio
from gnuradio import wxgui
from gnuradio.eng_option import eng_option
from gnuradio.fft import window
from gnuradio.filter import firdes
from gnuradio.wxgui import fftsink2
from gnuradio.wxgui import forms
from gnuradio.wxgui import waterfallsink2
from grc_gnuradio import wxgui as grc_wxgui
from optparse import OptionParser
import wx
class pluto_multiple_stereoFM_tx(grc_wxgui.top_block_gui):
def __init__(self):
grc_wxgui.top_block_gui.__init__(self, title="Pluto Multiple Stereofm Tx")
_icon_path = "/usr/share/icons/hicolor/32x32/apps/gnuradio-grc.png"
self.SetIcon(wx.Icon(_icon_path, wx.BITMAP_TYPE_ANY))
##################################################
# Variables
##################################################
self.samp_rate = samp_rate = 44100
self.Sendefrequenz_0 = Sendefrequenz_0 = 88600000
self.Pilot_Amplitude = Pilot_Amplitude = 0.1
self.Amplitude38kHz = Amplitude38kHz = 0.1
##################################################
# Blocks
##################################################
_Sendefrequenz_0_sizer = wx.BoxSizer(wx.VERTICAL)
self._Sendefrequenz_0_text_box = forms.text_box(
parent=self.GetWin(),
sizer=_Sendefrequenz_0_sizer,
value=self.Sendefrequenz_0,
callback=self.set_Sendefrequenz_0,
label='Sender_Basisband_Mittenfrequenz',
converter=forms.float_converter(),
proportion=0,
)
self._Sendefrequenz_0_slider = forms.slider(
parent=self.GetWin(),
sizer=_Sendefrequenz_0_sizer,
value=self.Sendefrequenz_0,
callback=self.set_Sendefrequenz_0,
minimum=87500000,
maximum=108000000,
num_steps=100,
style=wx.SL_HORIZONTAL,
cast=float,
proportion=1,
)
self.Add(_Sendefrequenz_0_sizer)
_Pilot_Amplitude_sizer = wx.BoxSizer(wx.VERTICAL)
self._Pilot_Amplitude_text_box = forms.text_box(
parent=self.GetWin(),
sizer=_Pilot_Amplitude_sizer,
value=self.Pilot_Amplitude,
callback=self.set_Pilot_Amplitude,
label='Pilot_Amplitude',
converter=forms.float_converter(),
proportion=0,
)
self._Pilot_Amplitude_slider = forms.slider(
parent=self.GetWin(),
sizer=_Pilot_Amplitude_sizer,
value=self.Pilot_Amplitude,
callback=self.set_Pilot_Amplitude,
minimum=0,
maximum=1,
num_steps=100,
style=wx.SL_HORIZONTAL,
cast=float,
proportion=1,
)
self.Add(_Pilot_Amplitude_sizer)
_Amplitude38kHz_sizer = wx.BoxSizer(wx.VERTICAL)
self._Amplitude38kHz_text_box = forms.text_box(
parent=self.GetWin(),
sizer=_Amplitude38kHz_sizer,
value=self.Amplitude38kHz,
callback=self.set_Amplitude38kHz,
label='Amplitude38kHz',
converter=forms.float_converter(),
proportion=0,
)
self._Amplitude38kHz_slider = forms.slider(
parent=self.GetWin(),
sizer=_Amplitude38kHz_sizer,
value=self.Amplitude38kHz,
callback=self.set_Amplitude38kHz,
minimum=0,
maximum=1,
num_steps=100,
style=wx.SL_HORIZONTAL,
cast=float,
proportion=1,
)
self.Add(_Amplitude38kHz_sizer)
self.wxgui_waterfallsink2_0 = waterfallsink2.waterfall_sink_c(
self.GetWin(),
baseband_freq=Sendefrequenz_0,
dynamic_range=100,
ref_level=0,
ref_scale=2.0,
sample_rate=2084000,
fft_size=1024,
fft_rate=15,
average=False,
avg_alpha=None,
title='Waterfall Plot',
)
self.Add(self.wxgui_waterfallsink2_0.win)
self.wxgui_fftsink2_1 = fftsink2.fft_sink_c(
self.GetWin(),
baseband_freq=Sendefrequenz_0,
y_per_div=10,
y_divs=10,
ref_level=0,
ref_scale=2.0,
sample_rate=2084000,
fft_size=1024,
fft_rate=15,
average=False,
avg_alpha=None,
title='FFT Plot',
peak_hold=False,
)
self.Add(self.wxgui_fftsink2_1.win)
self.rational_resampler_xxx_2_1_1 = filter.rational_resampler_ccc(
interpolation=2084000,
decimation=1000000,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_2_1_0_0_0 = filter.rational_resampler_ccc(
interpolation=1000000,
decimation=samp_rate*4,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_2_1_0_0 = filter.rational_resampler_ccc(
interpolation=1000000,
decimation=samp_rate*4,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_2_1_0 = filter.rational_resampler_ccc(
interpolation=1000000,
decimation=samp_rate*4,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_2_1 = filter.rational_resampler_ccc(
interpolation=1000000,
decimation=samp_rate*4,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_2 = filter.rational_resampler_ccc(
interpolation=1000000,
decimation=samp_rate*4,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_0_1_0_0_0 = filter.rational_resampler_fff(
interpolation=4,
decimation=1,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_0_1_0_0 = filter.rational_resampler_fff(
interpolation=4,
decimation=1,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_0_1_0 = filter.rational_resampler_fff(
interpolation=4,
decimation=1,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_0_1 = filter.rational_resampler_fff(
interpolation=4,
decimation=1,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_0_0_0_0_0_0 = filter.rational_resampler_fff(
interpolation=4,
decimation=1,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_0_0_0_0_0 = filter.rational_resampler_fff(
interpolation=4,
decimation=1,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_0_0_0_0 = filter.rational_resampler_fff(
interpolation=4,
decimation=1,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_0_0_0 = filter.rational_resampler_fff(
interpolation=4,
decimation=1,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_0_0 = filter.rational_resampler_fff(
interpolation=4,
decimation=1,
taps=None,
fractional_bw=None,
)
self.rational_resampler_xxx_0 = filter.rational_resampler_fff(
interpolation=4,
decimation=1,
taps=None,
fractional_bw=None,
)
self.pluto_sink_0 = iio.pluto_sink('', int(Sendefrequenz_0), int(2084000), int(20000000), 0x8000, False, 0, '', True)
self.low_pass_filter_0_1_0_0_0 = filter.fir_filter_fff(1, firdes.low_pass(
1, samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_1_0_0 = filter.fir_filter_fff(1, firdes.low_pass(
1, samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_1_0 = filter.fir_filter_fff(1, firdes.low_pass(
1, samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_1 = filter.fir_filter_fff(1, firdes.low_pass(
1, samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_0_0_0_0_0 = filter.fir_filter_fff(1, firdes.low_pass(
1, samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_0_0_0_0 = filter.fir_filter_fff(1, firdes.low_pass(
1, samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_0_0_0 = filter.fir_filter_fff(1, firdes.low_pass(
1, samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_0_0 = filter.fir_filter_fff(1, firdes.low_pass(
1, samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_0 = filter.fir_filter_fff(1, firdes.low_pass(
1, samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0 = filter.fir_filter_fff(1, firdes.low_pass(
1, samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.blocks_wavfile_source_0_0_0_0_0 = blocks.wavfile_source('fifo1', True)
self.blocks_wavfile_source_0_0_0_0 = blocks.wavfile_source('fifo2', True)
self.blocks_wavfile_source_0_0_0 = blocks.wavfile_source('fifo3', True)
self.blocks_wavfile_source_0_0 = blocks.wavfile_source('fifo4', True)
self.blocks_wavfile_source_0 = blocks.wavfile_source('fifo5', True)
self.blocks_sub_xx_0_0_0_0_0 = blocks.sub_ff(1)
self.blocks_sub_xx_0_0_0_0 = blocks.sub_ff(1)
self.blocks_sub_xx_0_0_0 = blocks.sub_ff(1)
self.blocks_sub_xx_0_0 = blocks.sub_ff(1)
self.blocks_sub_xx_0 = blocks.sub_ff(1)
self.blocks_multiply_xx_1_0_0_0 = blocks.multiply_vcc(1)
self.blocks_multiply_xx_1_0_0 = blocks.multiply_vcc(1)
self.blocks_multiply_xx_1_0 = blocks.multiply_vcc(1)
self.blocks_multiply_xx_1 = blocks.multiply_vcc(1)
self.blocks_multiply_xx_0_0_0_0_0 = blocks.multiply_vff(1)
self.blocks_multiply_xx_0_0_0_0 = blocks.multiply_vff(1)
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_vff(1)
self.blocks_multiply_const_vxx_0_2_0 = blocks.multiply_const_vcc((0.2, ))
self.blocks_multiply_const_vxx_0_2 = blocks.multiply_const_vcc((0.2, ))
self.blocks_multiply_const_vxx_0_1 = blocks.multiply_const_vcc((0.2, ))
self.blocks_multiply_const_vxx_0_0 = blocks.multiply_const_vcc((0.2, ))
self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vcc((0.2, ))
self.blocks_add_xx_2 = blocks.add_vcc(1)
self.blocks_add_xx_1_0_0_0_0 = blocks.add_vff(1)
self.blocks_add_xx_1_0_0_0 = blocks.add_vff(1)
self.blocks_add_xx_1_0_0 = blocks.add_vff(1)
self.blocks_add_xx_1_0 = blocks.add_vff(1)
self.blocks_add_xx_1 = blocks.add_vff(1)
self.blocks_add_xx_0_0_0_0_0 = blocks.add_vff(1)
self.blocks_add_xx_0_0_0_0 = blocks.add_vff(1)
self.blocks_add_xx_0_0_0 = blocks.add_vff(1)
self.blocks_add_xx_0_0 = blocks.add_vff(1)
self.blocks_add_xx_0 = blocks.add_vff(1)
self.band_pass_filter_0_0_0_0_0 = filter.fir_filter_fff(1, firdes.band_pass(
1, samp_rate*4, 23000, 53000, 2000, firdes.WIN_HAMMING, 6.76))
self.band_pass_filter_0_0_0_0 = filter.fir_filter_fff(1, firdes.band_pass(
1, samp_rate*4, 23000, 53000, 2000, firdes.WIN_HAMMING, 6.76))
self.band_pass_filter_0_0_0 = filter.fir_filter_fff(1, firdes.band_pass(
1, samp_rate*4, 23000, 53000, 2000, firdes.WIN_HAMMING, 6.76))
self.band_pass_filter_0_0 = filter.fir_filter_fff(1, firdes.band_pass(
1, samp_rate*4, 23000, 53000, 2000, firdes.WIN_HAMMING, 6.76))
self.band_pass_filter_0 = filter.fir_filter_fff(1, firdes.band_pass(
1, samp_rate*4, 23000, 53000, 2000, firdes.WIN_HAMMING, 6.76))
self.analog_sig_source_x_1_0_0_0 = analog.sig_source_c(1000000, analog.GR_COS_WAVE, -400000, 1, 0)
self.analog_sig_source_x_1_0_0 = analog.sig_source_c(1000000, analog.GR_COS_WAVE, 400000, 1, 0)
self.analog_sig_source_x_1_0 = analog.sig_source_c(1000000, analog.GR_COS_WAVE, -200000, 1, 0)
self.analog_sig_source_x_1 = analog.sig_source_c(1000000, analog.GR_COS_WAVE, 200000, 1, 0)
self.analog_sig_source_x_0_0 = analog.sig_source_f(samp_rate*4, analog.GR_COS_WAVE, 38000, Amplitude38kHz, 0)
self.analog_sig_source_x_0 = analog.sig_source_f(samp_rate*4, analog.GR_COS_WAVE, 19000, Pilot_Amplitude, 0)
self.analog_frequency_modulator_fc_0_0_0_0_0 = analog.frequency_modulator_fc(0.9)
self.analog_frequency_modulator_fc_0_0_0_0 = analog.frequency_modulator_fc(0.9)
self.analog_frequency_modulator_fc_0_0_0 = analog.frequency_modulator_fc(0.9)
self.analog_frequency_modulator_fc_0_0 = analog.frequency_modulator_fc(0.9)
self.analog_frequency_modulator_fc_0 = analog.frequency_modulator_fc(0.9)
self.analog_fm_preemph_0_0_1_1_0_0_0 = analog.fm_preemph(fs=samp_rate, tau=50e-6, fh=-1.0)
self.analog_fm_preemph_0_0_1_1_0_0 = analog.fm_preemph(fs=samp_rate, tau=50e-6, fh=-1.0)
self.analog_fm_preemph_0_0_1_1_0 = analog.fm_preemph(fs=samp_rate, tau=50e-6, fh=-1.0)
self.analog_fm_preemph_0_0_1_1 = analog.fm_preemph(fs=samp_rate, tau=50e-6, fh=-1.0)
self.analog_fm_preemph_0_0_1_0_0_0_0_0 = analog.fm_preemph(fs=samp_rate, tau=50e-6, fh=-1.0)
self.analog_fm_preemph_0_0_1_0_0_0_0 = analog.fm_preemph(fs=samp_rate, tau=50e-6, fh=-1.0)
self.analog_fm_preemph_0_0_1_0_0_0 = analog.fm_preemph(fs=samp_rate, tau=50e-6, fh=-1.0)
self.analog_fm_preemph_0_0_1_0_0 = analog.fm_preemph(fs=samp_rate, tau=50e-6, fh=-1.0)
self.analog_fm_preemph_0_0_1_0 = analog.fm_preemph(fs=samp_rate, tau=50e-6, fh=-1.0)
self.analog_fm_preemph_0_0_1 = analog.fm_preemph(fs=samp_rate, tau=50e-6, fh=-1.0)
##################################################
# Connections
##################################################
self.connect((self.analog_fm_preemph_0_0_1, 0), (self.blocks_add_xx_0, 0))
self.connect((self.analog_fm_preemph_0_0_1, 0), (self.blocks_sub_xx_0, 0))
self.connect((self.analog_fm_preemph_0_0_1_0, 0), (self.blocks_add_xx_0, 1))
self.connect((self.analog_fm_preemph_0_0_1_0, 0), (self.blocks_sub_xx_0, 1))
self.connect((self.analog_fm_preemph_0_0_1_0_0, 0), (self.blocks_add_xx_0_0, 1))
self.connect((self.analog_fm_preemph_0_0_1_0_0, 0), (self.blocks_sub_xx_0_0, 1))
self.connect((self.analog_fm_preemph_0_0_1_0_0_0, 0), (self.blocks_add_xx_0_0_0, 1))
self.connect((self.analog_fm_preemph_0_0_1_0_0_0, 0), (self.blocks_sub_xx_0_0_0, 1))
self.connect((self.analog_fm_preemph_0_0_1_0_0_0_0, 0), (self.blocks_add_xx_0_0_0_0, 1))
self.connect((self.analog_fm_preemph_0_0_1_0_0_0_0, 0), (self.blocks_sub_xx_0_0_0_0, 1))
self.connect((self.analog_fm_preemph_0_0_1_0_0_0_0_0, 0), (self.blocks_add_xx_0_0_0_0_0, 1))
self.connect((self.analog_fm_preemph_0_0_1_0_0_0_0_0, 0), (self.blocks_sub_xx_0_0_0_0_0, 1))
self.connect((self.analog_fm_preemph_0_0_1_1, 0), (self.blocks_add_xx_0_0, 0))
self.connect((self.analog_fm_preemph_0_0_1_1, 0), (self.blocks_sub_xx_0_0, 0))
self.connect((self.analog_fm_preemph_0_0_1_1_0, 0), (self.blocks_add_xx_0_0_0, 0))
self.connect((self.analog_fm_preemph_0_0_1_1_0, 0), (self.blocks_sub_xx_0_0_0, 0))
self.connect((self.analog_fm_preemph_0_0_1_1_0_0, 0), (self.blocks_add_xx_0_0_0_0, 0))
self.connect((self.analog_fm_preemph_0_0_1_1_0_0, 0), (self.blocks_sub_xx_0_0_0_0, 0))
self.connect((self.analog_fm_preemph_0_0_1_1_0_0_0, 0), (self.blocks_add_xx_0_0_0_0_0, 0))
self.connect((self.analog_fm_preemph_0_0_1_1_0_0_0, 0), (self.blocks_sub_xx_0_0_0_0_0, 0))
self.connect((self.analog_frequency_modulator_fc_0, 0), (self.rational_resampler_xxx_2, 0))
self.connect((self.analog_frequency_modulator_fc_0_0, 0), (self.rational_resampler_xxx_2_1, 0))
self.connect((self.analog_frequency_modulator_fc_0_0_0, 0), (self.rational_resampler_xxx_2_1_0, 0))
self.connect((self.analog_frequency_modulator_fc_0_0_0_0, 0), (self.rational_resampler_xxx_2_1_0_0, 0))
self.connect((self.analog_frequency_modulator_fc_0_0_0_0_0, 0), (self.rational_resampler_xxx_2_1_0_0_0, 0))
self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx_1, 1))
self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx_1_0, 1))
self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx_1_0_0, 1))
self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx_1_0_0_0, 1))
self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx_1_0_0_0_0, 1))
self.connect((self.analog_sig_source_x_0_0, 0), (self.blocks_multiply_xx_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), (self.blocks_multiply_xx_0_0_0, 0))
self.connect((self.analog_sig_source_x_0_0, 0), (self.blocks_multiply_xx_0_0_0_0, 0))
self.connect((self.analog_sig_source_x_0_0, 0), (self.blocks_multiply_xx_0_0_0_0_0, 0))
self.connect((self.analog_sig_source_x_1, 0), (self.blocks_multiply_xx_1, 1))
self.connect((self.analog_sig_source_x_1_0, 0), (self.blocks_multiply_xx_1_0, 1))
self.connect((self.analog_sig_source_x_1_0_0, 0), (self.blocks_multiply_xx_1_0_0, 1))
self.connect((self.analog_sig_source_x_1_0_0_0, 0), (self.blocks_multiply_xx_1_0_0_0, 1))
self.connect((self.band_pass_filter_0, 0), (self.blocks_add_xx_1, 2))
self.connect((self.band_pass_filter_0_0, 0), (self.blocks_add_xx_1_0, 2))
self.connect((self.band_pass_filter_0_0_0, 0), (self.blocks_add_xx_1_0_0, 2))
self.connect((self.band_pass_filter_0_0_0_0, 0), (self.blocks_add_xx_1_0_0_0, 2))
self.connect((self.band_pass_filter_0_0_0_0_0, 0), (self.blocks_add_xx_1_0_0_0_0, 2))
self.connect((self.blocks_add_xx_0, 0), (self.rational_resampler_xxx_0_0, 0))
self.connect((self.blocks_add_xx_0_0, 0), (self.rational_resampler_xxx_0_0_0, 0))
self.connect((self.blocks_add_xx_0_0_0, 0), (self.rational_resampler_xxx_0_0_0_0, 0))
self.connect((self.blocks_add_xx_0_0_0_0, 0), (self.rational_resampler_xxx_0_0_0_0_0, 0))
self.connect((self.blocks_add_xx_0_0_0_0_0, 0), (self.rational_resampler_xxx_0_0_0_0_0_0, 0))
self.connect((self.blocks_add_xx_1, 0), (self.analog_frequency_modulator_fc_0, 0))
self.connect((self.blocks_add_xx_1_0, 0), (self.analog_frequency_modulator_fc_0_0, 0))
self.connect((self.blocks_add_xx_1_0_0, 0), (self.analog_frequency_modulator_fc_0_0_0, 0))
self.connect((self.blocks_add_xx_1_0_0_0, 0), (self.analog_frequency_modulator_fc_0_0_0_0, 0))
self.connect((self.blocks_add_xx_1_0_0_0_0, 0), (self.analog_frequency_modulator_fc_0_0_0_0_0, 0))
self.connect((self.blocks_add_xx_2, 0), (self.rational_resampler_xxx_2_1_1, 0))
self.connect((self.blocks_multiply_const_vxx_0, 0), (self.blocks_add_xx_2, 0))
self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.blocks_add_xx_2, 1))
self.connect((self.blocks_multiply_const_vxx_0_1, 0), (self.blocks_add_xx_2, 2))
self.connect((self.blocks_multiply_const_vxx_0_2, 0), (self.blocks_add_xx_2, 3))
self.connect((self.blocks_multiply_const_vxx_0_2_0, 0), (self.blocks_add_xx_2, 4))
self.connect((self.blocks_multiply_xx_0, 0), (self.band_pass_filter_0, 0))
self.connect((self.blocks_multiply_xx_0_0, 0), (self.band_pass_filter_0_0, 0))
self.connect((self.blocks_multiply_xx_0_0_0, 0), (self.band_pass_filter_0_0_0, 0))
self.connect((self.blocks_multiply_xx_0_0_0_0, 0), (self.band_pass_filter_0_0_0_0, 0))
self.connect((self.blocks_multiply_xx_0_0_0_0_0, 0), (self.band_pass_filter_0_0_0_0_0, 0))
self.connect((self.blocks_multiply_xx_1, 0), (self.blocks_multiply_const_vxx_0_0, 0))
self.connect((self.blocks_multiply_xx_1_0, 0), (self.blocks_multiply_const_vxx_0_1, 0))
self.connect((self.blocks_multiply_xx_1_0_0, 0), (self.blocks_multiply_const_vxx_0_2, 0))
self.connect((self.blocks_multiply_xx_1_0_0_0, 0), (self.blocks_multiply_const_vxx_0_2_0, 0))
self.connect((self.blocks_sub_xx_0, 0), (self.rational_resampler_xxx_0, 0))
self.connect((self.blocks_sub_xx_0_0, 0), (self.rational_resampler_xxx_0_1, 0))
self.connect((self.blocks_sub_xx_0_0_0, 0), (self.rational_resampler_xxx_0_1_0, 0))
self.connect((self.blocks_sub_xx_0_0_0_0, 0), (self.rational_resampler_xxx_0_1_0_0, 0))
self.connect((self.blocks_sub_xx_0_0_0_0_0, 0), (self.rational_resampler_xxx_0_1_0_0_0, 0))
self.connect((self.blocks_wavfile_source_0, 0), (self.low_pass_filter_0, 0))
self.connect((self.blocks_wavfile_source_0, 1), (self.low_pass_filter_0_0, 0))
self.connect((self.blocks_wavfile_source_0_0, 1), (self.low_pass_filter_0_0_0, 0))
self.connect((self.blocks_wavfile_source_0_0, 0), (self.low_pass_filter_0_1, 0))
self.connect((self.blocks_wavfile_source_0_0_0, 1), (self.low_pass_filter_0_0_0_0, 0))
self.connect((self.blocks_wavfile_source_0_0_0, 0), (self.low_pass_filter_0_1_0, 0))
self.connect((self.blocks_wavfile_source_0_0_0_0, 1), (self.low_pass_filter_0_0_0_0_0, 0))
self.connect((self.blocks_wavfile_source_0_0_0_0, 0), (self.low_pass_filter_0_1_0_0, 0))
self.connect((self.blocks_wavfile_source_0_0_0_0_0, 1), (self.low_pass_filter_0_0_0_0_0_0, 0))
self.connect((self.blocks_wavfile_source_0_0_0_0_0, 0), (self.low_pass_filter_0_1_0_0_0, 0))
self.connect((self.low_pass_filter_0, 0), (self.analog_fm_preemph_0_0_1, 0))
self.connect((self.low_pass_filter_0_0, 0), (self.analog_fm_preemph_0_0_1_0, 0))
self.connect((self.low_pass_filter_0_0_0, 0), (self.analog_fm_preemph_0_0_1_0_0, 0))
self.connect((self.low_pass_filter_0_0_0_0, 0), (self.analog_fm_preemph_0_0_1_0_0_0, 0))
self.connect((self.low_pass_filter_0_0_0_0_0, 0), (self.analog_fm_preemph_0_0_1_0_0_0_0, 0))
self.connect((self.low_pass_filter_0_0_0_0_0_0, 0), (self.analog_fm_preemph_0_0_1_0_0_0_0_0, 0))
self.connect((self.low_pass_filter_0_1, 0), (self.analog_fm_preemph_0_0_1_1, 0))
self.connect((self.low_pass_filter_0_1_0, 0), (self.analog_fm_preemph_0_0_1_1_0, 0))
self.connect((self.low_pass_filter_0_1_0_0, 0), (self.analog_fm_preemph_0_0_1_1_0_0, 0))
self.connect((self.low_pass_filter_0_1_0_0_0, 0), (self.analog_fm_preemph_0_0_1_1_0_0_0, 0))
self.connect((self.rational_resampler_xxx_0, 0), (self.blocks_multiply_xx_0, 1))
self.connect((self.rational_resampler_xxx_0_0, 0), (self.blocks_add_xx_1, 0))
self.connect((self.rational_resampler_xxx_0_0_0, 0), (self.blocks_add_xx_1_0, 0))
self.connect((self.rational_resampler_xxx_0_0_0_0, 0), (self.blocks_add_xx_1_0_0, 0))
self.connect((self.rational_resampler_xxx_0_0_0_0_0, 0), (self.blocks_add_xx_1_0_0_0, 0))
self.connect((self.rational_resampler_xxx_0_0_0_0_0_0, 0), (self.blocks_add_xx_1_0_0_0_0, 0))
self.connect((self.rational_resampler_xxx_0_1, 0), (self.blocks_multiply_xx_0_0, 1))
self.connect((self.rational_resampler_xxx_0_1_0, 0), (self.blocks_multiply_xx_0_0_0, 1))
self.connect((self.rational_resampler_xxx_0_1_0_0, 0), (self.blocks_multiply_xx_0_0_0_0, 1))
self.connect((self.rational_resampler_xxx_0_1_0_0_0, 0), (self.blocks_multiply_xx_0_0_0_0_0, 1))
self.connect((self.rational_resampler_xxx_2, 0), (self.blocks_multiply_const_vxx_0, 0))
self.connect((self.rational_resampler_xxx_2_1, 0), (self.blocks_multiply_xx_1, 0))
self.connect((self.rational_resampler_xxx_2_1_0, 0), (self.blocks_multiply_xx_1_0, 0))
self.connect((self.rational_resampler_xxx_2_1_0_0, 0), (self.blocks_multiply_xx_1_0_0, 0))
self.connect((self.rational_resampler_xxx_2_1_0_0_0, 0), (self.blocks_multiply_xx_1_0_0_0, 0))
self.connect((self.rational_resampler_xxx_2_1_1, 0), (self.pluto_sink_0, 0))
self.connect((self.rational_resampler_xxx_2_1_1, 0), (self.wxgui_fftsink2_1, 0))
self.connect((self.rational_resampler_xxx_2_1_1, 0), (self.wxgui_waterfallsink2_0, 0))
def get_samp_rate(self):
return self.samp_rate
def set_samp_rate(self, samp_rate):
self.samp_rate = samp_rate
self.low_pass_filter_0_1_0_0_0.set_taps(firdes.low_pass(1, self.samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_1_0_0.set_taps(firdes.low_pass(1, self.samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_1_0.set_taps(firdes.low_pass(1, self.samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_1.set_taps(firdes.low_pass(1, self.samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_0_0_0_0_0.set_taps(firdes.low_pass(1, self.samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_0_0_0_0.set_taps(firdes.low_pass(1, self.samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_0_0_0.set_taps(firdes.low_pass(1, self.samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_0_0.set_taps(firdes.low_pass(1, self.samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0_0.set_taps(firdes.low_pass(1, self.samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.samp_rate, 15000, 2000, firdes.WIN_HAMMING, 6.76))
self.band_pass_filter_0_0_0_0_0.set_taps(firdes.band_pass(1, self.samp_rate*4, 23000, 53000, 2000, firdes.WIN_HAMMING, 6.76))
self.band_pass_filter_0_0_0_0.set_taps(firdes.band_pass(1, self.samp_rate*4, 23000, 53000, 2000, firdes.WIN_HAMMING, 6.76))
self.band_pass_filter_0_0_0.set_taps(firdes.band_pass(1, self.samp_rate*4, 23000, 53000, 2000, firdes.WIN_HAMMING, 6.76))
self.band_pass_filter_0_0.set_taps(firdes.band_pass(1, self.samp_rate*4, 23000, 53000, 2000, firdes.WIN_HAMMING, 6.76))
self.band_pass_filter_0.set_taps(firdes.band_pass(1, self.samp_rate*4, 23000, 53000, 2000, firdes.WIN_HAMMING, 6.76))
self.analog_sig_source_x_0_0.set_sampling_freq(self.samp_rate*4)
self.analog_sig_source_x_0.set_sampling_freq(self.samp_rate*4)
def get_Sendefrequenz_0(self):
return self.Sendefrequenz_0
def set_Sendefrequenz_0(self, Sendefrequenz_0):
self.Sendefrequenz_0 = Sendefrequenz_0
self._Sendefrequenz_0_slider.set_value(self.Sendefrequenz_0)
self._Sendefrequenz_0_text_box.set_value(self.Sendefrequenz_0)
self.wxgui_waterfallsink2_0.set_baseband_freq(self.Sendefrequenz_0)
self.wxgui_fftsink2_1.set_baseband_freq(self.Sendefrequenz_0)
self.pluto_sink_0.set_params(int(self.Sendefrequenz_0), int(2084000), int(20000000), 0, '', True)
def get_Pilot_Amplitude(self):
return self.Pilot_Amplitude
def set_Pilot_Amplitude(self, Pilot_Amplitude):
self.Pilot_Amplitude = Pilot_Amplitude
self._Pilot_Amplitude_slider.set_value(self.Pilot_Amplitude)
self._Pilot_Amplitude_text_box.set_value(self.Pilot_Amplitude)
self.analog_sig_source_x_0.set_amplitude(self.Pilot_Amplitude)
def get_Amplitude38kHz(self):
return self.Amplitude38kHz
def set_Amplitude38kHz(self, Amplitude38kHz):
self.Amplitude38kHz = Amplitude38kHz
self._Amplitude38kHz_slider.set_value(self.Amplitude38kHz)
self._Amplitude38kHz_text_box.set_value(self.Amplitude38kHz)
self.analog_sig_source_x_0_0.set_amplitude(self.Amplitude38kHz)
def main(top_block_cls=pluto_multiple_stereoFM_tx, options=None):
tb = top_block_cls()
tb.Start(True)
tb.Wait()
if __name__ == '__main__':
main()
Mit freundlichen Grüßen Ronald