用 HackRF + GNU Radio 制作 FM 发射机:从 WAV 到 103 MHz 空中信号
用 HackRF GNU Radio 制作 FM 发射机从 WAV 到 103 MHz 空中信号作者charlie关键词HackRF、GNU Radio 3.10、SoapySDR、analog_wfm_tx、FM 广播调制、采样率链摘要本文记录如何用一块 HackRF One/Pro 配合 GNU Radio把一个普通 WAV 音频文件调制成标准 FM 广播信号并发射到空中默认 103 MHz用普通收音机即可接收。文章给出完整可运行的流图fm_tx.grc并重点讲清三件事(1) FM 调制与卡森带宽准则为什么max_dev75 kHz、quad_rate必须是audio_rate的整数倍(2) GNU Radioanalog_wfm_tx的内部插值×5与预加重tau75 µs(3)SoapySDR 下 HackRF 在 1 MHz 采样率发射会触发 TIMEOUT bug因此必须用 2 MHz 采样率并用rational_resampler的 25/3 把 240 kHz 提到 2 MHz。文末附合规声明本方案仅用于低功率近场教学测试。1. 背景FM 广播频段为 88–108 MHz单声道基带音频带宽约 15 kHz峰值频偏 75 kHz。HackRF 覆盖 1 MHz–6 GHz、半双工、8 位量化既能接收也能发射是做“软件定义 FM 发射机”的低成本平台。目标链路非常短WAV 文件 (48k, 单声道) │ ▼ analog_wfm_tx (FM 调制, 插值 ×5) 240 kHz 复数基带 │ ▼ rational_resampler_ccc (25/3) 2 MHz 复数基带 │ ▼ soapy_hackrf_sink (TX, fc freq×1e6, vga16) 空中 103 MHz FM 信号 │ └─► qtgui_sink_x (本地频谱自检)2. 理论基础2.1 FM 调制与卡森带宽准则在频率调制中载波的瞬时频率正比于消息信号的幅度s(t) A·cos( 2π·fc·t 2π·kf·∫ m(τ)dτ )kf决定频偏灵敏度实际工程用峰值频偏 Δf描述max_dev 75000Hz。根据Carson 带宽准则已调信号 98% 功率落在BW ≈ 2·(Δf f_m,max)FM 广播Δf 75 kHz基带最高f_m,max ≈ 15 kHz故BW ≈ 2×(7515) 180 kHz。这就是quad_rate 240 kHz留有余量且为audio_rate的 5 倍的来源。2.2 预加重 / 去加重tau 75 µs高频噪声在 FM 解调后会被提升因此发射端对高频做预加重、接收端做去加重以换得信噪比改善。时间常数分两派地区tau美国 / 日本 / 韩国等75 µs欧洲 / 中国等50 µsanalog_wfm_tx的tau 75e-6对应 75 µs 预加重美规。若面向欧规设备应改为50e-6。fh -1.0表示关闭发射端的高通滤波器不额外滤直流。2.3 GNU Radio analog_wfm_tx 原理analog_wfm_tx内部做四件事重采样内置插值因子固定为5所以要求quad_rate 5 × audio_rate本例 48k → 240k。它把音频上采样后再调制保证每个音频样本有足够多的复数采样刻画频率变化。预加重按tau对音频做一阶高通式加权。相位累加 FM 调制对每个输出采样累加相位增量Δφ 2π·(kf·m[n])/fs再取cos/sin得到复数基带I jQ。这正是“间接调频”——用积分正交本振实现避免直接调 VCO。限幅/缩放输出幅度归一化到适合 DAC 的范围。2.4 采样率链与 HackRF 限制关键坑HackRF 基带采样率规格为2–20 MS/s。1 MHz 在规格外且SoapySDR 的 HackRF TX 在 1 MHz 会触发 TIMEOUT bug底层hackrf库在过低的采样率下 TX 超时流图卡死/丢数。因此wfm_tx自然产出 240 kHz用rational_resampler_cccinterp25, decim3把它提到240k × 25/3 2,000,000 2 MHz正好落在 HackRF 合法区间下沿HackRFsamp_rate设为 2 MHzcenter_freq freq × 1e6。若强行把samp_rate设 1 MHz流图能“跑起来”但发射会间歇卡死且频谱异常——这是 Soapy/HackRF 的已知问题不是你流图写错。2.5 法律与责任务必阅读在 88–108 MHz发射信号绝大多数国家/地区都需要电台执照未经许可的 FM 广播发射可能违法并干扰合法广播。本文设置amp False关闭 HackRF 板载放大器vga 16适中增益低功率配合短天线、近场测试发射机旁放一台收音机验证。请仅在合法授权、低功率、封闭/近场场景使用本方案并遵守当地无线电法规。作者与本文不对任何违规使用负责。3. 实践流图搭建3.1 音频准备analog_wfm_tx要求单声道且采样率与audio_rate一致。用 ffmpeg 把任意音频转成 48 kHz 单声道 WAVffmpeg-iin.wav-ar48000-ac1fm_input.wav流图中blocks_wavfile_source指向/path/to/fm_input.wavrepeatTrue循环播放方便反复测试。3.2 流图关键参数变量 / 模块值说明freq88–108 MHz 滑杆默认 103发射中心频率samp_rate2,000,000HackRF TX 采样率≥2M避开 1M bugaudio_rate48,000必须与 WAV 一致quad_rate240,000 5 × audio_rateanalog_wfm_tx.max_dev75,000峰值频偏 75 kHzFM 广播标准analog_wfm_tx.tau75e-675 µs 预加重rational_resamplerinterp25, decim3240k → 2Msoapy_hackrf_sink.vga16低功率增益soapy_hackrf_sink.ampFalse关闭板载放大3.3 关键模块源码来自 fm_tx.grcWAV 源循环播放-name:wav_source_0id:blocks_wavfile_sourceparameters:file:/path/to/fm_input.wavnchan:1repeat:TrueFM 调制核心-name:analog_wfm_tx_0id:analog_wfm_txparameters:audio_rate:audio_rate# 48000quad_rate:quad_rate# 240000 ( 5 × audio_rate)max_dev:75000# 峰值频偏 75 kHztau:75e-6# 75 µs 预加重fh:-1.0# 关闭发射高通采样率提升到 2 MHz绕过 1M TX bug-name:rational_resampler_ccc_0id:rational_resampler_xxxparameters:type:cccinterp:25# 240000 × 25 / 3 2,000,000decim:3taps:[]HackRF 发射与本地频谱自检-name:soapy_hackrf_sink_0id:soapy_hackrf_sinkparameters:type:fc32center_freq:freq*1e6# 103 MHzsamp_rate:samp_rate# 2,000,000vga:16amp:False# 低功率合规近场测试bandwidth:0-name:qtgui_sink_x_0id:qtgui_sink_xparameters:type:complexfc:freq*1e6bw:samp_ratefftsize:1024plotfreq:Trueplotwaterfall:True连接关系等价于生成的 fm_tx.py# 信号流WAV → FM调制 → 重采样(→2M) → HackRF TX并旁路一份给频谱仪self.connect((self.wav_source_0,0),(self.analog_wfm_tx_0,0))self.connect((self.analog_wfm_tx_0,0),(self.rational_resampler_ccc_0,0))self.connect((self.rational_resampler_ccc_0,0),(self.soapy_hackrf_sink_0,0))self.connect((self.rational_resampler_ccc_0,0),(self.qtgui_sink_x_0,0))4. 运行与自检启动GRC 或grcc生成脚本grcc-o/tmp fm_tx.grcpython3 /tmp/fm_tx.py# 或直接用 GRC 的 “Run”自检验证两步走本地频谱自检qtgui_sink_x应显示以 103 MHz 为中心、宽约 180–200 kHz 的 FM 谱典型“双驼峰” Carrier 对称边带。若谱很窄或卡死多半是踩了 1M bug——确认samp_rate2M。真实接收把一台 FM 收音机调到 103.0 MHz靠近 HackRF 天线应清晰听到 WAV 里的声音循环播放便于确认。听感发闷/高频不足检查tau与接收机去加重是否匹配美规 75 µs 对 75 µs。小贴士freq用counter_slider可在运行中平滑改频改到 88–108 内任意值收音机同步调台即可验证。5. 总结与踩坑清单核心结论FM 广播调制 相位累加的数字 FMquad_rate必须是audio_rate的5 倍analog_wfm_tx内置插值 ×5。峰值频偏75 kHz 卡森准则 ⇒ 占用带宽约 180 kHz决定了quad_rate240k的选取。HackRF TX 不能用 1 MHz 采样率Soapy TIMEOUT bug必须 ≥2 MHz用rational_resampler25/3 把 240k 升到 2M 是标准解法。预加重tau75 µs对应美规面向欧规设备改50 µs。踩坑清单收音机收到但声音发尖/失真→max_dev与收音机期望不一致或音频本身超出 15 kHz确认max_dev75k。收音机高频发闷→tau不匹配发射 75 µs 配欧规 50 µs 收音机会有差异。流图卡死 / 频谱断续→ 几乎都是samp_rate1M触发 Soapy/HackRF TX TIMEOUT改成 2M。完全收不到→ 先确认ampFalse时增益足够近场天线用 88–108 MHz 鞭状天线收音机与 HackRF 距离过远低功率下十几厘米一米内最佳。音频杂音大→ WAV 不是 48k 单声道用 ffmpeg 重转并保证audio_rate与文件一致。适用与局限适用FM 广播调制教学、近场音频链路演示、SDR 发射链路验证。局限HackRF 8 位 DAC音质远不及专业 FM 激励器半双工不能收发同时发射须合规、低功率、近场立体声MPX/Pilot 19 kHz未实现本文为单声道 FM。合规声明重申在 FM 广播频段发射通常需无线电执照。本方案默认ampFalse、vga16、循环近场测试仅供教学与合法授权场景。使用者须自行确保符合当地法规作者对任何滥用后果不承担责任。参考GNU Radioanalog.wfm_tx文档插值因子、预加重、频偏参数Carson, J. R. — “Notes on the Theory of Modulation” (1922)卡森带宽准则HackRF One 规格采样率 2–20 MS/s、SoapySDR HackRF 模块ITU / 当地无线电管理法规FM 广播发射授权要求

