树莓派发射FM波——搭建私人小电台
树莓派的应用十分广泛,有很多奇思妙想的应用非常有趣,在这里我们想实现一个小电台的功能,但是在这里需要说明,私人架设电台是违法行为,所以本案只作为自我娱乐所用,不能发射大功率的信号干扰正常的FM频段。
这里需要用到一个开源的小软件PiFmRds" target="_blank">PiFmRds,这个小软件最早是由两位外国朋友Oliver Mattos and Oskar Weigl 开发的,后来,Richard Hirst把这个小软件改成由DMA实现,减少了CPU资源的占用。再后来Christophe Jacquet继续修改软件,添加了RDS数据生成器和调制器,发射器使用Raspberry Pi的PWM发生器产生VHF信号,该软件与Raspberry Pi 1、2和3都兼容。
该小软件依赖sndfile库,首先安装该库:
- sudo apt-get install libsndfile1-dev
接下来克隆小软件的源码:
然后进行编译:
- cd PiFmRds/src
- make clean
- make
编译完成后,输入以下命令运行程序
- sudo ./pi_fm_rds
此时就会在树莓派的GPIO 4 (40针P1接口的第7管脚)上产生FM发射波,默认频率107.9,这个辐射范围通常在100厘米左右,增加20cm的杜邦线,可以使得发射范围增加到100米。

在pi_fm_rds源码目录中有五个wav声音文件作为示例,可以执行如下命令播放音频。
- sudo ./pi_fm_rds -audio sound.wav -freq 100.6

此时就可以听到一段英文发音,这个时间非常短,只有4秒钟左右,重复执行就可以多次听到了。
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 100.6。
- -audio指定一个音频文件作为音频播放。如果提供立体声文件,则Pi-FM-RDS将产生FM立体声信号。例如:-audio sound.wav。支持的格式取决于libsndfile。这包括WAV和Ogg / Vorbis(等),但不包括MP3。
- -pi指定RDS广播的PI代码。4个十六进制数字。例如:-pi FFFF。
- -ps指定RDS广播的电台名称(节目服务名称,PS)。限制:8个字符。例如:-ps RASP-PI。
- -rt指定要传输的无线文本(RT)。限制:64个字符。例如:-rt 'Hello, world!'。
- -ctl 指定一个命名管道(FIFO)作为控制通道在运行时改变PS和RT。
- -ppm 以百万分率(ppm)为单位指定树莓派的振荡器误差。
如果使用参数-audio -,注意,-audio 后面是一个短横线,Pi-FM-RDS将读取标准输入上的音频数据,这允许您将程序的输出传送到Pi-FM-RDS。他有什么作用呢,这就为我们播放MP3预留了接口,例如,这可以用于使用Sox读取MP3文件:
- sox -t mp3 Music.mp3 -t wav - | sudo ./pi_fm_rds -audio -
这个操作的意思是使用sox工具读取Music.mp3,转换成wav格式并输出到标准输出,同时使用pi_fm_rds来播放(发射)标准输入中的文件(流)。
或者将声卡的AUX输入传送到Pi-FM-RDS:
- sudo arecord -fS16_LE -r 44100 -c 2 - | sudo ./pi_fm_rds -audio -
- 超级容易卡死很用CPU
CPU使用情况如下:

