news 2026/10/3 6:54:42

从IR Blaster到CORDIC:边缘AI如何用有限算力逼近硬核目标

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从IR Blaster到CORDIC:边缘AI如何用有限算力逼近硬核目标

1. 从一份早报标题里拆出来的硬核线索

看到“Hackaday 科技精选早报”这个标题,我第一反应不是“哦,又一个新闻聚合”,而是脑子里自动开始拆零件。Hackaday 这个站点在硬件圈和创客圈的地位,相当于老派工程师的晨间咖啡——它不追热点,但追“这个东西到底怎么跑起来的”。所以当标题里同时出现 AI、IR Blaster、Intel 8087、CORDIC 这四个关键词时,我基本能判断出这期早报的骨架:一个现代 AI 应用层的话题,一个红外发射器的 DIY 实现,一个上古浮点协处理器的考古,以及一个在嵌入式领域活了半个世纪的数学算法。

这四个词放在一起,表面看是“科技新闻拼盘”,实际上它们共享一条暗线:用有限的算力或极低的成本,去逼近一个看似需要庞大资源才能完成的目标。IR Blaster 用一颗红外 LED 和定时器去模拟空调遥控器的编码协议;Intel 8087 在 1980 年用硬件协处理器把浮点运算从“软件模拟的龟速”里捞出来;CORDIC 算法更绝,它用移位和加法代替乘法,在三角函数计算上做到了“没有乘法器也能算 sin/cos”。而 AI 在这个语境里,不是指大模型训练,而是指在边缘设备上跑推理、用 AI 辅助硬件调试、或者用 AI 生成控制逻辑。

这篇博文适合谁看?如果你是对硬件 hacking 有兴趣的软件工程师,或者是对 AI 落地有执念的嵌入式开发者,再或者你只是单纯好奇“为什么 2026 年了还有人折腾 8087”,那接下来的内容就是给你准备的。我会把每个关键词背后的技术脉络、实操要点、以及我自己在类似项目里踩过的坑,全部摊开讲。不搞虚的,直接上干货。

2. IR Blaster:用一颗 LED 干掉一抽屉遥控器

2.1 为什么红外发射器永远是 DIY 热门

IR Blaster 这个词在 Hackaday 上出现的频率极高,原因很简单:它解决了一个真实且普遍存在的痛点。家里空调、电视、风扇、投影仪的遥控器加起来能塞满一个抽屉,而且每个遥控器用的编码协议还不一样。NEC、RC5、RC6、Sony SIRC、Samsung 32-bit,光是记住这些协议的名字就够头疼了。但红外通信的本质极其朴素:用 38kHz 左右的载波频率,把一串 0 和 1 调制成红外光的闪烁。接收端解调后得到基带信号,再按协议解析。

我最早做 IR Blaster 是为了控制一台老空调。那台空调的遥控器丢了,原厂配一个要两百多块,而且还要等一周。我翻出一颗 940nm 红外 LED、一个 IR 接收头(用来学习原遥控器的码)、一个 ESP32 开发板,总共成本不到三十块。核心思路是:先用接收头把原遥控器的红外码录下来,存进 ESP32 的 RMT(Remote Control Transceiver)外设,然后让 ESP32 按同样的时序把码发出去。ESP32 的 RMT 外设是专门为红外遥控这类应用设计的,它可以硬件级生成精确的载波和脉冲序列,不占用 CPU 时间。

2.2 红外编码的核心参数与实操陷阱

做 IR Blaster 最容易翻车的地方不是电路,而是时序精度。以最常见的 NEC 协议为例,一个完整的码由引导码、地址码、地址反码、命令码、命令反码组成,总共 32 位。引导码是 9ms 的低电平加 4.5ms 的高电平,逻辑 0 是 560us 低电平加 560us 高电平,逻辑 1 是 560us 低电平加 1.69ms 高电平。这些时间参数的单位是微秒,误差超过 10% 接收端就可能不认。

我试过用 Arduino 的delayMicroseconds()来生成这些脉冲,结果发现空调完全没反应。用逻辑分析仪抓波形才发现,delayMicroseconds()在中断开启的情况下会被拉长,导致逻辑 1 的高电平变成了 1.8ms 甚至 2ms。后来换成 ESP32 的 RMT 外设,问题立刻消失。RMT 的每个通道有一个 64 位的发射器,可以预先加载一串“符号”(symbol),每个符号定义高电平和低电平的持续时间,精度是 12.5ns(基于 80MHz 时钟)。这个精度对于红外遥控来说绰绰有余。

注意:红外 LED 的驱动电流要足够。普通的 5mm 红外 LED 正向电流一般在 20mA 到 100mA 之间,但遥控距离要远的话,需要用三极管或 MOSFET 来驱动,把峰值电流拉到 200mA 甚至 500mA。不过占空比很低,平均电流并不大,不用担心烧 LED。串联一个 10 欧姆到 47 欧姆的限流电阻是常见做法,具体阻值取决于你的供电电压和 LED 的压降。

2.3 用 AI 辅助生成红外码库的野路子

2026 年做 IR Blaster,有一个新玩法是用 AI 帮你反推协议。传统的做法是去查 IRremoteESP8266 或 IRremote 的码库,但有些冷门设备根本找不到。我的做法是:用 IR 接收头把原始波形录下来,存成 CSV 文件,然后丢给一个本地跑的小模型(比如量化后的 Llama 3 或 Qwen),让它根据波形的时序特征去匹配已知协议。提示词可以这样写:“以下是一段红外接收头输出的高低电平时序,单位微秒,请判断它最接近 NEC、RC5、RC6、Sony SIRC 还是 Samsung 32-bit 协议,并给出解码后的十六进制码。”

实测下来,对于标准协议,小模型的判断准确率能到八成以上。剩下的两成需要人工核对,但至少省去了翻 datasheet 的时间。这个思路的本质是把模式识别问题交给 AI,把精确控制留给自己。AI 不需要知道红外物理,它只需要在时序数据里找规律。

3. Intel 8087:浮点运算的“外挂”哲学

3.1 为什么 8087 在 2026 年还值得聊

Intel 8087 是 1980 年推出的浮点协处理器,配合 8086/8088 CPU 使用。它的历史地位在于:它是 x87 浮点指令集的鼻祖,也是“硬件加速”这个概念在个人电脑上的第一次大规模落地。在 8087 出现之前,8086 做一次浮点乘法需要调用软件库,一个双精度乘法可能要几百个时钟周期。8087 把这个数字降到了几十个周期,而且支持超越函数(sin、cos、log、exp)的硬件计算。

为什么现在还要提它?因为边缘 AI 推理的困境和当年 8086 做浮点运算的困境一模一样。你不可能在每台设备上都塞一块 H100,但你又需要跑模型。8087 给出的答案是:把最密集的计算卸载到一个专用的协处理器上,主 CPU 只负责调度和数据搬运。今天的 NPU、TPU、DSP 都是这个思路的延续。理解 8087 的设计哲学,就能理解为什么 AI 加速器不是“更快的 CPU”,而是“专门做某类运算的硬件”。

3.2 8087 的架构细节与对现代 AI 芯片的启示

8087 内部有 8 个 80 位寄存器,组成一个栈结构。这个设计非常有意思:它把浮点寄存器组织成栈,而不是通用的寄存器文件。指令如FLD(加载)、FADD(加法)、FMUL(乘法)都是对栈顶元素操作。这种设计的优点是编码紧凑,因为不需要在指令里指定寄存器编号;缺点是编译器很难做寄存器分配,导致性能受限。

现代 AI 加速器吸取了这个教训。以 Google TPU 为例,它的矩阵乘法单元(MXU)有专门的累加器寄存器,但指令集设计上更接近 RISC 风格,而不是栈式。不过 8087 的另一个遗产被完整继承了:异常处理。8087 可以检测除零、溢出、下溢、无效操作等异常,并产生一个中断。这个机制在 AI 芯片里变成了“数值溢出保护”和“NaN 传播检测”。我在部署量化模型时,最怕的就是激活值溢出导致输出全变成 NaN,而硬件级的异常检测能第一时间定位问题。

提示:如果你对 8087 的指令集感兴趣,可以找一份《8087 Programmer's Reference Manual》看看。里面的指令格式和现代 x87 指令基本一致,但少了 SSE/AVX 那些 SIMD 扩展。读完之后你会对“浮点单元到底在做什么”有更底层的理解。

3.3 从 8087 到现代 AI 芯片的实操映射

我在一个边缘推理项目里用过类似 8087 的“协处理器思维”。主控是一颗 STM32H7,它本身有双精度浮点单元(FPU),但跑一个轻量级神经网络还是吃力。我的做法是:把卷积运算卸载到一颗专用的 NPU 芯片上,STM32 只负责图像采集、预处理和后处理。STM32 和 NPU 之间用 SPI 通信,STM32 把图像数据打包发过去,NPU 返回推理结果。这个架构和当年 8086+8087 的关系一模一样:主 CPU 做通用逻辑,协处理器做密集计算。

实测下来,STM32 单独跑推理需要 120ms 一帧,加上 NPU 后降到了 18ms。代价是增加了 PCB 面积和功耗,但换来了 6 倍以上的速度提升。这个取舍在嵌入式 AI 里非常典型:你要么花时间优化软件,要么花硬件资源换速度。8087 在 1980 年给出的答案是“加一颗芯片”,今天的选择更多了,但逻辑没变。

4. CORDIC:没有乘法器也能算三角函数的古老智慧

4.1 CORDIC 算法的核心思想

CORDIC(Coordinate Rotation Digital Computer)是 1959 年由 Jack Volder 提出的算法,用于计算三角函数、双曲函数、指数、对数等。它的核心思想极其优雅:通过一系列固定角度的旋转,逐步逼近目标角度。每次旋转的角度是atan(2^-i),其中 i 是迭代次数。旋转的方向由当前角度与目标角度的差值决定。整个算法只需要移位、加法和查表,不需要乘法器。

这个特性让 CORDIC 在 FPGA 和低功耗 MCU 上非常受欢迎。因为 FPGA 里做乘法器很占资源,而移位和加法是天然适合硬件实现的。我在一个电机控制项目里用 CORDIC 算过 sin/cos,用来做 Park 变换(将三相电流从静止坐标系转到旋转坐标系)。用 STM32F4 的硬件 FPU 算一次 sin 大概要 50 个周期,而用 CORDIC 迭代 12 次只需要 12 个周期左右,而且精度足够(12 次迭代的角度误差小于 0.01 度)。

4.2 CORDIC 的迭代过程与参数选择

CORDIC 有两种模式:旋转模式和向量模式。旋转模式用于计算 sin/cos,向量模式用于计算 atan 和模长。以旋转模式为例,假设我们要计算角度 θ 的 sin 和 cos。初始化向量为 (1, 0),角度累加器为 0。然后进行 N 次迭代,每次迭代:

  1. 查表得到atan(2^-i)。
  2. 判断当前角度累加器是否小于 θ。如果是,则向逆时针旋转;否则向顺时针旋转。
  3. 旋转操作:x_new = x - σ * y * 2^-i,y_new = y + σ * x * 2^-i,其中 σ 是旋转方向(+1 或 -1)。
  4. 角度累加器更新:z_new = z - σ * atan(2^-i)。

迭代 N 次后,x和y分别逼近cos(θ)和sin(θ),但有一个增益因子K ≈ 1.64676。所以最终结果需要除以 K,或者预先将初始向量设为(1/K, 0)。

迭代次数 N 的选择取决于精度要求。N=12 时,角度分辨率约为 0.024 度;N=16 时,约为 0.0015 度。但每次迭代增加一位精度,代价是线性增加的。在嵌入式场景里,N=12 到 N=16 是常见范围。

注意:CORDIC 的输入角度范围是[-π/2, π/2]。如果角度超出这个范围,需要先做象限映射。比如 θ 在[π/2, π]之间,可以计算π - θ的 sin/cos,然后根据象限调整符号。这个预处理步骤很容易被忽略,导致结果完全错误。

4.3 在 AI 推理中复活 CORDIC

2026 年 CORDIC 有一个新的应用场景:在低功耗 AI 芯片里计算激活函数。神经网络的激活函数如 sigmoid、tanh、GELU 都涉及指数和三角函数。如果用查找表(LUT)实现,精度受限于表的大小;如果用多项式逼近,需要乘法器。而 CORDIC 可以在没有乘法器的情况下计算这些函数。

我试过在一颗 RISC-V 核上实现 CORDIC 版本的 tanh。RISC-V 核没有硬件乘法器,所有乘法都是软件模拟的。用 CORDIC 迭代 16 次计算 tanh,比调用软件浮点库快了将近 4 倍。虽然精度略低(相对误差约 1e-4),但对于量化后的 8 位模型来说完全够用。这个案例说明:古老的算法在特定约束下比现代方法更有效。不是所有东西都需要用矩阵乘法单元来解决。

5. AI 与硬核工程的交汇点

5.1 AI 在硬件调试中的实际用法

标题里的 AI 和硬核工程不是割裂的。我在调试 IR Blaster 和 CORDIC 时,都用到了 AI 辅助。具体来说,有三个场景特别有用:

第一,波形分析。用逻辑分析仪抓到的红外波形或 SPI 波形,导出成 CSV 后,可以让 AI 帮你找异常。比如我问过:“这段 SPI 波形里,MISO 线上的数据在时钟上升沿采样,请帮我解码成十六进制。”AI 能根据波形描述给出解码结果,虽然偶尔会错,但比手动数格子快得多。

第二,寄存器配置。ESP32 的 RMT 外设有几十个寄存器,手册读起来很累。我直接把手册里相关章节的文本贴给 AI,问:“我要生成 NEC 协议的引导码,9ms 低电平加 4.5ms 高电平,RMT 的RMT_CONF1_REG应该怎么配?”AI 给出的答案需要核对,但至少提供了一个起点。

第三,代码生成。CORDIC 的迭代循环用 Verilog 或 C 写都不复杂,但容易在边界条件上出错。我让 AI 生成一个 CORDIC 的 C 实现,然后自己加测试用例验证。AI 生成的代码在角度范围处理上确实有 bug,但核心迭代逻辑是对的,省了我不少时间。

5.2 边缘 AI 部署的实操框架

如果你想把 AI 模型部署到类似 ESP32 或 STM32 这样的设备上,我总结了一个可复用的流程:

  1. 模型选择与量化:优先选 MobileNet、TinyML 这类轻量级架构。用 TensorFlow Lite Micro 或 ONNX Runtime 做量化,把浮点模型转成 int8。量化后的模型大小通常能缩小 4 倍,推理速度提升 2 到 3 倍。
  2. 算子兼容性检查:不是所有算子都支持 int8。比如LayerNormalization在 TFLite Micro 里就没有 int8 实现。遇到不支持的算子,要么换模型结构,要么自己写 kernel。
  3. 内存规划:嵌入式设备的内存极其有限。ESP32 有 520KB SRAM,但 Wi-Fi 协议栈就要吃掉一半。留给模型的内存可能只有 100KB 到 200KB。你需要用工具(如tflite-micro的memory_planner)来规划张量的内存复用。
  4. 推理循环与实时性:如果模型需要实时推理,要确保单次推理时间小于你的控制周期。比如电机控制周期是 1ms,那推理时间必须小于 1ms。这时候可能需要把模型拆成多个小模型,或者用 CORDIC 这样的硬件友好算法来替代部分计算。

提示:在 ESP32 上跑 TFLite Micro 时,记得把ESP32的CONFIG_ESP32_SPIRAM_SUPPORT打开,外挂 PSRAM 可以大幅缓解内存压力。但 PSRAM 的访问速度比内部 SRAM 慢,对推理速度有影响。我的经验是:把权重放在 PSRAM,激活值放在内部 SRAM,这样平衡速度和容量。

5.3 硬核工程的“反 AI”价值

说了这么多 AI 的好话,也得泼点冷水。在硬件领域,AI 目前还替代不了对时序、电气特性和协议细节的理解。我见过有人用 AI 生成红外码,结果因为载波频率写成了 40kHz 而不是 38kHz,空调完全不响应。AI 不知道你的红外接收头中心频率是 38kHz,它只知道“红外遥控常用 38kHz”。这种细节必须靠人去核对 datasheet。

同样,CORDIC 的增益因子 K 是固定的,但如果你在迭代过程中改变了旋转方向序列,K 会变。AI 可能会忽略这个细节,给出一个“看起来对”但实际有系统性误差的实现。所以我的原则是:AI 用来加速探索和生成草稿,最终的正确性必须由硬件测试来保证。逻辑分析仪、示波器、万用表,这些才是硬核工程的最终裁判。

6. 常见问题与排查技巧实录

6.1 IR Blaster 不响应怎么办

这是最高频的问题。排查顺序如下:

现象可能原因排查方法
完全无响应红外 LED 极性接反用手机摄像头对着 LED,发射时看是否有紫光
偶尔响应载波频率偏差用示波器测 LED 驱动波形,确认 38kHz
距离很短驱动电流不足测 LED 峰值电流,应大于 100mA
特定按键无效协议不匹配用接收头录下原遥控器波形,对比时序
空调响应但电视不响应协议不同NEC 和 RC5 的引导码完全不同,需分别处理

我踩过最坑的一次是:ESP32 的 RMT 通道配置成了“发射后不等待”,导致连续发送时前一个码还没发完就开始发下一个,接收端直接丢弃。后来在每次发射后加了rmt_wait_tx_done()才解决。

6.2 CORDIC 精度不够怎么调

CORDIC 的精度取决于迭代次数和输入角度的范围。如果你发现结果误差大,先检查:

  • 迭代次数是否足够。N=12 时误差约 0.01 度,N=16 时约 0.001 度。
  • 角度是否做了象限映射。超出[-π/2, π/2]的角度必须先映射。
  • 增益因子 K 是否补偿。如果初始向量是(1, 0),结果需要除以 1.64676。
  • 定点数的 Q 格式是否合适。Q15 格式下,2^-i在 i>15 时会变成 0,导致迭代失效。所以定点 CORDIC 的迭代次数不能超过 Q 格式的位数。

6.3 AI 辅助硬件开发的边界在哪里

我的经验是:AI 擅长“翻译”和“补全”,不擅长“验证”。你可以让 AI 把一段英文 datasheet 翻译成中文,或者把时序图描述转成代码框架。但你不能让 AI 告诉你“这个电路能不能工作”。电路能不能工作,取决于电压、电流、时序、温度、PCB 布局,这些物理因素 AI 看不到。

所以我的工作流是:AI 生成初稿 → 人工审查关键参数 → 硬件实测 → 根据实测结果让 AI 帮忙分析异常。这个循环里,硬件实测是不可跳过的一环。

7. 从早报里挖出的项目灵感

这份早报的四个关键词,每一个都可以展开成一个完整的 DIY 项目。IR Blaster 可以做成一个 Wi-Fi 红外网关,用手机 App 控制所有家电;Intel 8087 可以做一个复古计算器,用 8086+8087 跑浮点运算;CORDIC 可以做成一个 FPGA 上的三角函数加速器,对比硬件 FPU 的资源占用和速度;AI 部分可以做一个“硬件调试助手”,用本地小模型分析逻辑分析仪的波形数据。

我个人最想尝试的是把 CORDIC 和 AI 结合起来:用 CORDIC 在低功耗 MCU 上实现激活函数,然后跑一个超轻量级的神经网络,做简单的语音唤醒或手势识别。这个方向不需要昂贵的 NPU,只需要一颗带 CORDIC 硬件加速的 MCU(比如某些 RISC-V 核已经集成了 CORDIC 指令)。如果做成了,成本可以压到十块钱以内,而且功耗极低,用纽扣电池就能跑几个月。

最后分享一个小技巧:在 Hackaday 上找项目时,不要只看标题。点进去看评论区,那里往往有比原文更精彩的技术讨论。我很多调试思路都是从评论区里学来的。比如有人提到用红外 LED 反向当接收管用,虽然灵敏度低,但在极低成本场景下可以省掉接收头。这种“歪招”在正式文档里找不到,但在 Hackaday 的评论区里比比皆是。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 6:53:15

嵌入式偶发故障排查方法论:串口假故障、蓝牙断开与烧录批次差异

1. 偶发故障为什么比稳定复现的 bug 更折磨人做嵌入式、上位机、蓝牙和烧录这一行的朋友,大概都有过这种体验:一个功能在实验室跑一整天都没事,一到客户现场或者量产抽检就偶尔抽风。串口偶尔丢一帧、蓝牙偶尔断一次、烧录偶尔校验失败&#…

作者头像 李华
网站建设 2026/10/3 6:53:02

MQTT协议入门与实战:从发布订阅原理到Java客户端开发

MQTT 这个协议,我第一次接触是在做一个远程环境监测的小项目。当时的需求很朴素:几十个分布在城郊不同位置的采集节点,要把温湿度、PM2.5 这些数据实时传回中心服务器,同时中心还能反向下发一些控制指令。最开始想用 HTTP 轮询&am…

作者头像 李华
网站建设 2026/10/3 6:52:41

openclaw 更改运行目录:OPENCLAW_STATE_DIR 环境变量配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 6:51:45

集成电路加热工艺实操解码:热源、温场与三参数协同

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 6:51:33

旅游评论情感分析系统:从数据清洗到模型选型的完整实现

简介:一套基于 Python 的旅游景点评论情感分析毕业设计项目包,面向需要完成课程设计、毕业设计或项目实战的计算机专业学习者。项目来源于导师指导并获 98 分的高分方案,源码经本地编译与严格调试可运行,难度适中,适合…

作者头像 李华
网站建设 2026/10/3 6:51:21

循环编程三题:辗转相除、倍数筛选与嵌套循环

“奇妙的比值”“T的倍数N”“三角形”——单看这三个题目,你可能会以为这是一份数学练习卷,但它们其实是入门编程课里非常经典的“循环”基础题,编号分别是16th、17th、18th。三道题放在一起很有意思:都要求用循环语句完成&#…

作者头像 李华