相关新闻

C语言函数递归详解:从核心要素到实战案例

C语言函数递归详解:从核心要素到实战案例

1. 什么是递归 递归是编程中的一种技术&#xff0c;指的是一个函数在其定义内部调用自身。递归一定是依赖于函数的。 史上最简单的递归程序&#xff1a; #include <stdio.h> int main() {printf("hehe\n");main(); //main函数自己调用自己return 0; }这个程序是…

2026/9/19 18:19:03 阅读更多 →
LangGraph实战:构建有状态AI智能体工作流,解决复杂流程编排痛点

LangGraph实战:构建有状态AI智能体工作流,解决复杂流程编排痛点

1. 先搞清楚 LangGraph 到底解决了什么 Agent 开发痛点如果你正在用 LangChain 或者类似的框架做 AI 应用&#xff0c;尤其是涉及多步骤、有状态、需要协作的智能体&#xff08;Agent&#xff09;&#xff0c;大概率会遇到几个头疼的问题&#xff1a;任务流程一复杂&#xff0c…

2026/9/16 13:06:46 阅读更多 →
Grok Bot本地部署与API集成指南:从环境准备到功能验证

Grok Bot本地部署与API集成指南:从环境准备到功能验证

这次我们来看一个刚在 Hacker News 上登顶热榜的开源项目——Grok Bot。它来自 x.ai&#xff0c;一个由知名企业家埃隆马斯克创立的 AI 研究公司。简单来说&#xff0c;Grok Bot 是一个可以本地部署、支持 API 调用、具备强大对话和推理能力的 AI 助手。它的核心吸引力在于&…

