农历节气数据极限压缩:从几百KB到几KB的位域与差分编码实践

简介:这套原创的农历与节气极限压缩算法,面向嵌入式开发者、算法爱好者以及需要实现日历或农历转换功能的程序员。它以每年仅十一字节的存储量,同时承载农历月份、节气、梅雨、数九和伏日信息,兼顾空间占用与运行效率,解决了传统查表法体积庞大、手工提取历法数据繁琐的痛点。压缩包共九个文件,整体约六百六十八千字节,源码与工程配置齐全,其中C语言源文件和头文件可直接编译运行,说明文档则对算法设计与工具使用作出指引;提取工具也内置于包中,支持自定义年份并自动生成所需农历数据,免去翻阅万年历的重复劳动。已有四百七十八人学习浏览,适合希望深入理解极致压缩思路、将其移植到嵌入式或桌面应用的开发者。无论是在单片机日期显示、日历组件开发,还是历法算法研究中,这份资料都能提供完整的参考实现。

1. 农历节气数据为什么需要极限压缩:从几百KB压到几KB

做嵌入式日历、离线硬件时钟、低功耗传感器节点的人,迟早会碰上同一个需求:设备没联网,却要把未来几十年的农历、节气显示在本地。常见做法是直接塞一份生成好的农历数据表,一份覆盖 1900-2100 年的公农历对照表,纯文本能到几百 KB。MCU 的 Flash 往往只有 256KB 或 512KB,几百 KB 直接挤占固件空间,更别说还要留给字库和协议栈。所谓“极限压缩”,就是只保留计算农历、节气所需的数学要素,把完整表打散成紧凑的位流,让同样时间跨度压到原来的几十分之一,同时保留一个小的提取工具在 PC 端生成这份位流,固件端只留一个极小的解压函数。本文就把这套方案拆开讲:数据里有什么冗余、编码怎么设计、提取工具怎么写、会踩哪些坑。

2. 数据特征先行:农历、节气里有哪些可压缩的冗余

2.1 农历年信息的最小构成:月序、大小月、闰月

农历一个年周期的信息其实很少。不考虑公历日期映射,只关心“这一年有几个个月、哪些月是大月 30 天、哪个月是闰月”,就能唯一推算出整年的月序。常见的农历数据源会存成数组,每年约 20 多个字节,但真正需要的信息拆开后是:

  • 是否有闰月:1 bit
  • 闰月在第几个月:4 bit(最多 13 个朔望月,需 4 bit)
  • 从正月到腊月的大小月:最多 13 个月,每个 1 bit,共 13 bit

这样一年只占 18 bit,约 2.25 字节。200 年也就 450 字节。这是最原始的位域压缩,还没用上跨年差分。数据冗余的直观来源就是:大小月的分布是有规律的,闰月出现频次低,相邻年份的月序往往变化很小,直接存储完整表浪费了大量固定值。

真正落地时,我会把每年编码成一个 32 位整数,高位留作月份数标记,低位用固定位宽存储上述字段。这样解压时只需要移位和掩码,不需要变长解码,代价是稍多几个 bit,但固件端解码极快。

2.2 节气日期的天文周期与差分规律

节气看似复杂,实际是太阳黄经的等分点。每个节气在公历日期上有固定窗口:如春分总在 3 月 20-22 日,夏至总在 6 月 21-22 日。一年 24 个节气,日期相对于公历的偏移量通常只有 -1 到 +2 天。

这种强规律性非常适合差分编码。我不需要存储“几月几日”,只需要存储“每个节气相对某基准日的偏移”。基准日可以选每年 1 月 1 日,那么每个节气日期就是 0-365 之间的一个数,24 个节气需要 24 个数,每个约 8 bit,每年 192 bit。但这还没利用节气间的固定间隔:相邻节气约 15 天,实际在 14-16 天之间波动。所以更极限的做法是只存储第一个立春的偏移量,然后后续每个节气存相对上一个节气的“差值”,差值范围通常在 -1 到 +3 之间,用 2-3 bit 就能表示。

这里有一个关键参数:差值范围。经过对 1900-2100 年数据的统计,我的工具默认差值编码用 3 bit(能表示 -1 到 6,远超实际),因为 2 bit 范围是 -2 到 1,但冬至到小寒这种跨边界处偶尔出现差值为 2 的情况,用 2 bit 会溢出。如果追求极限,可以对不同时段用不同位宽,但那会让解码逻辑复杂,我一般只把 3 bit 作为默认,后续再考虑压缩形态。

3. 压缩编码设计:从位域到差分,把每个bit用到极致

3.1 农历年数据的位域编码:闰月与大小月一次搞定

设计一个 32 位农历年编码结构,低 13 位为大小月掩码(1 表示大月 30 天,0 表示小月 29 天),接下来的 4 位为闰月号(0 表示无闰月),剩余高位留作月份计数或扩展。这里有个坑:闰年有 13 个月,大小月掩码需要 13 位,普通年只有 12 个月。为了让解码统一,我建议普通年也读满 13 位,第 13 位强制为 0,这样解码循环按 13 个月处理,遇到无闰月时自动跳过第 13 个月。

下面是我在提取工具里用 Python 生成编码的片段:

def encode_lunar_year(year, leap_month, month_sizes): """ year: 农历年份 leap_month: 0 表示无闰月,否则为闰月月份号 month_sizes: list of 0/1,长度 13,无闰月时第 13 位填 0 """ mask = 0 for i, size in enumerate(month_sizes[:13]): if size: mask |= (1 << i) # 低位第 i 位表示第 i+1 月是否大月 code = mask | (leap_month << 13) # 可在此处添加校验:有闰月时 month_sizes 必须为 13 个 return code

这段代码的核心是掩码拼接。month_sizes[:13]强制取 13 项,保证普通年的第 13 位是 0。leap_month << 13把闰月号放在 13 位掩码之后,两个字段互不干扰。解压时:

def decode_lunar_year(code): leap_month = (code >> 13) & 0x0F sizes = [(code >> i) & 1 for i in range(13)] return leap_month, sizes

参数说明:leap_month << 13中的 13 是大小月掩码的位宽,不能随便改。如果你的数据源里闰月计数是从 0 开始的,注意先加 1 再存。我在开发时就因为这个偏移错位,导致解出来的闰月总比实际晚一个月,后面章节会单独列出来。

3.2 节气日期的分组差分编码:黄经序列的固定模式

24 个节气按“节”和“气”交替,其实可以分成 12 组。每组包含一个“节”和一个“气”,相邻组的间隔约 30 天。我的做法是:不存 24 个绝对日期,而是存每组的第一天与基准日的偏移,以及组内两个节气的差值。这样原本 24 个值缩减为 12 个“首位偏移”加 12 个“组内差值”,总共 24 个值没变,但差分之后数值范围变小,可以用更少 bit。

进一步利用规律:12 个“首位偏移”本身也有线性趋势,大约每隔 30 天。如果直接存它们的差分,又能省一截。这里我给出一个实用的编码格式:

  • 第一个节气立春:相对于 2 月 4 日的偏差,范围 -1 到 +2,用 2 bit 不够覆盖极端年份,故用 4 bit 存放,值为 0-15,表示与 2 月 1 日的偏移天数。
  • 后续 23 个节气:每个存与上一个节气的天数差,统计可得差值为 15 或 16 为主,偶尔 14。为了让每个值都限定在 2 bit,可以将值减去 14,得到 0、1、2,用 2 bit 表示,极少数情况差值 13 或 17,可以用保留值 3 表示“转义”,再追加 5 bit 存实际差值。

这个方案里,转义机制是为了防溢出。如果不加转义,直接把所有差值减去 14 塞进 2 bit,遇到 13 就会下溢。转义牺牲了少量空间,但保证了所有年份可用。

用代码说明编码逻辑:

def encode_solar_terms(term_dates): """ term_dates: list of 24 个公历日期(1 表示 1 月 1 日) 返回 bit 流 """ base = term_dates[0] # 第一个节气日期 bits = '' # 第一个节气:相对于 2 月 1 日的偏移,0-15 offset = base - 32 # 2 月 1 日是一年的第 32 天 bits += f'{offset:04b}' for i in range(1, 24): diff = term_dates[i] - term_dates[i-1] val = diff - 14 if 0 <= val <= 2: bits += f'{val:02b}' else: bits += '11' # 转义标记 bits += f'{diff + 5:05b}' # 存实际差值 + 5,避免负数 return bits

这里offset = base - 32是因为 2 月 1 日是一年的第 32 天,立春在 2 月 3-5 日,偏移范围很小。注意年份如果是闰年,2 月 1 日还是第 32 天,不受影响,因为日期序号从 1 月 1 日算起固定。转义分支里diff + 5是自定义偏移,让所有可能的 13-17 都映射为正数,解码时再减 5 即可。这个 +5 是我拍脑袋定的,只要保证映射单调即可,你可以在工具里改成 +10 也不影响。

3.3 生成查表所需的解压参数

光有压缩流还不行,固件端需要一个明确的“段表”来定位每年的起始 bit。因为农历年用定长 32 bit,节气用变长 bit,必须记录每部分的偏移。我的做法是在压缩数据头部放一个索引表:

  • 前 2 字节:农历数据起始地址(相对于文件头)
  • 前 4 字节:节气数据起始地址
  • 每年农历记录固定 32 bit,所以直接按年份偏移即可
  • 节气数据需要年度偏移表,每年 2 字节的 bit 偏移,200 年共 400 字节

这个索引表本身也是压缩数据的一部分,但相对总大小很小。我在工具里会生成一个 C 头文件,包含数组和偏移表,方便直接编译进固件。

// 生成的 cal_data.h (示意) typedef struct { uint16_t lunar_offset; // 该年农历编码在 lunar_table 中的 bit 偏移 uint16_t term_offset; // 该年节气编码在 term_table 中的 bit 偏移 } year_index_t; extern const uint32_t lunar_table[]; extern const year_index_t year_index[];

参数说明:lunar_offset用固定 32 bit 对齐,理论上可以省略,但保留它可以支持未来变长农历格式。term_offset必须精确到 bit,因为节气编码是变长的。生成工具时我用了 bitarray 类来拼装,最后再落盘,避免手动管理 bit 偏移出错。

4. 数据提取工具:从原始天文表到压缩字节流

4.1 工具输入与输出格式约定

“带数据提取工具”指的就是一个 PC 端脚本,输入是某种农历/节气原始数据源,输出是压缩后的字节流和 C 头文件。原始数据源常见的有两种:一是从历书中抓取的文本表,二是通过天文算法直接计算的朔望月与节气点。我推荐用天文算法生成,因为文本表往往只覆盖 1900-2100,且存在人工录入错误。

我的工具输入格式是一个 CSV:每年一行,包含农历年号、有无闰月、闰月号、13 位大小月,以及 24 个节气日期。输出为一个.bin文件和一个.h文件。下面直接给工具的骨架。

4.2 提取与编码命令:一次生成全量数据

工具主流程如下:

# extract_cal.py import csv, struct def process_year(row): year = int(row['year']) leap = int(row['leap_month']) sizes = eval(row['month_sizes']) # 13 元素 list lunar_code = encode_lunar_year(year, leap, sizes) terms = [int(x) for x in row['terms'].split(',')] # 24 个日期序号 term_bits = encode_solar_terms(terms) return lunar_code, term_bits # 读取 CSV,逐行处理,拼装表 with open('cal_input.csv', 'r', encoding='utf-8') as f: reader = csv.DictReader(f) lunar_array = [] term_bitstream = '' year_index = [] term_bit_pos = 0 for row in reader: lunar_code, term_bits = process_year(row) lunar_array.append(lunar_code) year_index.append((len(lunar_array) - 1) * 32, term_bit_pos)) term_bitstream += term_bits term_bit_pos += len(term_bits) # 写出二进制 with open('cal.bin', 'wb') as f: for code in lunar_array: f.write(struct.pack('<I', code)) # 补齐 term_bitstream 到整字节 term_bytes = int(term_bitstream + '0' * (8 - len(term_bitstream) % 8), 2).to_bytes( (len(term_bitstream) + 7) // 8, 'little') f.write(term_bytes)

参数说明:year_index是我们前面提到的索引表,term_bit_pos变量累积每一年节气 bit 长度,确保后面索引正确。struct.pack('<I', code)用小端序写入,固件端读取时必须对应小端。如果不做对齐,节气流最后会有 0-7 位填充,填充数依赖len(term_bitstream) % 8,这部分可以在文件头里额外存一个字节记录有效位,但我在工具里直接用填充 0 的方式,因为解码时索引表记录每个年份的偏移,多余的填充不会影响定位。

4.3 解压与验证脚本

提取工具还必须带一个反向解压,验证编码正确性。这是防止“压缩完了解不回来”的最快方法。写一个验证函数:

def validate(encoded_bits, original_rows): # 重新解码,比较原始数据 decoded = decode_lunar_year(encoded_lunar_code) assert decoded == (orig_leap, orig_sizes)

具体验证流程比较繁琐,通常把原始 CSV 里的数据全部还原成数组,再与原数组逐项比对。我在工具里加入了一个--check参数,如果比对失败会打印年份和错位字段。这个习惯救了我好几次,特别是当修改了节气差值偏移量后,很容易出现整体差一天的问题,不验证根本发现不了。

5. 避坑指南:日期越界、闰月定位、时区漂移这类问题怎么排查

5.1 节气日期“跨月”导致索引错位

现象:解压后发现某些节气日期比真实日期早或晚一个月,比如惊蛰显示成 2 月 5 日,但实际是 3 月 5 日。

原因:节气在公历上分布不均匀,小寒在 1 月,大寒也在 1 月,但若把 24 个节气按数字序号直接映射到自然月,遇到跨月的边界时,索引计算溢出。具体来说,我的差分编码只保存日期序号,解码时如果日期序号超过 365,就自动进位到下一年,而工具里没处理。

解决:解码时不要直接减去某个基准日,而是保留日期序号,然后通过查表转为“月-日”。或者在编码时,将日期归一化为 0-365,超过 365 的值强制减 365。我踩过最狠的一次是 2100 年不是闰年,日期序号仍然按平年算,最后一个节气“大雪”被解成下一年的 1 月 7 日。最终方案:在生成索引表时,每两年记录一个“年份基准偏移”,用来抵消跨年。

5.2 闰月编码遇上近百年无闰时表长不齐

现象:某些年份数组长度只有 12,但解码循环固定读 13 位,导致后续年份的数据全错位。

原因:我最初设计是普通年 month_sizes 只给 12 个,而编码函数固定读 13 个。如果数据源里漏了第 13 位补 0,编码结果高低错位,甚至影响闰月号读取。

解决:编码前统一补齐 13 位,并在编码函数里加断言:

assert len(month_sizes) == 13, f"{year} 的 month_sizes 必须为 13"

另外,闰月号 0 表示无闰,但有些历书用 0 表示正月闰,这是个陷阱。我的数据源一致约定:闰月号范围 1-13,0 表示无闰,提取工具对 0 值单独处理,不参与移位。

5.3 时区与天文计算的东八区偏移

现象:用公开天文算法直接计算节气日期,得到的结果比官方历书差一天。

原因:天文算法计算出的节气时刻是 UTC 时间,而中国农历节气以北京时间(东八区)为准。如果算法输出的是世界时,需要加 8 小时再取日期。特别是春分秋分附近,节气可能发生在 UTC 23 点,加上 8 小时后变成次日凌晨,日期自然多一天。

解决:在提取工具里统一增加时区处理。我的做法是:所有天文计算输出为儒略日,再转换时按东八区取整。如果你面向的是其他时区用户,应把这一参数暴露为配置项。这里最容易忽视的是“日期序号”和“实际公历日期”之间的换算,如果直接拿到的是节气时刻的小数,必须先转成日期再减基准。

5.4 解压端字节序与位对齐翻车

现象:固件端读到的农历编码完全错乱,年份对不上,节气偏移表指向的 bit 位置偏差。

原因:PC 端用 Python 默认小端写,但固件端用的 MCU 可能是大端。或者节气 bit 流存成字节时,填充位在低位还是高位没有约定一致。

解决:在压缩文件头部写入 2 字节的魔数和 1 字节的字节序标志。固件端读取后先校验,不匹配则交换字节顺序。我之前就因为没有做标志,烧录到 ARM 和 RISC-V 两块板子上表现出完全不同的结果。另外,节气流按字节拆包时,约定“低位先出”,即第一个 bit 处于字节的最低位。这个约定最好写进注释,因为一旦写成高位先出,所有偏位移位都要反过来,排查难度极大。

6. 把压缩率再往前推一步:可变长编码与分段索引

前面给出的方案已经能把 200 年农历节气数据压到大约 2-3 KB,但对存储极度敏感的设备还能再压缩。最容易想到的是把节气差值的位宽从 2 bit 改成动态霍夫曼编码。我实际测试过一套微调:把 24 个节气差值中频率最高的值(15、16 天)用 1 bit 表示,0 代表 15,1 代表 16,其他值用转义序列表示。这样大多数年份的 23 个差值只需要 23 bit,加上第一个节气 4 bit,共 27 bit,反而比固定 2 bit(46 bit)少了一半。代价是解码时多一个分支判断,但 MCU 上这个分支开销可以忽略。

再进一步,可以把索引表也压缩。年度偏移表本身有规律:每年节气流长度基本固定,偶尔多几个转义位。如果先统计所有年份的偏移差,再对偏移差做变长编码,能让索引表从 2 字节/年降到 0.5 字节/年。不过这个收益有边界:200 年索引表原本 400 字节,压到 100 字节,对整个包来说提升有限,但如果你要做成 2000 年的数据,意义就大了。

我的习惯是先用脚本自动扫描两种编码方案在不同年份跨度下的总 bit 数,再决定用固定位宽还是混合编码。有个小技巧:验证压缩率时不要只看总字节数,要看“每十年的 bit 数”,因为节气长度可能随年份波动。我通常输出一张三行表格,包含农历表大小、节气表大小、索引表大小,对比不同年份跨度。

最后说一个我自己常犯的错:改完编码后忘记同步更新索引表生成逻辑。压缩数据本身解压成功了,但固件端通过索引表定位时拿到的还是旧 offset。现在我会在提取工具里强制加一个自检:解码后与原始 CSV 完全比对,不一致直接报错退出。这个习惯救了我好几次,也让我敢放心调参。这套方案做到这里,压缩率和解码速度基本到了可接受的边界,如果你的设备连几千字节都挤不出来,那可能需要考虑运行时计算朔望月,但那会让固件复杂度上一个数量级,一般不值得。希望这些思路和坑能帮到你。

本文还有配套的精品资源,点击获取

相关新闻

RCE靶场实战:命令注入利用与中文乱码修复全攻略

RCE靶场实战:命令注入利用与中文乱码修复全攻略

1. 项目概述&#xff1a;RCE练习中的乱码谜题1.1 这个标题到底在讲什么RCE&#xff08;远程代码执行/命令执行&#xff09;是Web安全里绕不开的一类高危漏洞。简单说&#xff0c;就是应用把用户的输入直接拼进了系统命令或者代码上下文&#xff0c;导致输入本身变成了可执行内容…

2026/10/20 15:49:44 阅读更多 →
图表设计实战:从信息层级到可落地规范,告别业余画图

图表设计实战:从信息层级到可落地规范,告别业余画图

1. 从"diagram-design"这个标题能读出什么第一次看到"diagram-design"这个标题&#xff0c;我脑子里蹦出来的第一个念头是&#xff1a;这大概率不是一个单纯的"画图工具"项目&#xff0c;而是一套关于"图表设计"的方法论或者设计系统。…

