本文内容、开发板及配件仅限用于学校或科研院所开展科研实验!
温馨提示:“开源SDR实验室”是北京的。
本文利用Open Digital Radio套件、LimeSDR开发板来实现DAB(Digital Audio Broadcasting)发射。实验流程包括:首先,编译安装Open Digital Radio套件;然后,编辑ODR配置文件;最后,进行发射和接收。
目录
一、DAB概述
DAB全称Digital Audio Broadcasting,即数字信号广播,是继AM、FM传统模拟广播之后的第三代广播--数字信号广播,它提供了接近CD质量的声音,广播及商机无限的附加数据服务,具有抗噪声、抗干扰、抗电波传播衰落、适合高速移动接收等优点,保证固定、携带及移动时接收信号的质量。它的出现是广播技术的一场革命。数字音频广播不仅传递音频,也可传递相关信息(路况、气象、新闻等),甚至也可传递图像。除了抗杂信、抗干扰能力强之外,传递的信号衰减性也低,使数字广播电台的发送传递距离可更远、覆盖率更广。具体参见https://baike.baidu.com/item/DAB
DAB使用宽带广播技术,通常在III频段(174–240 MHz)和L频段(1.452–1.492 GHz)中为其分配了频谱。从OSI模型协议栈的角度来看,DAB上使用的技术位于以下几层:音频编解码器位于表示层。 在它下面的是数据链路层,负责统计时分复用和帧同步。 最后,物理层包含纠错编码,OFDM调制,以及无线传输和接收数据。DAB+是DAB的升级版本,负责DAB标准的组织WorldDAB在2006年采用HE-AAC v2音频编解码器(也称为eAAC+)编码并同时宣布了DAB +,这是DAB标准的重大升级。https://en.wikipedia.org/wiki/Digital_Audio_Broadcasting#Technology
二、实验硬件软件
硬件---LimeSDR-USB、拉杆天线
https://item.taobao.com/item.htm?spm=2013.1.w4023-13255721712.10.7d63676fEZFnks&id=563602659653
软件---Ubuntu运行支持Limesdr、SoapySDR、Pothos的环境,Open Digital Radio套件。
如图所示,实验中我们主要用到的软件有四个,分别为ODR-PADENC、ODR-AUDIOENC、ODR-DABMUX、ODR-DABMOD。其中ODR-AUDIOENC会自动调用ODR-PADENC,它们的作用是将音频文件编码成ZeroMQ发送给ODR-DABMUX模块,ODR-DABMUX能够将多路音频信号合并,并发送给ODR-DABMOD模块,ODR-DABMOD模块负责调制,并通过软件无线电发送DAB信号。
三、编译安装
1、安装autoconf
sudo apt-get install autoconf
我这里由于之前已经安装过了,所以运行上述命令后,显示如下图。
2、下载ODR套件相关代码
首先,git下载ODR套件,ODR-DabMod、ODR-DabMux、ODR-AudioEnc、ODR-PadEnc。
我的习惯是将所有与SDR实验相关的代码都下载到我的SDR文件夹中,cd进入SDR文件夹,然后依次执行以下四个clone命令。
git clone https://github.com/Opendigitalradio/ODR-DabMod
git clone https://github.com/Opendigitalradio/ODR-DabMux
git clone https://github.com/Opendigitalradio/ODR-AudioEnc
git clone https://github.com/Opendigitalradio/ODR-PadEnc
3、安装ODR-DabMod
cd ODR-DabMod
./bootstrap.sh
./configure --disable-output-uhd
make
sudo make install
sudo ldconfig
注意:如果在./configure这句命令不加—disable-output-uhd的话,可能会碰到如下的问题,
当我们用了./configure --disable-output-uhd之后,就会得到如下结果,
4、安装ODR-DabMux
首先安装依赖:
sudo apt-get install build-essential libzmq5-dev automake libboost-system-dev libcurl4-openssl-dev
然后再进行编译安装:
cd ODR-DabMux
./bootstrap.sh
./configure
make
sudo make install
sudo ldconfig
5、安装ODR-AudioEnc
首先安装依赖:
sudo apt-get install libvlc-dev vlc-data vlc libvlc-dev
sudo apt-get install libjack-jackd2-dev jackd2
sudo apt-get install libasound2-dev libasound2
执行上述第两条命令过程中,会有提示界面弹出来,选择yes即可。
然后再进行编译安装:
cd ODR-AudioEnc
./bootstrap
./configure --enable-alsa --enable-jack --enable-vlc
make
sudo make install
sudo ldconfig
6、安装welle.io软件
welle.io软件配合RTL SDR可实现DAB信号接收,根据你的电脑系统下载相应的安装版本,wello.io可以与你的DAB发射在同一个电脑上(如Ubuntu),也可以在另外一个windows电脑上运行。
注意:如果你是Ubuntu 16.04系统上运行welle.io,可能会碰到如下问题:
搜了一下,找到了这个,https://github.com/OpenVR-Advanced-Settings/OpenVR-AdvancedSettings/issues/266
找到问题所在,缺少3.4.22。
四、ODR软件配置
1、ODR-DabMod的配置
创建文件dabmod.ini【我已创建配置好了该文件,请在百度云盘下载,文件中的#后边的是我自己添加的注释文字,仅供参考】,并写入以下内容后将dabmod.ini文件存放在DabMod的文件夹中,具体位置自己定就行,今后运行ODR-DABMod命令时,确保你终端所在路径下有这个dabmod.ini文件即可。
[remotecontrol]#远程控制配置
telnet=1
telnetport=2121
zmqctrl=1
zmqctrlendpoint=tcp://127.0.0.1:9400
[log]#日志配置
syslog=0
filelog=0
filename=odr-dabmod.log
[input]#输入配置
transport=zeromq#输入的编码类型
source=tcp://localhost:9100#输入监听的ip地址及端口
max_frames_queued=100#输入缓冲区最大值
[modulator]#调制配置
gainmode=var#增益模式,可选fix、max、var
digital_gain=0.8#数字增益
rate=2048000#输出信号采样率
[cfr]
enable=0
clip=50.0
error_clip=0.1
[firfilter]#是否启用fir滤波
enabled=1
[poly]# 使用无记忆多边形预失真
enabled=0
polycoeffile=polyCoefs
[output]#输出选择,由于Limesdr通过soapy驱动,这里我们使用soapysdr
output=soapysdr
[soapyoutput]#针对limesdr硬件进行的配置,这些配置方式与Limesuite的ini文件配置用法相同
device=
master_clock_rate=32768000
txgain=40
channel=9C#我们将发射频率设为9C信道(206.352MHz),若自定义中心频率,改为frequency=xxx
[delaymanagement]# 用于运行单频网络
synchronous=0
mutenotimestamps=0
offset=0.002
[tii]#发射机识别信息,这里我们直接禁用
enable=0
comb=1
pattern=11
old_variant=0
2、ODR-DabMux的配置
创建文件dabmux.mux【我已创建配置好了该文件,请在百度云盘下载,文件中的#后边的是我自己添加的注释文字,仅供参考】,并写入以下内容后将dabmux.mux文件存放在DabMux的文件夹中,具体位置自己定就行,今后运行ODR-DABMux命令时,确保你终端所在路径下有这个dabmux.mux文件即可。
general {
dabmode 1
nbframes 0
tist true
}
remotecontrol { telnetport 0 }
ensemble {
id 0x4fff
ecc 0xec
local-time-offset auto#自动计算本地时间
international-table 1
label "DAB+ Radio Test"#电台标签
shortlabel "DAB+Test"#短标签
}
services {
srv-p1 { label "EA Radio" }#子频道1标签
srv-p2 { label "Choice FM" }#子频道2标签
srv-p3 { label "Clouds FM" }#子频道3标签
}
subchannels { #对子频道进行具体的配置
sub-p1 { #子频道1配置
; MPEG
type dabplus#子频道类型,这里是dab+,若使用dab,则改为audio
bitrate 96#比特率
id 1#子频道id
protection 3
inputfile "tcp://*:9001"#输入源,这里是接受任何9001端口的数据作为输入源
zmq-buffer 40#允许最大的缓存大小
zmq-prebuffering 20#缓存中初始填充数据的大小
}
sub-p2 { #子频道2配置,与1类似
; MPEG
type dabplus
bitrate 96
id 2
protection 3
inputfile "tcp://*:9002"
zmq-buffer 40
zmq-prebuffering 20
}
sub-p3 { #子频道3配置,与1类似
; MPEG
type dabplus
bitrate 96
id 3
protection 3
inputfile "tcp://*:9003"
zmq-buffer 40
zmq-prebuffering 20
}
}
components { #声明绑定
comp-p1 { #绑定1
label Prog1 #绑定的名称,可自定义
service srv-p1 #对应上面的services中的srv-p1
subchannel sub-p1 #对应上面的subchannels中的sub-p1
}
comp-p2 { #绑定2,与绑定1类似
label Prog2
service srv-p2
subchannel sub-p2
}
comp-p3 { #绑定3,与绑定1类似
label Prog3
service srv-p3
subchannel sub-p3
}
}
outputs { #输出方式
zeromq { #zeromq方式,由于在dabmod.ini中我们配置了9100端口作为数据交互端口(source=tcp://localhost:9100),ODR-DabMux通过往9100端口上发数据达到与ODR-DabMod连接的目的
; Listen on all interfaces, on port 9100
endpoint "tcp://*:9100" #设置往9100端口发送数据
allowmetadata true #是否支持元数据
}
throttle "simul://"
}
五、DAB发射和接收
1、odr-dabmod
sudo odr-dabmod -C dabmod.ini
确保你终端当前路径下有dabmod.ini文件。
2、odr-dabmux
odr-dabmux dabmux.mux
在dabmod.ini和dabmux.mux配置文件中,我们定义了使用9100端口通信,并且在dabmux.mux中定义了开启3个端口,这三个端口分别为9001、9002、9003,用于接收来自odr-audioenc的信息;接下来,我们需要使用odr-audioenc,将音频编码后发送到这三个端口。
3、odr-audioenc
使用odr-audioenc对音频文件test32.wav进行编码,并发送到9001端口:
odr-audioenc -i ./test32.wav -r 32000 -c 1 -o "tcp://localhost:9001" -l -b 96
其中:
i参数为播放的音频文件
r参数为文件的采样率,只支持32k和48k
c参数为声道数
o参数为输出,这里我们定义使用tcp协议输出到9001端口
l为显示声音峰值,可去掉
b为比特率
4、welle.io
接下来可以使用dab接受设备进行收听了,我使用的是rtl-sdr,打开软件,点击右上角三个点,再点击Expert Settings,打开专家模式,
此后,我们需要在软件界面的左下角切换信道,我们选择9C信道。
我们可以点击右下角,添加Service Details和Spectrum两项方便观察。
Frame sync、FIC CRC、Frame errors全部变绿,说明当前状况良好可以听到声音,否则需要调整天线或检查其它错误。关于这一点,确实有时候接收效果不是特别的好,这一点还有待于改进。而且如何调整天线的方向和位置还不是特别有规律,欢迎大家可以一起反馈、探讨!一个奇怪的现象就是,RTL SDR把天线杆拧下来反而有时候接收效果会变好。
我们在dabmux.mux中设置过第一个子信道的名称为EA Radio,其对应的端口为9001,所以我们此时双击左边的EA Radio,将听到播放的音频。
此时我们可以再开启另外两路子信道上的音频播放:
odr-audioenc -i ./test32.wav -r 32000 -c 1 -o "tcp://localhost:9002" -l -b 96
odr-audioenc -i ./test32.wav -r 32000 -c 1 -o "tcp://localhost:9003" -l -b 96
这样,我们可以双击左边的另外两个标签,也可以听到声音。
通过改变-i参数后面的音频文件,我们可以自定义播放的音频。
目前找到一组比较好的参数是双声道音频文件32k采样率的情况下用单声道播放,播放会有一定的失真目前还在研究最佳的参数设置,暂时找到使用双声道的32k采样率的音频文件单声道播放失真比较小。
odr-audioenc -i ./test32.wav -r 32000 -c 1 -o "tcp://localhost:9001" -l -b 96
六、有用的链接
https://limemicro.com/community/digital-audio-broadcasting-dab-with-the-limesdr-and-odr-mmbtools/
https://baike.baidu.com/item/DAB