1. 从一份早报标题里拆出来的技术脉络第一次看到Hackaday 科技精选早报这个标题很多人会以为它只是一份资讯聚合。但真正做过内容筛选的人都知道能把 AI 和硬核工程放在同一份早报里背后其实是一条很清晰的技术判断线哪些东西是真正在改变工程实践的哪些只是热闹。我跟踪 Hackaday 这类硬核社区内容有好几年了它最值钱的地方不是告诉你发生了什么而是告诉你某个东西为什么值得动手做一遍。这份早报里出现的几个关键词——AI、IR Blaster、Intel 8087、CORDIC——看起来跨度极大一个是当下最热的软件方向另外三个是偏底层、偏硬件的经典话题。但把它们放在一起看逻辑其实很顺AI 代表的是用算力和数据换结果的现代路径而 8087 和 CORDIC 代表的是用数学技巧和有限硬件换精度的经典路径。IR Blaster 则是这两条线在消费电子里的一个具体落点。理解这三者的关系比单独看任何一条新闻都有价值。这篇文章适合谁看如果你是做嵌入式、做算法加速、做智能硬件或者只是对老技术为什么还没死这件事好奇那接下来的内容应该对你有用。我会把每个关键词背后的原理、实操要点、以及我自己踩过的坑都摊开讲尽量让你看完能直接上手试。2. AI 与硬核工程的交叉点到底在哪2.1 为什么早报要把 AI 和底层硬件放一起很多人把 AI 当成纯软件的事觉得跟硬件工程没关系。但实际做项目的人会发现AI 落地到最后瓶颈往往不在模型本身而在数据怎么采、算力怎么省、延迟怎么压。这三个问题恰恰是硬核工程最擅长的领域。举个例子一个做红外遥控的项目如果只是发固定码那用单片机就够了。但如果要让它学会识别不同品牌、不同年代的遥控协议甚至根据环境自动调整发射策略那就需要一点模式识别能力。这时候 AI 不是用来炫技的而是用来解决传统状态机写不完的边界情况。反过来AI 模型要跑在低成本 MCU 上又必须借助 CORDIC 这类经典算法来替代浮点运算。所以这两条线是互相咬合的不是并列关系。Hackaday 的编辑把这几条放在同一期我猜也是看到了这种咬合。单纯追 AI 热点的媒体很多但能把 AI 和 8087、CORDIC 放在一起讲的说明它面向的是真正动手的人。2.2 从热搜词看当前 AI 工程实践的真实需求热搜词里有一大批跟无限制无禁词相关的词这个现象本身值得说一句。它反映的不是技术需求而是很多人对 AI 的使用还停留在能不能随便聊的阶段。但从工程角度看真正有价值的需求是另一批词ai agent、ai 编程、ai 模型部署、ai native 研发范式、多 ai 协作、ai 测试开发。这几个词指向的是同一件事AI 正在从对话框里的玩具变成工程流水线里的一个环节。我自己的体会是2024 年之后身边做开发的人用 AI 的方式变了。以前是帮我写个函数现在是帮我把这个模块的测试用例补全然后跑一遍看哪里挂。这个转变对工程能力的要求其实更高了因为你要能判断 AI 给的东西对不对而不是照抄。所以这份早报里 AI 相关的部分如果只当成新闻看就浪费了。它更像是一个信号AI 工程实践正在从能用往可靠走而可靠性这件事最终还是要靠底层工程能力兜底。2.3 硬核工程为什么在 AI 时代反而更值钱有个反直觉的现象AI 越普及懂底层的人越稀缺。原因是 AI 把上层应用的开发门槛拉低了大量的人涌向应用层导致底层的人才供给相对变少。但 AI 本身又极度依赖底层——模型要跑在芯片上数据要从传感器来功耗要控制在电池能撑住的范围内。我举个具体的例子。现在很多人做 AI 语音项目直接用现成的开发板加云服务跑得挺顺。但一旦要量产成本压到几十块钱云服务不能用模型必须本地跑这时候就回到 CORDIC、定点化、内存布局这些老问题上了。这些问题没有捷径只能靠对硬件的理解一点点抠。所以 Hackaday 这类内容的价值在 AI 时代不是降低了而是升高了。它提醒你热闹的东西会变但把东西做出来的能力不会过时。3. IR Blaster一个被低估的动手项目3.1 IR Blaster 到底是什么能解决什么问题IR Blaster 直译就是红外发射器说白了就是一个能发射红外信号的装置用来控制电视、空调、风扇这类家电。听起来很老土但它的动手价值被严重低估了。为什么因为红外遥控是一个协议极其混乱的领域。同一个品牌不同型号的编码可能不一样不同品牌之间更是各玩各的。NEC、RC5、RC6、Sony SIRC、Samsung 协议……光是常见的就有十几种。你要做一个能通吃所有设备的 IR Blaster就必须处理这些协议差异。这个过程里涉及载波频率、脉宽调制、时序精度、重复码处理是一个非常扎实的嵌入式练手项目。而且它有一个天然优势反馈是即时的。你按下发射家电要么响应要么不响应不需要复杂的调试工具。这种所见即所得的特性对新手特别友好。3.2 红外协议的底层原理用生活化方式讲清楚红外遥控的本质是用红外光的高速闪烁来传递 0 和 1。但红外光本身人眼看不见所以需要一个载波来承载信号。常见的载波频率是 38kHz意思是红外 LED 以每秒 38000 次的频率闪烁。为什么要用载波因为环境里有很多红外干扰比如阳光、白炽灯。如果直接发一个长亮或长灭的信号接收端分不清是遥控信号还是环境光。用 38kHz 载波接收头只对这个频率敏感其他频率的干扰就被过滤掉了。这就像你在嘈杂的房间里跟人说话用特定的音调喊对方更容易听清。数据怎么编码以最常见的 NEC 协议为例一个1是 560 微秒的载波加 1690 微秒的空闲一个0是 560 微秒载波加 560 微秒空闲。接收端通过测量高电平持续时间来判断是 0 还是 1。整个一帧数据包含引导码、地址码、地址反码、命令码、命令反码最后还有一个结束位。反码的作用是校验如果地址和地址反码不互补说明传输出错。理解了这个你就明白为什么 IR Blaster 项目值得做它把时序编码校验载波这些嵌入式核心概念全串起来了。3.3 动手做一个 IR Blaster 的完整步骤先说硬件。你需要一个红外 LED、一个限流电阻、一个驱动三极管因为 MCU 的 IO 口驱动能力通常不够、一个红外接收头如果要做学习功能。红外 LED 选 940nm 波长的这是遥控器最常用的。限流电阻怎么算假设 LED 正向压降 1.2V目标电流 100mAMCU 供电 3.3V那电阻就是 (3.3 - 1.2) / 0.1 21 欧姆。实际用 22 欧姆标准值就行。注意这里电流要够大因为红外 LED 需要瞬间大电流才能射得远但平均电流不能超所以要用 PWM 占空比控制。软件部分核心是产生 38kHz 载波和精确的时序。用定时器生成 38kHz 方波占空比 1/3 左右比较合适。发送数据时根据协议切换载波的开和关。这里有个坑如果用软件延时来产生载波时序会不准因为中断和循环开销会累积误差。正确做法是用硬件定时器 PWM让硬件自动产生载波MCU 只负责控制开关。学习功能怎么做用红外接收头它会把 38kHz 载波解调掉直接输出数字信号。你只需要记录高电平和低电平的持续时间存成数组回放时按同样的时序发射就行。这个方法的优点是通吃所有协议缺点是存储的数据量大而且对时序精度要求高。提示红外接收头的输出是反相的收到载波时输出低电平没有载波时输出高电平。写解码逻辑时别搞反了。3.4 IR Blaster 项目里最容易踩的坑第一个坑是发射距离不够。很多人以为加大电流就行其实红外 LED 的发射角度很关键。窄角度的 LED 射得远但方向性强宽角度的覆盖广但距离短。如果你要做全屋控制可能需要多个 LED 或者用反射板。第二个坑是协议识别错误。有些遥控器的协议是变种的比如 NEC 的扩展版本地址码是 16 位而不是 8 位。如果你按标准 NEC 解码会得到错误的结果。解决办法是先抓原始时序人工分析引导码和位定义再写对应的解码逻辑。第三个坑是重复码处理。很多遥控器按住不放时会发重复码格式和第一帧不一样。如果你不处理重复码长按功能就失效了。NEC 的重复码是 9ms 引导加 2.25ms 空闲加 560us 载波比较简单但其他协议各有各的规则。我自己做这个项目时最花时间的不是写代码而是收集各种遥控器的原始数据。后来我养成了一个习惯每拿到一个新遥控器先用接收头抓一遍所有按键的时序存成文件建一个自己的协议库。这个库后来帮了我大忙做新项目时直接查表就行。4. Intel 8087浮点运算的里程碑4.1 8087 是什么为什么它值得被反复提起Intel 8087 是 1980 年推出的浮点运算协处理器配合 8086/8088 CPU 使用。它的意义在于在它之前个人电脑做浮点运算是靠软件模拟的慢得让人绝望。8087 把浮点加减乘除、三角函数、对数指数这些运算做成了硬件指令速度提升了几十倍到上百倍。为什么现在还要提它因为它是硬件加速这个思路的早期典范。今天我们用 GPU 加速 AI、用 NPU 加速推理本质上和当年用 8087 加速浮点是一个逻辑把频繁使用的、计算密集的操作从通用处理器里拿出来用专用硬件做。理解 8087 的设计取舍对理解今天的加速器架构很有帮助。8087 内部有 8 个 80 位寄存器采用栈式结构。这个设计很有意思它不像通用寄存器那样可以随机访问而是像栈一样压入弹出。这样做的好处是指令编码短因为不需要指定寄存器编号。坏处是编译器要花更多心思做寄存器分配。这个权衡在今天依然存在比如一些 AI 加速器也采用类似的栈式或流式设计。4.2 8087 的浮点格式与精度问题8087 支持三种浮点格式32 位单精度、64 位双精度、80 位扩展精度。内部运算统一用 80 位这样可以减少中间结果的舍入误差。这个设计思路叫扩展精度累加在今天的 GPU 里也能看到类似做法比如用 FP32 累加 FP16 的乘积。但这里有个经典问题80 位扩展精度和 64 位双精度之间的转换会引入误差。更麻烦的是不同编译器对中间结果的处理方式不一样有的保留 80 位有的截断到 64 位导致同一个程序在不同编译选项下结果不同。这个问题在当年困扰了很多人后来 IEEE 754 标准专门对此做了规定。如果你现在做数值计算这个教训依然适用中间结果的精度要足够高但最终输出要明确指定格式。我见过太多项目因为浮点精度问题导致结果对不上排查半天发现是中间某一步用了单精度。4.3 从 8087 到现代 AI 加速器的设计传承8087 最值得学习的地方是它对什么该用硬件做的判断。它没有把整个 CPU 都做成浮点而是只加速最常用的操作。这个思路在今天依然成立AI 加速器也不是什么都能做而是针对矩阵乘法、卷积这些高频操作做优化。另一个传承是指令级并行。8087 可以和 8086 并行工作CPU 执行整数指令的同时8087 执行浮点指令。这种异构计算的思想就是今天 CPUGPUNPU 协同的雏形。区别只是当年的总线带宽和同步机制比较简单今天的异构计算要复杂得多。我个人的看法是如果你想理解 AI 芯片为什么长成现在这样回头看看 8087 的设计文档比看任何科普文章都有用。它把加速什么怎么加速怎么和主处理器配合这三个问题回答得很清楚而且没有现代架构那么多历史包袱。5. CORDIC不用乘法器也能算三角函数5.1 CORDIC 算法的核心思想CORDIC 是 Coordinate Rotation Digital Computer 的缩写1959 年由 Jack Volder 提出。它的核心思想非常巧妙要计算一个角度不需要做乘法只需要做移位和加法通过一系列固定角度的旋转逐步逼近目标角度。具体来说CORDIC 把目标角度分解成一系列预先定义好的角度比如 45 度、26.57 度、14.04 度……每个角度对应一个旋转方向。每次旋转只需要判断当前角度和目标角度的差是正还是负然后决定往哪个方向转。旋转操作本身用移位和加法就能实现因为旋转矩阵里的 cos 和 tan 可以用 2 的幂次近似。这个算法的价值在于在没有硬件乘法器的年代它让三角函数计算变得可行。即使在今天很多低功耗 MCU 和 FPGA 里依然用 CORDIC 来做三角函数、开方、双曲函数因为它占用的硬件资源极少。5.2 CORDIC 的迭代过程与精度控制CORDIC 的迭代次数决定了精度。每迭代一次角度分辨率提高一倍。如果要达到 16 位精度大约需要 16 次迭代。每次迭代的增益是固定的最后要乘一个补偿因子。这里有个细节CORDIC 的旋转角度是预先算好的存在一个表里。表的长度就是最大迭代次数。这个表可以用常量数组实现不占运行时资源。但要注意角度表的值是 atan(2^-i)需要提前算好。精度控制方面CORDIC 的误差主要来自两个方面一是角度逼近的截断误差二是有限位宽导致的舍入误差。前者通过增加迭代次数解决后者需要保证中间结果的位宽足够。我一般会在中间结果上多留 4 到 8 位最后再截断。注意CORDIC 的增益补偿因子是连乘出来的迭代次数越多因子越接近 1.6468。如果迭代次数少因子会明显不同必须按实际迭代次数算。5.3 在 MCU 上实现 CORDIC 的实操要点先说适用场景。如果你的 MCU 有硬件乘法器而且主频够高直接用查表加插值可能更快。CORDIC 的优势在于无乘法器、低资源、可流水线化。所以它最适合的是低端 MCU、FPGA、或者需要高吞吐的定制电路。实现时定点数的选择很关键。我一般用 Q15 或 Q31 格式也就是 16 位或 32 位定点小数点在最高位之后。Q15 的范围是 -1 到 1精度约 3e-5对大多数控制应用够了。如果要做高精度计算用 Q31。代码结构上核心是一个循环每次迭代做三件事查角度表、判断方向、执行旋转。旋转的公式是x_new x - d * (y i) y_new y d * (x i) z_new z - d * angle_table[i]其中 d 是方向1 或 -1。注意这里的 x 和 y 要用旋转前的值不能边算边更新否则结果会错。这是个经典坑我第一次写的时候就栽在这里。迭代完成后x 和 y 要乘以增益补偿因子。如果迭代次数固定这个因子是常数可以直接乘。如果迭代次数可变就要动态计算。5.4 CORDIC 在现代 AI 里的新用途CORDIC 最近又火起来是因为它在 AI 推理里找到了新位置。一些轻量级神经网络需要做激活函数计算比如 tanh、sigmoid这些函数用 CORDIC 算比用查表更省资源。还有一些模型需要做旋转位置编码CORDIC 也能派上用场。更前沿的是有研究把 CORDIC 用在量子计算模拟和复数神经网络里。因为 CORDIC 天然适合处理复数旋转而复数运算在这些领域很常见。这个方向还在早期但思路很有意思用经典算法解决新问题。我自己试过在 FPGA 上做 CORDIC 流水线用来做实时信号处理。吞吐量能做到每周期一个结果资源占用比用 DSP 乘法器少一半。如果你的项目对功耗和面积敏感CORDIC 值得认真考虑。6. 这几个技术点怎么串成一个完整项目6.1 项目构思一个能学习并智能控制家电的 IR Blaster把前面几个点串起来可以做一个有意思的项目一个能自动学习遥控器协议、并且能根据环境智能调整发射策略的 IR Blaster。这个项目里IR Blaster 是执行层CORDIC 用来做信号处理8087 的历史经验用来指导架构设计AI 用来做协议识别和策略优化。具体来说用红外接收头采集原始时序用 CORDIC 做时序特征的快速变换比如把时域信号转成频域特征用轻量级 AI 模型做协议分类最后用发射电路回放或生成控制信号。整个系统跑在一颗低功耗 MCU 上不需要联网。这个项目的价值在于它把经典算法和现代 AI真正结合起来了而不是各说各话。而且每个部分都有明确的工程约束不是纸上谈兵。6.2 关键模块的实现顺序与依赖关系建议的实现顺序是先做红外收发的基础功能确保能抓能发。这一步不涉及 AI纯嵌入式。然后加 CORDIC 做特征提取这一步可以离线做用 PC 验证算法正确性。接着训练一个小的分类模型用采集到的数据做训练。最后把模型部署到 MCU 上和收发功能整合。依赖关系上红外收发是基础必须先做。CORDIC 和 AI 可以并行开发但 AI 的训练数据依赖红外采集。部署阶段要注意模型大小和 MCU 资源的匹配如果模型太大要么换芯片要么做量化压缩。6.3 资源受限下的取舍策略低功耗 MCU 的资源很紧张通常只有几十 KB 的 RAM 和几百 KB 的 Flash。这时候取舍就很重要。我的策略是把最耗资源的操作放到采集阶段离线做运行时只做轻量级推理。比如协议分类可以用一个简单的决策树或者最近邻不需要神经网络。CORDIC 的迭代次数也要权衡。迭代 8 次精度约 8 位迭代 16 次精度约 16 位。如果只是做特征提取8 次可能就够了。发射时序的精度要求高但那个不需要 CORDIC直接用定时器。还有一个取舍是要不要做在线学习。在线学习能让设备适应新遥控器但会增加代码复杂度和内存占用。我的建议是初期不做先把离线学习做好等稳定了再考虑在线。7. 常见问题与排查技巧实录7.1 红外发射没反应怎么排查第一步用手机摄像头看红外 LED。手机摄像头能拍到红外光如果发射时看到 LED 亮说明电路没问题问题在协议或时序。如果不亮检查 LED 极性、限流电阻、驱动三极管。第二步用示波器看接收头的输出。如果没有示波器可以用另一个红外接收头加 LED 做简易指示。接收头输出有信号但设备不响应说明协议不对。这时候要抓原始时序和已知协议对比。第三步检查载波频率。38kHz 是标准但有些设备用 36kHz 或 40kHz。频率偏差超过 10% 就可能不响应。用定时器精确生成载波不要用软件延时。7.2 CORDIC 计算结果偏差大的原因最常见的原因是增益补偿没做或者做错了。CORDIC 每次旋转都会让向量长度增加最终增益是连乘的结果。如果忘了补偿结果会偏大。第二个原因是角度表不对。角度表的值是 atan(2^-i)单位是弧度。如果你用角度制结果会完全错。另外要注意角度表的精度至少要和中间结果位宽匹配。第三个原因是迭代方向判断错误。判断依据是当前剩余角度 z 的符号不是目标角度的符号。这个逻辑要写对否则会越转越偏。7.3 AI 模型部署到 MCU 的常见坑第一个坑是浮点运算。很多 MCU 没有硬件浮点用软件浮点会非常慢。解决办法是量化成定点用整数运算。TensorFlow Lite Micro 和 CMSIS-NN 都支持定点推理。第二个坑是内存不够。模型权重、中间激活、输入输出缓冲区都要占内存。如果不够要么减小模型要么用外部 Flash 存储权重运行时按需加载。第三个坑是算子不支持。MCU 上的推理框架通常只支持有限的算子。如果你的模型用了不支持的算子要么换算子要么自己实现。我一般会在训练阶段就限制算子集避免部署时才发现问题。7.4 常见问题速查表问题现象可能原因排查方法解决思路红外发射无反应LED 极性反、电阻过大、载波频率错手机摄像头看 LED、示波器看波形检查电路、校准载波部分按键有效协议识别错、重复码未处理抓原始时序对比修正解码逻辑CORDIC 结果偏大增益未补偿检查补偿因子按迭代次数算补偿CORDIC 结果乱跳迭代方向判断错打印中间 z 值修正符号判断AI 推理极慢用了软件浮点查看反汇编量化成定点模型加载失败内存不足、算子不支持看错误日志减模型、换算子8. 我个人的一些实操体会做这类项目这么多年最大的体会是不要一上来就追求智能。先把基础功能做扎实让设备能稳定收发再考虑加 AI。我见过太多项目AI 部分做得很花哨但底层时序不稳结果整体不可用。另一个体会是经典算法值得反复学。CORDIC 是 1959 年的东西但它在今天的低功耗场景里依然是最优解之一。8087 是 1980 年的芯片但它的设计思路在今天依然被沿用。这些老东西不是过时了而是被验证过了。最后分享一个小技巧做红外项目时建一个自己的协议数据库。每遇到一个新设备就抓一遍时序存下来。时间长了这个库就是你的核心竞争力。很多问题不用重新分析查表就行。这个习惯我从做第一个 IR Blaster 项目时就开始养到现在已经积累了几百条记录帮我省了无数时间。