2026/9/19 2:54:50 阅读更多 →

最新新闻

3步搞定CAD查看器:新手避坑指南与完整代码实战

3步搞定CAD查看器:新手避坑指南与完整代码实战

3步搞定CAD查看器:新手避坑指南与完整代码实战 满屏红色的报错堆栈(StackTrace)像天书一样砸在脸上,你甚至不知道哪一行代码导致了程序崩溃。做房建工程的后端开发,最怕的就是这种“黑盒”状态,明明只是想要个简单的 CAD 查看器…

2026/9/22 4:44:05 阅读更多 →
3个真实案例:搞懂智慧的拼音,这份避坑指南让你少踩90%的坑

3个真实案例:搞懂智慧的拼音,这份避坑指南让你少踩90%的坑

3个真实案例:搞懂智慧的拼音,这份避坑指南让你少踩90%的坑 版本升级后 API 全变了,昨天还能跑的代码今天直接报错,这种崩溃感每个写过代码的人都懂。特别是处理中文拼音这类边缘场景时,库的版本差异能让你的项目直接停摆。今天这篇避坑指南,专…

2026/9/22 4:44:05 阅读更多 →
84888.com实战:从报错到精通,后端开发避坑指南

84888.com实战:从报错到精通,后端开发避坑指南

84888.com实战:从报错到精通,后端开发避坑指南 面对满屏的红色 StackTrace,你第一反应是复制粘贴去搜吗?别急,90%的新手都在这里栽了跟头。报错信息看不懂,代码逻辑理不清,这才是阻碍你从入门到精通的真正门槛。…

