Skip to content

Instantly share code, notes, and snippets.

@konsumer
Created August 18, 2020 03:04
Show Gist options
  • Save konsumer/cad485783b5719e3e89c61d04ed811ac to your computer and use it in GitHub Desktop.
Save konsumer/cad485783b5719e3e89c61d04ed811ac to your computer and use it in GitHub Desktop.
-- Wideband FM broadcast radio receiver for luajit & love
-- modified from here https://luaradio.io/examples/rtlsdr-wbfm-stereo.html
-- run with
-- luajit main.lua
-- or
-- love .
local radio = require('radio')
local function playFM(frequency)
local tune_offset = -250e3
local source = radio.RtlSdrSource(frequency + tune_offset, 1102500)
local tuner = radio.TunerBlock(tune_offset, 200e3, 5)
local fm_demod = radio.FrequencyDiscriminatorBlock(1.25)
local hilbert = radio.HilbertTransformBlock(129)
local delay = radio.DelayBlock(129)
local pilot_filter = radio.ComplexBandpassFilterBlock(129, {18e3, 20e3})
local pilot_pll = radio.PLLBlock(100, 19e3-50, 19e3+50, 2)
local mixer = radio.MultiplyConjugateBlock()
local lpr_filter = radio.LowpassFilterBlock(128, 15e3)
local lpr_am_demod = radio.ComplexToRealBlock()
local lmr_filter = radio.LowpassFilterBlock(128, 15e3)
local lmr_am_demod = radio.ComplexToRealBlock()
local l_summer = radio.AddBlock()
local l_af_deemphasis = radio.FMDeemphasisFilterBlock(75e-6)
local l_downsampler = radio.DownsamplerBlock(5)
local r_subtractor = radio.SubtractBlock()
local r_af_deemphasis = radio.FMDeemphasisFilterBlock(75e-6)
local r_downsampler = radio.DownsamplerBlock(5)
local top = radio.CompositeBlock()
local sink
if love == nil then
sink = radio.PulseAudioSink(2)
else
-- this works, but no audio output...
sink = radio.RawFileSink('samples.raw')
end
top:connect(source, tuner, fm_demod, hilbert, delay)
top:connect(hilbert, pilot_filter, pilot_pll)
top:connect(delay, 'out', mixer, 'in1')
top:connect(pilot_pll, 'out', mixer, 'in2')
top:connect(delay, lpr_filter, lpr_am_demod)
top:connect(mixer, lmr_filter, lmr_am_demod)
top:connect(lpr_am_demod, 'out', l_summer, 'in1')
top:connect(lmr_am_demod, 'out', l_summer, 'in2')
top:connect(lpr_am_demod, 'out', r_subtractor, 'in1')
top:connect(lmr_am_demod, 'out', r_subtractor, 'in2')
top:connect(l_summer, l_af_deemphasis, l_downsampler)
top:connect(r_subtractor, r_af_deemphasis, r_downsampler)
if love == nil then
top:connect(l_downsampler, 'out', sink, 'in1')
top:connect(r_downsampler, 'out', sink, 'in2')
else
top:connect(l_downsampler, 'out', sink, 'in')
end
return top
end
if love ~= nil then
function love:draw()
love.graphics.print("91.5 FM is playing", 10, 10)
end
end
local myradio = playFM(91.5e6)
myradio:run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment