Difference between revisions of "Simple FM transmitter using gnuradio"

From OpenDigitalRadio
Jump to navigationJump to search
 
(2 intermediate revisions by the same user not shown)
Line 9: Line 9:
 
Mono FM transmission is very simple as all necessary blocks already exist in gnuradio.
 
Mono FM transmission is very simple as all necessary blocks already exist in gnuradio.
 
In this example we will show how to make a FM transmission from an mp3 stream for an Internet radio.
 
In this example we will show how to make a FM transmission from an mp3 stream for an Internet radio.
 +
Look at GRC schema or use directly python code below.
  
==GRC Schema==
+
Input file is a unix FIFO file that means that we need to feed it externally from the shell using these commands:
[[Image:FM transmitter FIFO.png]]
 
 
 
Input file is a unix FIFO file that means that we need to feed it externally from the shell using these commands
 
  
 
Creation of the FIFO file (once):
 
Creation of the FIFO file (once):
Line 22: Line 20:
  
 
Option "-m" is to convert stream to mono, "-r32000" perform sample rate conversion to 32kHz.
 
Option "-m" is to convert stream to mono, "-r32000" perform sample rate conversion to 32kHz.
 +
 +
==Python code==
 +
Code generated by GRC
 +
 +
#!/usr/bin/env python
 +
##################################################
 +
# Gnuradio Python Flow Graph
 +
# Title: Simple FM Transmitter FIFO input
 +
# Author: Mathias Coinchon
 +
# Description: Simple FM Transmitter using FIFO
 +
# Generated: Sat Jan  2 18:56:38 2010
 +
##################################################
 +
 +
from gnuradio import blks2
 +
from gnuradio import gr
 +
from gnuradio.eng_option import eng_option
 +
from gnuradio.wxgui import forms
 +
from grc_gnuradio import usrp as grc_usrp
 +
from grc_gnuradio import wxgui as grc_wxgui
 +
from optparse import OptionParser
 +
import wx
 +
 +
class FM_tx_FIFO(grc_wxgui.top_block_gui):
 +
 +
def __init__(self):
 +
grc_wxgui.top_block_gui.__init__(self, title="Simple FM Transmitter FIFO input")
 +
 +
##################################################
 +
# Variables
 +
##################################################
 +
self.samp_rate = samp_rate = 32000
 +
self.FM_freq = FM_freq = 107900000
 +
 +
##################################################
 +
# Controls
 +
##################################################
 +
_FM_freq_sizer = wx.BoxSizer(wx.VERTICAL)
 +
self._FM_freq_text_box = forms.text_box(
 +
parent=self.GetWin(),
 +
sizer=_FM_freq_sizer,
 +
value=self.FM_freq,
 +
callback=self.set_FM_freq,
 +
label="FM Frequency",
 +
converter=forms.float_converter(),
 +
proportion=0,
 +
)
 +
self._FM_freq_slider = forms.slider(
 +
parent=self.GetWin(),
 +
sizer=_FM_freq_sizer,
 +
value=self.FM_freq,
 +
callback=self.set_FM_freq,
 +
minimum=87500000,
 +
maximum=108000000,
 +
num_steps=205,
 +
style=wx.SL_HORIZONTAL,
 +
cast=float,
 +
proportion=1,
 +
)
 +
self.Add(_FM_freq_sizer)
 +
 +
##################################################
 +
# Blocks
 +
##################################################
 +
self.blks2_wfm_tx_0 = blks2.wfm_tx(
 +
audio_rate=samp_rate,
 +
quad_rate=640000,
 +
tau=75e-6,
 +
max_dev=75e3,
 +
)
 +
self.gr_file_source_0 = gr.file_source(gr.sizeof_short*1, "/home/mc/FM_demo/stream_32k.fifo", True)
 +
self.gr_multiply_const_vxx_0 = gr.multiply_const_vcc((32768, ))
 +
self.gr_multiply_const_vxx_1 = gr.multiply_const_vff((0.00003, ))
 +
self.gr_short_to_float_1 = gr.short_to_float()
 +
self.usrp_simple_sink_x_0 = grc_usrp.simple_sink_c(which=0, side="B")
 +
self.usrp_simple_sink_x_0.set_interp_rate(200)
 +
self.usrp_simple_sink_x_0.set_frequency(FM_freq, verbose=True)
 +
self.usrp_simple_sink_x_0.set_gain(0)
 +
self.usrp_simple_sink_x_0.set_enable(True)
 +
 +
##################################################
 +
# Connections
 +
##################################################
 +
self.connect((self.gr_multiply_const_vxx_0, 0), (self.usrp_simple_sink_x_0, 0))
 +
self.connect((self.gr_short_to_float_1, 0), (self.gr_multiply_const_vxx_1, 0))
 +
self.connect((self.gr_file_source_0, 0), (self.gr_short_to_float_1, 0))
 +
self.connect((self.gr_multiply_const_vxx_1, 0), (self.blks2_wfm_tx_0, 0))
 +
self.connect((self.blks2_wfm_tx_0, 0), (self.gr_multiply_const_vxx_0, 0))
 +
 +
def set_samp_rate(self, samp_rate):
 +
self.samp_rate = samp_rate
 +
 +
def set_FM_freq(self, FM_freq):
 +
self.FM_freq = FM_freq
 +
self._FM_freq_slider.set_value(self.FM_freq)
 +
self._FM_freq_text_box.set_value(self.FM_freq)
 +
self.usrp_simple_sink_x_0.set_frequency(self.FM_freq)
 +
 +
if __name__ == '__main__':
 +
parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
 +
(options, args) = parser.parse_args()
 +
tb = FM_tx_FIFO()
 +
tb.Run(True)
 +
 +
==GRC Schema==
 +
[[Image:FM transmitter FIFO.png]]

Latest revision as of 19:03, 2 January 2010

Simple FM transmitter using gnuradio.

Tools needed:

  • gnuradio 3.2
  • grc (gnuradio companion)
  • mpg123
  • USRP

Mono FM transmission is very simple as all necessary blocks already exist in gnuradio. In this example we will show how to make a FM transmission from an mp3 stream for an Internet radio. Look at GRC schema or use directly python code below.

Input file is a unix FIFO file that means that we need to feed it externally from the shell using these commands:

Creation of the FIFO file (once):

mkfifo stream_32k.fifo

Decoding of an mp3 Internet radio station stream, conversion and output of raw linear samples to the FIFO:

mpg123 -r32000 -m -s  http://maxxima.mine.nu:8000 >stream_32k.fifo

Option "-m" is to convert stream to mono, "-r32000" perform sample rate conversion to 32kHz.

Python code

Code generated by GRC

#!/usr/bin/env python
##################################################
# Gnuradio Python Flow Graph
# Title: Simple FM Transmitter FIFO input
# Author: Mathias Coinchon
# Description: Simple FM Transmitter using FIFO
# Generated: Sat Jan  2 18:56:38 2010
##################################################

from gnuradio import blks2
from gnuradio import gr
from gnuradio.eng_option import eng_option
from gnuradio.wxgui import forms
from grc_gnuradio import usrp as grc_usrp
from grc_gnuradio import wxgui as grc_wxgui
from optparse import OptionParser
import wx

class FM_tx_FIFO(grc_wxgui.top_block_gui):

	def __init__(self):
		grc_wxgui.top_block_gui.__init__(self, title="Simple FM Transmitter FIFO input")

		##################################################
		# Variables
		##################################################
		self.samp_rate = samp_rate = 32000
		self.FM_freq = FM_freq = 107900000

		##################################################
		# Controls
		##################################################
		_FM_freq_sizer = wx.BoxSizer(wx.VERTICAL)
		self._FM_freq_text_box = forms.text_box(
			parent=self.GetWin(),
			sizer=_FM_freq_sizer,
			value=self.FM_freq,
			callback=self.set_FM_freq,
			label="FM Frequency",
			converter=forms.float_converter(),
			proportion=0,
		)
		self._FM_freq_slider = forms.slider(
			parent=self.GetWin(),
			sizer=_FM_freq_sizer,
			value=self.FM_freq,
			callback=self.set_FM_freq,
			minimum=87500000,
			maximum=108000000,
			num_steps=205,
			style=wx.SL_HORIZONTAL,
			cast=float,
			proportion=1,
		)
		self.Add(_FM_freq_sizer)

		##################################################
		# Blocks
		##################################################
		self.blks2_wfm_tx_0 = blks2.wfm_tx(
			audio_rate=samp_rate,
			quad_rate=640000,
			tau=75e-6,
			max_dev=75e3,
		)
		self.gr_file_source_0 = gr.file_source(gr.sizeof_short*1, "/home/mc/FM_demo/stream_32k.fifo", True)
		self.gr_multiply_const_vxx_0 = gr.multiply_const_vcc((32768, ))
		self.gr_multiply_const_vxx_1 = gr.multiply_const_vff((0.00003, ))
		self.gr_short_to_float_1 = gr.short_to_float()
		self.usrp_simple_sink_x_0 = grc_usrp.simple_sink_c(which=0, side="B")
		self.usrp_simple_sink_x_0.set_interp_rate(200)
		self.usrp_simple_sink_x_0.set_frequency(FM_freq, verbose=True)
		self.usrp_simple_sink_x_0.set_gain(0)
		self.usrp_simple_sink_x_0.set_enable(True)

		##################################################
		# Connections
		##################################################
		self.connect((self.gr_multiply_const_vxx_0, 0), (self.usrp_simple_sink_x_0, 0))
		self.connect((self.gr_short_to_float_1, 0), (self.gr_multiply_const_vxx_1, 0))
		self.connect((self.gr_file_source_0, 0), (self.gr_short_to_float_1, 0))
		self.connect((self.gr_multiply_const_vxx_1, 0), (self.blks2_wfm_tx_0, 0))
		self.connect((self.blks2_wfm_tx_0, 0), (self.gr_multiply_const_vxx_0, 0))

	def set_samp_rate(self, samp_rate):
		self.samp_rate = samp_rate

	def set_FM_freq(self, FM_freq):
		self.FM_freq = FM_freq
		self._FM_freq_slider.set_value(self.FM_freq)
		self._FM_freq_text_box.set_value(self.FM_freq)
		self.usrp_simple_sink_x_0.set_frequency(self.FM_freq)

if __name__ == '__main__':
	parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
	(options, args) = parser.parse_args()
	tb = FM_tx_FIFO()
	tb.Run(True)

GRC Schema

FM transmitter FIFO.png