2026/9/22 4:44:05 阅读更多 →
英语交流实战项目避坑指南:搞定环境配置不卡壳

英语交流实战项目避坑指南:搞定环境配置不卡壳

英语交流实战项目避坑指南:搞定环境配置不卡壳 刚接手一个跨境电商的后台系统,核心需求就是让客服团队能和海外客户进行 英语交流 。 配置环境就卡半天 ,这种痛谁懂? 我盯着终端报错信息看了二十分钟,最后发现是 Node.js…

2026/9/22 4:44:04 阅读更多 →
告别Pyplot报错:数据可视化选型最佳实践与避坑指南

告别Pyplot报错:数据可视化选型最佳实践与避坑指南

告别Pyplot报错:数据可视化选型最佳实践与避坑指南 屏幕上一片红,满屏的 Traceback 堆叠,看着 ValueError 和 TypeError…

2026/9/22 4:44:04 阅读更多 →
向日葵小班证书年审总挂?一文搞懂房建工程师避坑指南

向日葵小班证书年审总挂?一文搞懂房建工程师避坑指南

向日葵小班证书年审总挂?一文搞懂房建工程师避坑指南 官方文档翻了三遍还是没看懂?别急,我懂你的痛。 在房建工程圈子里混了十年,最让人头大的往往不是图纸画错,而是那些看似简单实则处处是坑的行政流程。特别是涉及到【向日葵小班】这类特定资质或项目…

2026/9/22 4:43:04 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事&#xff1a;用Flutter给OpenHarmony做一款游戏集合类的App&#xff0c;说白了就是把若干小游戏塞进一个壳里&#xff0c;用统一入口分发。这个方向本身不算新鲜&#xff0c;真正让我花了不少心思的&#xff0c;是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档&#xff0c;最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事&#xff1a;今天在表后面多加了两个空白行&#xff0c;明天给客户交稿前发现整个章节的编号全部错位&#xff0c;光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年&#xff0c;说实话&#xff0c;第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年&#xff0c;流量惨淡、功能臃肿、代码自己都懒得看第二遍之后&#xff0c;我才慢慢琢磨明白一个道理&#xff1a;第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理&#xff1a;核心链路应该先拆哪一步分类&#xff1a;[工程技术]细分主题&#xff1a;Docker 容器化技术与镜像安全管理&#xff1a;核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用&#xff08;包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →