https://wiki.opendigitalradio.org/index.php?title=Stereo_FM_transmitter_using_gnuradio&feed=atom&action=history
Stereo FM transmitter using gnuradio - Revision history
2024-03-28T11:26:01Z
Revision history for this page on the wiki
MediaWiki 1.19.20+dfsg-0+deb7u3
https://wiki.opendigitalradio.org/index.php?title=Stereo_FM_transmitter_using_gnuradio&diff=964&oldid=prev
Coinchon at 09:08, 15 April 2013
2013-04-15T09:08:35Z
<p></p>
<table class='diff diff-contentalign-left'>
<tr valign='top'>
<td colspan='1' style="background-color: white; color:black;">← Older revision</td>
<td colspan='1' style="background-color: white; color:black;">Revision as of 09:08, 15 April 2013</td>
</tr></table>
Coinchon
https://wiki.opendigitalradio.org/index.php?title=Stereo_FM_transmitter_using_gnuradio&diff=314&oldid=prev
Coinchon at 20:32, 2 January 2010
2010-01-02T20:32:10Z
<p></p>
<table class='diff diff-contentalign-left'>
<tr valign='top'>
<td colspan='1' style="background-color: white; color:black;">← Older revision</td>
<td colspan='1' style="background-color: white; color:black;">Revision as of 20:32, 2 January 2010</td>
</tr></table>
Coinchon
https://wiki.opendigitalradio.org/index.php?title=Stereo_FM_transmitter_using_gnuradio&diff=301&oldid=prev
Coinchon at 18:15, 2 January 2010
2010-01-02T18:15:38Z
<p></p>
<table class='diff diff-contentalign-left'>
<tr valign='top'>
<td colspan='1' style="background-color: white; color:black;">← Older revision</td>
<td colspan='1' style="background-color: white; color:black;">Revision as of 18:15, 2 January 2010</td>
</tr></table>
Coinchon
https://wiki.opendigitalradio.org/index.php?title=Stereo_FM_transmitter_using_gnuradio&diff=300&oldid=prev
Coinchon: /* GRC Schema */
2010-01-02T18:13:35Z
<p><span dir="auto"><span class="autocomment">GRC Schema</span></span></p>
<table class='diff diff-contentalign-left'>
<tr valign='top'>
<td colspan='1' style="background-color: white; color:black;">← Older revision</td>
<td colspan='1' style="background-color: white; color:black;">Revision as of 18:13, 2 January 2010</td>
</tr></table>
Coinchon
https://wiki.opendigitalradio.org/index.php?title=Stereo_FM_transmitter_using_gnuradio&diff=298&oldid=prev
Coinchon at 18:12, 2 January 2010
2010-01-02T18:12:39Z
<p></p>
<table class='diff diff-contentalign-left'>
<tr valign='top'>
<td colspan='1' style="background-color: white; color:black;">← Older revision</td>
<td colspan='1' style="background-color: white; color:black;">Revision as of 18:12, 2 January 2010</td>
</tr></table>
Coinchon
https://wiki.opendigitalradio.org/index.php?title=Stereo_FM_transmitter_using_gnuradio&diff=297&oldid=prev
Coinchon: New page: ==Python code== #!/usr/bin/env python ################################################## # Gnuradio Python Flow Graph # Title: FM Stereo Transmitter # Author: Mathias Coinchon # G...
2010-01-02T18:12:02Z
<p>New page: ==Python code== #!/usr/bin/env python ################################################## # Gnuradio Python Flow Graph # Title: FM Stereo Transmitter # Author: Mathias Coinchon # G...</p>
<p><b>New page</b></p><div><br />
<br />
==Python code==<br />
<br />
#!/usr/bin/env python<br />
##################################################<br />
# Gnuradio Python Flow Graph<br />
# Title: FM Stereo Transmitter<br />
# Author: Mathias Coinchon<br />
# Generated: Sat Jan 2 19:06:07 2010<br />
##################################################<br />
<br />
from gnuradio import blks2<br />
from gnuradio import gr<br />
from gnuradio.eng_option import eng_option<br />
from gnuradio.gr import firdes<br />
from gnuradio.wxgui import fftsink2<br />
from gnuradio.wxgui import forms<br />
from grc_gnuradio import usrp as grc_usrp<br />
from grc_gnuradio import wxgui as grc_wxgui<br />
from optparse import OptionParser<br />
import wx<br />
<br />
class FM_stereo_tx(grc_wxgui.top_block_gui):<br />
<br />
def __init__(self):<br />
grc_wxgui.top_block_gui.__init__(self, title="FM Stereo Transmitter")<br />
<br />
##################################################<br />
# Variables<br />
##################################################<br />
self.st_gain = st_gain = 10<br />
self.samp_rate = samp_rate = 32000<br />
self.pilot_gain = pilot_gain = 80e-3<br />
self.mpx_rate = mpx_rate = 160000<br />
self.Mono_gain = Mono_gain = 0.3<br />
self.FM_freq = FM_freq = 107900000<br />
<br />
##################################################<br />
# Controls<br />
##################################################<br />
_st_gain_sizer = wx.BoxSizer(wx.VERTICAL)<br />
self._st_gain_text_box = forms.text_box(<br />
parent=self.GetWin(),<br />
sizer=_st_gain_sizer,<br />
value=self.st_gain,<br />
callback=self.set_st_gain,<br />
label="Stereo gain",<br />
converter=forms.float_converter(),<br />
proportion=0,<br />
)<br />
self._st_gain_slider = forms.slider(<br />
parent=self.GetWin(),<br />
sizer=_st_gain_sizer,<br />
value=self.st_gain,<br />
callback=self.set_st_gain,<br />
minimum=0,<br />
maximum=100,<br />
num_steps=100,<br />
style=wx.SL_HORIZONTAL,<br />
cast=float,<br />
proportion=1,<br />
)<br />
self.Add(_st_gain_sizer)<br />
_pilot_gain_sizer = wx.BoxSizer(wx.VERTICAL)<br />
self._pilot_gain_text_box = forms.text_box(<br />
parent=self.GetWin(),<br />
sizer=_pilot_gain_sizer,<br />
value=self.pilot_gain,<br />
callback=self.set_pilot_gain,<br />
label='pilot_gain',<br />
converter=forms.float_converter(),<br />
proportion=0,<br />
)<br />
self._pilot_gain_slider = forms.slider(<br />
parent=self.GetWin(),<br />
sizer=_pilot_gain_sizer,<br />
value=self.pilot_gain,<br />
callback=self.set_pilot_gain,<br />
minimum=0,<br />
maximum=1,<br />
num_steps=100,<br />
style=wx.SL_HORIZONTAL,<br />
cast=float,<br />
proportion=1,<br />
)<br />
self.Add(_pilot_gain_sizer)<br />
_Mono_gain_sizer = wx.BoxSizer(wx.VERTICAL)<br />
self._Mono_gain_text_box = forms.text_box(<br />
parent=self.GetWin(),<br />
sizer=_Mono_gain_sizer,<br />
value=self.Mono_gain,<br />
callback=self.set_Mono_gain,<br />
label="Mono signal gain",<br />
converter=forms.float_converter(),<br />
proportion=0,<br />
)<br />
self._Mono_gain_slider = forms.slider(<br />
parent=self.GetWin(),<br />
sizer=_Mono_gain_sizer,<br />
value=self.Mono_gain,<br />
callback=self.set_Mono_gain,<br />
minimum=0,<br />
maximum=1,<br />
num_steps=100,<br />
style=wx.SL_HORIZONTAL,<br />
cast=float,<br />
proportion=1,<br />
)<br />
self.Add(_Mono_gain_sizer)<br />
_FM_freq_sizer = wx.BoxSizer(wx.VERTICAL)<br />
self._FM_freq_text_box = forms.text_box(<br />
parent=self.GetWin(),<br />
sizer=_FM_freq_sizer,<br />
value=self.FM_freq,<br />
callback=self.set_FM_freq,<br />
label="FM Frequency",<br />
converter=forms.float_converter(),<br />
proportion=0,<br />
)<br />
self._FM_freq_slider = forms.slider(<br />
parent=self.GetWin(),<br />
sizer=_FM_freq_sizer,<br />
value=self.FM_freq,<br />
callback=self.set_FM_freq,<br />
minimum=87500000,<br />
maximum=108000000,<br />
num_steps=205,<br />
style=wx.SL_HORIZONTAL,<br />
cast=float,<br />
proportion=1,<br />
)<br />
self.Add(_FM_freq_sizer)<br />
<br />
##################################################<br />
# Blocks<br />
##################################################<br />
self.Audio_A_resampler = blks2.rational_resampler_fff(<br />
interpolation=5,<br />
decimation=1,<br />
taps=None,<br />
fractional_bw=None,<br />
)<br />
self.Audio_B_resampler = blks2.rational_resampler_fff(<br />
interpolation=5,<br />
decimation=1,<br />
taps=None,<br />
fractional_bw=None,<br />
)<br />
self.MPX_upsampler = blks2.rational_resampler_fff(<br />
interpolation=4,<br />
decimation=1,<br />
taps=None,<br />
fractional_bw=None,<br />
)<br />
self.Pilot = gr.sig_source_f(mpx_rate, gr.GR_SIN_WAVE, 19000, pilot_gain, 0)<br />
self.band_pass_filter_0 = gr.fir_filter_fff(1, firdes.band_pass(<br />
st_gain, mpx_rate, 23e3, 53e3, 2e3, firdes.WIN_HAMMING, 6.76))<br />
self.blks2_fm_preemph_0 = blks2.fm_preemph(fs=mpx_rate, tau=50e-6)<br />
self.gr_add_xx_0 = gr.add_vff(1)<br />
self.gr_add_xx_1 = gr.add_vff(1)<br />
self.gr_file_source_0 = gr.file_source(gr.sizeof_short*2, "/home/mc/FM_demo/stream_32k.fifo", True)<br />
self.gr_frequency_modulator_fc_0 = gr.frequency_modulator_fc(0.98)<br />
self.gr_multiply_const_vxx_0 = gr.multiply_const_vcc((32768, ))<br />
self.gr_multiply_const_vxx_1 = gr.multiply_const_vff((0.00003, ))<br />
self.gr_multiply_const_vxx_3 = gr.multiply_const_vff((0.00003, ))<br />
self.gr_multiply_xx_1 = gr.multiply_vff(1)<br />
self.gr_short_to_float_0 = gr.short_to_float()<br />
self.gr_short_to_float_1 = gr.short_to_float()<br />
self.gr_sub_xx_0 = gr.sub_ff(1)<br />
self.gr_vector_to_streams_0 = gr.vector_to_streams(gr.sizeof_short*1, 2)<br />
self.low_pass_filter_0 = gr.fir_filter_fff(1, firdes.low_pass(<br />
Mono_gain, mpx_rate, 15e3, 2e3, firdes.WIN_HAMMING, 6.76))<br />
self.st_38k_carrier = gr.sig_source_f(mpx_rate, gr.GR_SIN_WAVE, 38000, 30e-3, 0)<br />
self.usrp_simple_sink_x_0 = grc_usrp.simple_sink_c(which=0, side="B")<br />
self.usrp_simple_sink_x_0.set_interp_rate(200)<br />
self.usrp_simple_sink_x_0.set_frequency(-FM_freq, verbose=True)<br />
self.usrp_simple_sink_x_0.set_gain(0)<br />
self.usrp_simple_sink_x_0.set_enable(True)<br />
self.wxgui_fftsink2_0 = fftsink2.fft_sink_f(<br />
self.GetWin(),<br />
baseband_freq=0,<br />
y_per_div=10,<br />
y_divs=10,<br />
ref_level=50,<br />
sample_rate=mpx_rate,<br />
fft_size=1024,<br />
fft_rate=30,<br />
average=False,<br />
avg_alpha=None,<br />
title="Baseband spectrum",<br />
peak_hold=False,<br />
)<br />
self.Add(self.wxgui_fftsink2_0.win)<br />
<br />
##################################################<br />
# Connections<br />
##################################################<br />
self.connect((self.Audio_A_resampler, 0), (self.gr_add_xx_1, 0))<br />
self.connect((self.Audio_B_resampler, 0), (self.gr_add_xx_1, 1))<br />
self.connect((self.Audio_A_resampler, 0), (self.gr_sub_xx_0, 0))<br />
self.connect((self.gr_multiply_xx_1, 0), (self.band_pass_filter_0, 0))<br />
self.connect((self.st_38k_carrier, 0), (self.gr_multiply_xx_1, 1))<br />
self.connect((self.low_pass_filter_0, 0), (self.gr_add_xx_0, 0))<br />
self.connect((self.gr_add_xx_1, 0), (self.low_pass_filter_0, 0))<br />
self.connect((self.gr_frequency_modulator_fc_0, 0), (self.gr_multiply_const_vxx_0, 0))<br />
self.connect((self.MPX_upsampler, 0), (self.gr_frequency_modulator_fc_0, 0))<br />
self.connect((self.blks2_fm_preemph_0, 0), (self.MPX_upsampler, 0))<br />
self.connect((self.gr_add_xx_0, 0), (self.blks2_fm_preemph_0, 0))<br />
self.connect((self.Pilot, 0), (self.gr_add_xx_0, 2))<br />
self.connect((self.band_pass_filter_0, 0), (self.gr_add_xx_0, 1))<br />
self.connect((self.gr_add_xx_0, 0), (self.wxgui_fftsink2_0, 0))<br />
self.connect((self.gr_sub_xx_0, 0), (self.gr_multiply_xx_1, 0))<br />
self.connect((self.Audio_B_resampler, 0), (self.gr_sub_xx_0, 1))<br />
self.connect((self.gr_multiply_const_vxx_0, 0), (self.usrp_simple_sink_x_0, 0))<br />
self.connect((self.gr_file_source_0, 0), (self.gr_vector_to_streams_0, 0))<br />
self.connect((self.gr_short_to_float_1, 0), (self.gr_multiply_const_vxx_1, 0))<br />
self.connect((self.gr_multiply_const_vxx_1, 0), (self.Audio_A_resampler, 0))<br />
self.connect((self.gr_short_to_float_0, 0), (self.gr_multiply_const_vxx_3, 0))<br />
self.connect((self.gr_multiply_const_vxx_3, 0), (self.Audio_B_resampler, 0))<br />
self.connect((self.gr_vector_to_streams_0, 1), (self.gr_short_to_float_1, 0))<br />
self.connect((self.gr_vector_to_streams_0, 0), (self.gr_short_to_float_0, 0))<br />
<br />
def set_st_gain(self, st_gain):<br />
self.st_gain = st_gain<br />
self.band_pass_filter_0.set_taps(firdes.band_pass(self.st_gain, self.mpx_rate, 23e3, 53e3, 2e3, firdes.WIN_HAMMING, 6.76))<br />
self._st_gain_slider.set_value(self.st_gain)<br />
self._st_gain_text_box.set_value(self.st_gain)<br />
<br />
def set_samp_rate(self, samp_rate):<br />
self.samp_rate = samp_rate<br />
<br />
def set_pilot_gain(self, pilot_gain):<br />
self.pilot_gain = pilot_gain<br />
self.Pilot.set_amplitude(self.pilot_gain)<br />
self._pilot_gain_slider.set_value(self.pilot_gain)<br />
self._pilot_gain_text_box.set_value(self.pilot_gain)<br />
<br />
def set_mpx_rate(self, mpx_rate):<br />
self.mpx_rate = mpx_rate<br />
self.band_pass_filter_0.set_taps(firdes.band_pass(self.st_gain, self.mpx_rate, 23e3, 53e3, 2e3, firdes.WIN_HAMMING, 6.76))<br />
self.low_pass_filter_0.set_taps(firdes.low_pass(self.Mono_gain, self.mpx_rate, 15e3, 2e3, firdes.WIN_HAMMING, 6.76))<br />
self.Pilot.set_sampling_freq(self.mpx_rate)<br />
self.st_38k_carrier.set_sampling_freq(self.mpx_rate)<br />
self.wxgui_fftsink2_0.set_sample_rate(self.mpx_rate)<br />
<br />
def set_Mono_gain(self, Mono_gain):<br />
self.Mono_gain = Mono_gain<br />
self.low_pass_filter_0.set_taps(firdes.low_pass(self.Mono_gain, self.mpx_rate, 15e3, 2e3, firdes.WIN_HAMMING, 6.76))<br />
self._Mono_gain_slider.set_value(self.Mono_gain)<br />
self._Mono_gain_text_box.set_value(self.Mono_gain)<br />
<br />
def set_FM_freq(self, FM_freq):<br />
self.FM_freq = FM_freq<br />
self.usrp_simple_sink_x_0.set_frequency(-self.FM_freq)<br />
self._FM_freq_slider.set_value(self.FM_freq)<br />
self._FM_freq_text_box.set_value(self.FM_freq)<br />
<br />
if __name__ == '__main__':<br />
parser = OptionParser(option_class=eng_option, usage="%prog: [options]")<br />
(options, args) = parser.parse_args()<br />
tb = FM_stereo_tx()<br />
tb.Run(True)</div>
Coinchon