树莓派 FM 发送机小电台背后的原理解析

介绍

在知乎上有个问题 你在 GitHub 上看到过的最有意思的项目是什么? 我介绍了个很有意思的无线 FM 电台的项目,可以在不借用其他外部设备的情况下,通过代码实现将树莓派变为 FM 小电台。

但是作者只是在博客中介绍了大致的原理。于是我搜遍整个网络,发现大多数的相关文章只是教你如何去编译运行代码,对背后的原理却是只言片语,含糊不清。

作为好奇宝宝,我查阅了许多芯片手册和论坛文章,又翻了翻以前学过的《天线原理》对背后的原理做了一下归纳和总结。

概念名词解释

首先是一些基本的概念

  • FM: 调频(Frequency Modulation) 是一种以载波的瞬时频率变化来表示信息的调制方式,载波的频率跟随输入信号的幅度直接成等比例变化。FM Radio  就是我们熟悉的调频收音机。
  • PWM: 脉冲宽度调制(Pulse Width Modulation) 是使用数字源生成模拟信号的方法。主要由 2 个参数来定义:占空比频率。如果以保持一定的速率开关数字信号并且保持一定的占空比,那么输出看起来就像恒定电压模拟信号。
  • GPIO: 通用型输入输出(General-purpose input/output),引脚可以由程序控制作为通用输入(GPI)或者通用输出(GPO)。
  • CPU: 中央处理器(Central Processing Unit),相当于树莓派的大脑,功能主要是解释计算机指令以及处理计算机软件中的数据,负责与外围设备通信。树莓派使用的是博通 BCM28XX 系列的 CPU。
  • DMA: 直接内存访问(Direct Memory Access)这些设备可以执行涉及主内存和其他设备的数据传送。由于设备执行这些操作的过程中无需借助于 CPU,因此该类型的数据传送称为直接内存访问。简单说就是不用  跟 CPU 打招呼就可以直接访问内存。

HOW?

根据麦克斯韦的电磁场理论

  1. 变化的磁场能够在周围空间产生电场,变化的电场能够在周围空间产生磁场。
  2. 随时间均匀变化的磁场(电场)产生稳定电场(磁场)。随时间不均匀变化的磁场(电场)产生变化的电场(磁场)。
  3. 变化的电场和变化的磁场总是相互关系着,形成一个不可分割的统一体,这就是电磁场。

随时间变化的电场产生磁场,而随时间变化的磁场又产生电场,两者互为因果。这种不断转化的场统称为电磁场。这种相互的转化形成电磁振荡。

所以如果在树莓派的 GPIO 上,通过软件控制以一定频率输出高低电平(0/1),再加上适当长度的天线(一根杜邦线即可)就可以将能量以电磁波的形式发射出去。

FM 结构图

由图可知,组成一个 FM 发射机系统,树莓派需要

  • 信号采样和 FM 调制所需的时钟
  • 可以通过编程控制电平变化的 GPIO
  • 一段可以将电磁波发射出去的天线

时钟

目前绝大多数的的微处理器都有扩频时钟(Spread-spectrum clock),目的是为了降低电磁干扰(EMI),在树莓派 BCM28XX 系列芯片上,扩频时钟的范围为 1MHz 到 250MHz,这正好用作 FM 的载波信号。

为了减少 CPU 占用,作者对程序进行了改进,使用树莓派 DMA 产生基础时钟。

信号采样

由于 FM 广播发送的是音频信号,所以先使用 228 kHz 的采样频率对信号进行采样(满足奈奎斯特采样定理),带宽为 15 kHz。

调频

基带信号 \(x_{m}(t)\),载波频率 \(f_{c}\),正弦载波为\(x_{c}(t)=A_{c} \cos \left(2 \pi f_{c} t\right)\) 将基带数据信号与载波结合起来得到了传输信号

\[ \begin{aligned} y(t) &=A_{c} \cos \left(2 \pi \int_{0}^{t} f(\tau) d \tau\right) \\ &=A_{c} \cos \left(2 \pi \int_{0}^{t}\left[f_{c}+f_{\Delta} x_{m}(\tau)\right] d \tau\right) \\ &=A_{c} \cos \left(2 \pi f_{c} t+2 \pi f_{\Delta} \int_{0}^{t} x_{m}(\tau) d \tau\right) \end{aligned} \]

其中 \(f(\tau)\) 为传输信号的瞬时频率,\(f_{\Delta}\) 为频偏表示相对载波频率 \(f_{c}\) 的最大频率偏移。

调频输出的是模拟信号,利用时钟产生 PWM 调整占空比和频率,就可以利用数字信号生成模拟信号。

树莓派天线长度

  • 波长\(\lambda=c/f\)
  • 偶极子天线:制作偶极子天线时,会通过工作波长来确定天线的长度。最常见的偶极子天线是半波天线,它的总长度近似为工作波长的一半,即 \(L=\lambda / 2\)

如果需要发射 100MHz 的 FM 信号,根据上面的公式来计算,就需要 1.5m 长的天线。

1
2
>>> 3*10**8 / (2 * 100 * 10**6)
1.5

所以理论上如果给树莓派 GPIO(PIN4) 加上了一根 1.5M 的天线,那么就可以输出最大功率的 FM 信号。

不要这么做,会干扰正常频段!

传播距离估计

首先需要计算有效全向辐射功率(EIRP)

\[EIRP = P - Loss +G\]

其中 \(P\) 为发射机的输出功率(\(dBm\)),\(Loss\) 为发射机输出端与天线馈源之间的馈线损耗(\(dB\)),\(G\) 为天线的发送增益(\(dBi\))。求出 EIRP 后可以进而获得自由空间路径损失(Free Space Path Loss,FSPL)。

但是使用这个公式估算,意义不是太大。实际测量,如果使用一根 10cm 的杜邦线作为天线,一个楼梯拐角信号就已经非常弱了。

总结

  • 深深佩服第一个作者的 Geek 范和莫大的脑洞;
  • 不要干扰正常频段,属于违法行为!

参考

代码请见参考链接

  • [1] Eben Upton and Gareth Halfacree. Raspberry Pi user guide. John Wiley & Sons, 2014.
  • [2] Oliver Mattos and Oskar Weigl. Turning the Raspberry Pi Into an FM Transmitter. http://www.icrobotics.co.uk/wiki/index.php/Turning the Raspberry Pi Into an FM Transmitter, 2015.
  • [3] Christophe Jacquet. FM-RDS transmitter using the Raspberry Pi’s PWM . https://github.com/ChristopheJacquet/PiFmRds, 2014.
  • [4] Richardson. Turning the Raspberry Pi Into an FM Transmitter. http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter, 2015.

欢迎关注我的个人公众号