实验 Pi-FM-RDS 使用 Raspberry Pi 的 FM-RDS 发射器
实验 Pi-FM-RDS 使用 Raspberry Pi 的 FM-RDS 发射器
注*实验请遵守 中华人民共和国无线电管理条例
相关连接:中华人民共和国无线电管理条例
警告和免责声明
PiFmRds 是一个实验程序,专为实验而设计。它绝不是要成为个人媒体中心或操作广播电台的工具,甚至是向自己的立体声系统广播声音。
在大多数国家/地区,在没有国家颁发的特定传输方式(频率、功率、带宽等)许可证的情况下传输无线电波是非法的。
因此,始终将屏蔽传输线从 RaspberryPi直接连接到无线电接收器,以免发射无线电波。切勿使用天线。
即使您是获得许可的业余无线电操作员,使用 PiFmRds 在 RaspberryPi 和天线之间不进行任何滤波的情况下在业余频率上传输无线电波很可能是非法的,因为方波载波谐波非常丰富,因此带宽要求很可能没见过。
对于您自己的 Raspberry Pi 的任何误用,我概不负责。任何实验都由您自己负责。
该程序生成 FM 调制,实时生成 RDS(无线电数据系统)数据。它可以包括单声道或立体声音频。
准备设备
本次实验所使用到设备如下
欧迅UVD1P 树莓派 Raspberry Pi 4 TF高速卡 树莓派散热组件+DIY散热贴 杜邦线一条 读卡器 WinSCP Putty SDRSharp AirSPY 电脑一台
第一步准备 基础环境
- 本次使用了 2022-09-22-raspios-bullseye-armhf.img 作为测试系统环境 下载地址如图
-
使用 imager_1.7.3 导入TF卡 并修改如下配置
-
准备好系统后组装 开机 使用ssh登录系统
-
使用切换到 root账号
-
修改root密码 开启SSH登录 操作如下图
-
使用 root 账号登录 并测试 google 与 github 访问正常 (特殊环境请自理)
以上所使用到代码如下
设置root用户密码
sudo passwd root
启用root用户
sudo passwd --unlock root
设置ssh允许登录
sudo sed -i "s/^#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config
重启ssh服务
sudo systemctl restart ssh
为root用户应用于当前用户相同的bash配置
sudo cp ~/.bashrc /root/.bashrc
第二步准备 软件安装
-
安装 libsndfile1-dev
-
克隆 PiFmRds
-
make PiFmRds
重要的。如果make报告任何错误,则不会pi_fm_rds生成可执行文件(反之亦然)。因此,必须先修复任何错误,然后才能继续下一步。make如果缺少任何必需的库(见上文),则可能会失败,或者它可能是特定/较新发行版上的错误。在这种情况下,请提交错误。
如果make没有报告错误(即pi_fm_rds生成可执行文件),您可以简单地运行:
sudo ./pi_fm_rds
这将在 107.9 MHz 上生成一个 FM 传输,带有默认电台名称 (PS)、广播文本 (RT) 和 PI 代码,没有音频。射频信号在 GPIO 4(接头 P1 上的引脚 7)上发射。
您可以通过引用音频文件来添加单声道或立体声音频,如下所示:
sudo ./pi_fm_rds -audio sound.wav
要测试立体声音频,您可以尝试stereo_44100.wav提供的文件。
运行 Pi-FM-RDS 的更通用语法如下:
pi_fm_rds [-freq freq] [-audio file] [-ppm ppm_error] [-pi pi_code] [-ps ps_text] [-rt rt_text]
所有参数都是可选的:
-freq 指定载波频率(以 MHz 为单位)。例子:-freq 107.9。
-audio 指定要作为音频播放的音频文件。采样率无关紧要:Pi-FM-RDS 将重新采样并过滤它。如果提供立体声文件,Pi-FM-RDS 将产生 FM 立体声信号。例子:-audio sound.wav。支持的格式取决于libsndfile. 这包括 WAV 和 Ogg/Vorbis(以及其他),但不包括 MP3。指定-为文件名以读取标准输入上的音频数据。
-pi 指定 RDS 广播的 PI 代码。4 个十六进制数字。例子:-pi FFFF。
-ps 指定RDS广播的台名(Program Service name,PS)。限制:8 个字符。例子:-ps RASP-PI。
-rt 指定要传输的广播文本 (RT)。限制:64 个字符。例子:-rt ‘Hello, world!’。
-ctl 指定命名管道 (FIFO) 用作控制通道以在运行时更改 PS 和 RT(见下文)。
-ppm 以百万分率 (ppm) 为单位指定 Raspberry Pi 的振荡器误差,请参见下文。
默认情况下,PS 在和序列号之间来回变化Pi-FmRds,从00000000. PS 大约每秒变化一次。
以上所使用到代码如下
sudo
apt-get install libsndfile1-dev
git clone https://github.com/ChristopheJacquet/PiFmRds.git
cd PiFmRds/src
make clean
make
第三步准备 测试准备
准备一段 .wav 格式音频
本次使用了 Audition 来转换一首音乐位 .WAV音频 (注意采样类型如图)
使用WinSCP上传到/root/PiFmRds/src目录
准备 控制 PS、RT 和 TA(交通通告标志)配置文件
每行必须以PS,RT或开头TA,后跟一个空格字符和所需的值。任何其他行格式都会被忽略。TA ON将 Traffic Announcement 标志切换为on,任何其他值将其切换为off。
PS Bi4QZW
RT Bi4Qzw_FM_RDS_Info_2022_11_27_TEST
TA ON
第四步测试及结果
使用命令 sudo ./pi_fm_rds -ctl Bi4Qzw_fm_ctl -freq 80.0 -audio Bi4Qzw_TEST_FM_RDS_Music_成龙_金喜善.-.无尽的爱.wav
执行
使用手台的 FM收音机接收测试 使用SDRSharp解码FM中的RDS信息
测试成功 ----END----
时钟校准(仅在遇到困难时)
RDS 标准规定 57 kHz 副载波的误差必须小于 ± 6 Hz,即小于 105 ppm(百万分之一)。Raspberry Pi 的振荡器误差可能在这个数字之上。这就是-ppm参数发挥作用的地方:您指定 Pi 的误差,Pi-FM-RDS 相应地调整时钟分频器。
在实践中,我发现即使不使用-ppm参数,Pi-FM-RDS 也能正常工作。我想接收器比 RDS 规范中规定的更宽容。
测量 ppm 误差的一种方法是播放pulses.wav文件:它将精确播放 1 秒的脉冲,然后播放 1 秒的静音,依此类推。使用优质声卡录制收音机的音频输出。假设您以 44.1 kHz 采样。测量 10 个间隔。以Audacity为例,确定这10个区间的样本数:在没有时钟误差的情况下,应该是441,000个样本。我用我的 Pi 找到了 441,132 个样本。因此,我的 ppm 误差是 (441132-441000)/441000 * 1e6 = 299 ppm
在使用树莓派4 Raspberry Pi 4 需要提前加载代码 echo "performance"| sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
设计
RDS 数据生成器位于rds.c文件中。
RDS数据生成器循环生成4个0A组(发送PS)和1个2A组(发送RT)。此外,每分钟插入一个4A组(用于传输CT,时钟时间)。get_rds_group生成一组,crc用于计算CRC。
要获取 RDS 数据样本,请调用get_rds_samples. 它调用get_rds_group,对信号进行差分编码并生成整形双相符号。连续的双相符号重叠:样本相加,结果相当于将整形滤波器(RDS 标准中指定的根升余弦 (RRC) 滤波器)应用于曼彻斯特编码脉冲序列。
形状的双相符号由一个名为Pydemod的 Python 程序一劳永逸地生成generate_waveforms.py, Pydemod是我的其他软件无线电项目之一。这个 Python 程序生成一个数组,称为将 RRC 滤波器应用于正负脉冲对的结果。请注意,名为和的两个文件的输出包含在 Git 存储库中,因此您无需自己运行 Python 脚本来编译 Pi-FM-RDS。waveform_biphasegenerate_waveforms.pywaveforms.cwaveforms.h
在内部,程序以 228 kHz 的频率对所有信号进行采样,这是 RDS 副载波 57 kHz 的四倍。
FM复用信号(基带信号)由 产生fm_mpx.c。该文件处理输入音频文件到 228 kHz 的上采样,以及多路复用的生成:未调制的左+右信号(限制为 15 kHz),可能是 19 kHz 的立体声导频,可能是左右信号,振幅-调制在 38 kHz(抑制载波)和 RDS 信号rds.c上。上采样是使用零阶保持后跟一个 60 阶 FIR 低通滤波器来执行的。该滤波器是一个由平衡采样 sinc。滤波器系数在启动时生成,以便滤波器削减高于以下最小值的频率:
输入音频文件的奈奎斯特频率(采样率的一半)以避免混叠,
15 kHz,左+右和左右声道的带通,符合FM广播标准。
样本由pi_fm_rds.c改编自 Richard Hirst 的PiFmDma 播放。该程序已更改为支持精确 228 kHz 的采样率。
参考
EN 50067, Specification of the radio data system (RDS) for VHF/FM sound broadcasting in the frequency range 87.5 to 108.0 MHz
http://www.interactive-radio-system.com/docs/EN50067_RDS_Standard.pdf?_x_tr_sch=http&_x_tr_sl=auto&_x_tr_tl=zh-CN&_x_tr_hl=zh-CN&_x_tr_pto=wapp