添加音频时,CPU使用率显著增加,因为程序必须将输入音频文件的采样率采样到228 kHz,即其内部操作采样率,这一动作还是非常消耗CPU资源的。
通过以上操作,一个小小的私人电台就搭建好了,但是在此重申,搭建私人电台是违法行为,自己短时间,小范围的玩玩可以,不要干扰了正常的FM频段,否则后果很严重。
man sox
rec -c1 -r16000 xxx.wav可以录制音频 c指的是声道数 r值得是采样率
play xxx.wav播放
sox -V xxx.wav -n查看wav文件的详细参数
example:16k的音频降采样到8k
sox -r 16000 input.wav -r 8000 output.wav
多个单通道合并为多通道: sox 1.wav 2.wav 3.wav -t wavpcm -M 4.wav # 4.wav是3通道的
多个单通道融合为单通道: sox 1.wav 2.wav 3.wav -t wavpcm -m 4.wav # 4.wav是单通道的
sox input.wav -c1 output.wav mixer -l
mp3转wav
①安装sox:
sudo apt-get install lame
sudo apt-get install sox
sudo apt-get install libsox-fmt-mp3
②转换方法
mp3/wav等等格式转换成ogg格式:
打开终端,输入: sox 1.mp3 1.ogg
wav转换mp3格式:
打开终端,输入: sox 1.wav 1.mp3
链接:https://www.jianshu.com/p/9fb24dc60f29
转载于:https://jingyan.eeboard.com/article/76354#/prettyPhoto%5Bpp_gal%5D/0/
树莓派发射FM波——搭建私人小电台的更多相关文章
- 讲解开源项目:5分钟搭建私人Java博客系统
本文适合刚学习完 Java 语言基础的人群,跟着本文可了解和运行 Tale 项目.示例均在 Windows 操作系统下演示 本文作者:HelloGitHub-秦人 HelloGitHub 推出的< ...
- 搭建私人的云笔记_使用webdav服务
搭建私人的云笔记_使用webdav服务 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-10-10. 手机上有很多云笔记app,大多支持云存储.可是把笔记放在别人的服务器上,总觉得不 ...
- 树莓派之web服务器搭建
树莓派之web服务器搭建 (一)使用ufw创建防火墙 设置目的:可以完全阻止对树莓派的访问也可以用来配置通过防火墙对特点程序的访问.使用防火墙更好的保护树莓派. 准备工作 1.带有5V电源的树莓派 2 ...
- SLAM+语音机器人DIY系列:(五)树莓派3开发环境搭建——1.安装系统ubuntu_mate_16.04
摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式进入机器人大脑(嵌入式主板:树莓派3)的开发.本章将从树莓派3的开发环境搭建入手,为后续ros开 ...
- QT树莓派交叉编译开发环境搭建
QT树莓派交叉编译开发环境搭建 - JerryZone <Cross-compiling Qt Embedded 5.5 for Raspberry Pi 2> <Qt for Em ...
- 搭建私人通讯录/日历同步服务_使用cardDAV/calDAV服务
搭建私人通讯录/日历同步服务_使用cardDAV/calDAV服务 转载注明来源: 本文链接 来自osnosn的博客,写于 2020-02-18. Radicale, Radicale (对cardd ...
- Spring框架——事务管理方式搭建一个小的项目
学习Spring框架,通过事务管理的方式搭建一个小的项目,该项目可以查询对数据库中的图书库存数量进行修改. 首先,使用MVC分层的设计模式思想搭建项目目录结构. 此部分代码源码之中都有相关注释,所以尽 ...
- 【玩转树莓派】使用 sinopia 搭建私有 npm 服务器
简介 使用 sinopia 的好处是,node系的工程师,内部协作时,使用自有 npm 包,会非常方便:另外,sinopia,会缓存已经下载过的包,可以在相当程度上,加速 npm install 相关 ...
- 一个小时快速搭建微信小程序教程
「小程序」这个划时代的产品发布快一周了,互联网技术人都在摩拳擦掌,跃跃欲试.可是小程序目前还在内测,首批只发放了 200 个内测资格(泪流满面).本以为没有 AppID 这个月就与小程序无缘了,庆幸的 ...
随机推荐
- JS滑动到页面底部
window.scrollTo(0, document.documentElement.clientHeight); 该 window 对象在DOM有一个 scrollTo 滚动到打开窗口 的任意位置 ...
- (转)python 判断数据类型
原文:https://blog.csdn.net/mydriverc2/article/details/78687269 Python 判断数据类型有type和isinstance 基本区别在于: t ...
- php 禁止谷歌蜘蛛抓取
$useragent = strtolower($_SERVER['HTTP_USER_AGENT']); if (strpos($useragent, 'googlebot')){ exit(); ...
- slq 修改表结构
1.增加列: alter table tableName add columnName varchar(30) 2.修改列类型: alter table tableName alter column ...
- redis-集群创建脚本
之前建好了redis集群, 但没有找到集群重启的机制, 停电2次, 重新创建太麻烦, 于是写了个脚本辅助启动 redis的创建过程可以看: http://www.cnblogs.com/wenbron ...
- python 笔记-转
python笔记 Python 学习笔记 - 14.技巧(Tips) Python 学习笔记 - 13.异常(Exception) Python 学习笔记 - 12.流程控制(Contro ...
- CC2530自动安全联网
CC2530自动联网的苦恼 不知道博客园里面有没有人研究CC2530,也就是zigbee技术,其实我在做东西的时候很纠结一个问题,那就是我如何将设备连上后,如何通过协调者发送命令给终端呢?有什么方法可 ...
- Git报错:error: cannot open .git/FETCH_HEAD: Read-only file system
Git:git pull时报错 error: cannot open .git/FETCH_HEAD: Read-only file system 查看该文件: 未在网上找到解决办法,重启服务器就好了 ...
- synchronized实现可见性
JMM关于synchronized的两条规定: 1)线程解锁前,必须把共享变量的最新值刷新到主内存中 2)线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新获取最新的值 ( ...
- 如何移动 nuget 缓存文件夹
本文告诉大家如何移动 nuget 缓存文件夹. 因为 nuget 文件夹一般比较大,现在我的 nuget 文件夹有 10 G,默认的 nuget 文件夹是在C盘,所以需要移动他. 可以使用下面的代码查 ...