2026/10/20 15:49:44 阅读更多 →
支付安全测试实战:8类高频逻辑漏洞攻防解析与修复指南

支付安全测试实战:8类高频逻辑漏洞攻防解析与修复指南

搞支付安全测试这几年&#xff0c;我最深的感受是&#xff1a;真正让系统翻车的往往不是加密算法被攻破&#xff0c;也不是防火墙被绕过&#xff0c;而是业务逻辑层面的那些“看着不起眼”的漏洞。签名验签、传输加密做得很到位&#xff0c;结果攻击者只是改了个金额参数、换了…

2026/10/20 15:49:44 阅读更多 →

最新新闻

PyTorch实战指南:LSTM、CNN、分布式训练与图网络高频问题全解

PyTorch实战指南:LSTM、CNN、分布式训练与图网络高频问题全解

1. 这个系列到底在整理什么这个"PyTorch 秘籍"系列整理到现在&#xff0c;已经不像一份教程了&#xff0c;更像是我平时在项目里翻工具箱时的随手笔记。RNNs 和 CNNs 是深度学习里最常碰的两个结构&#xff0c;Python 工具决定了我能不能一天跑完一组对照实验&#x…

2026/10/20 16:41:43 阅读更多 →
榜单揭示AI视频生成赛道分化:通用模型与影视垂直模型较量

榜单揭示AI视频生成赛道分化:通用模型与影视垂直模型较量

凌晨一点刷完榜单数据&#xff0c;我第一反应是这榜单是不是出 bug 了——榜单前三的位置里&#xff0c;赫然挂着一家影视公司的名字&#xff0c;而大厂的通用视频生成模型 Seedance 被压到了第四名。评论区已经吵成一团&#xff0c;有人喊“完蛋了&#xff0c;大厂被弯道超车”…

2026/10/20 16:41:43 阅读更多 →
pyKT知识追踪框架:标准复现与统一评估实践指南

pyKT知识追踪框架:标准复现与统一评估实践指南

1. 从零散脚本到统一基准&#xff1a;为什么需要pyKT这样的知识追踪框架做知识追踪&#xff08;Knowledge Tracing&#xff09;方向的朋友&#xff0c;大概都有过这样的经历&#xff1a;想复现一篇论文的结果&#xff0c;翻遍作者放出来的代码&#xff0c;发现数据预处理各写各…

2026/10/20 16:41:43 阅读更多 →
大模型高效使用指南:提示词、思维链与实战技巧全解析

大模型高效使用指南:提示词、思维链与实战技巧全解析

最近两年&#xff0c;AI大模型的热度可以说是一路狂飙。刷短视频、看新闻、同事群里聊天&#xff0c;几乎到处都能看到用大模型写周报、做PPT、改Bug的真实案例。但我也发现一个很有意思的现象&#xff1a;不少人注册了账号、打开对话框&#xff0c;问了几天之后得出结论——&q…

2026/10/20 16:41:43 阅读更多 →
XSS跨站脚本攻击:原理、类型与防护实践

XSS跨站脚本攻击:原理、类型与防护实践

1. 项目概述1.1 从一次弹窗开始认识XSS你可能见过这种场面&#xff1a;某天打开一个博客&#xff0c;看到一个页面弹窗&#xff0c;上面写着“你的Cookie已泄露”。很多同学第一反应觉得是恶作剧&#xff0c;但实际上这就是跨站脚本攻击的经典演示。XSS的全称是Cross-Site Scri…

2026/10/20 16:41:43 阅读更多 →
722篇数学成果目录深度拆解:分类逻辑、筛选标准与追踪方法

722篇数学成果目录深度拆解:分类逻辑、筛选标准与追踪方法

1. 这份722篇数学成果目录到底意味着什么 第一次看到“722篇数学成果目录”这个说法&#xff0c;我的直觉是&#xff1a;这不是一份普通的论文列表&#xff0c;而更像是一次集中式的成果归档。722这个数字本身就很有意思——它既不是几十篇那种小规模的技术报告&#xff0c;也不…

2026/10/20 16:40:33 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/20 9:50:45 阅读更多 →