4、补偿算法实战:亮度补偿算法、色度补偿算法、外部补偿与内部补偿
好,咱们进入实战环节。前面讲了像素结构、TFT 老化机理,那些都是理论基础。真正让 OLED 面板能卖出去、能让用户觉得「这块屏真不错」的,是补偿算法。
说白了,补偿算法就是给每个像素算一笔账——它老化了多少、偏色了多少,然后通过驱动信号给它「找补」回来。我做了这么多年驱动,见过太多面板在补偿前惨不忍睹,补偿后焕然一新的案例。
核心观点:没有补偿的 OLED 面板,就是一块「出厂即报废」的面板。补偿算法决定了面板的寿命和画质天花板。
4.1 亮度补偿算法
亮度补偿是最基础、也是最先要解决的问题。你想想看,一块新面板刚点亮时,亮度均匀性可能还有 95% 以上。但跑了几百小时后,有些像素的亮度掉到了 80%,有些还在 90%。这时候如果不做补偿,屏幕上就会出现明显的「烧屏」痕迹。
4.1.1 查表法(LUT-based)
最直接的做法。提前在产线测好每个像素的亮度衰减曲线,存成一张查找表。驱动芯片工作时,根据像素当前的灰阶和累计使用时间,从表里读出补偿系数。
// 伪代码示例:查表法亮度补偿
uint8_t lookup_compensation(uint16_t x, uint16_t y, uint8_t gray, uint32_t age) {
// 从 LUT 中读取该像素的衰减因子
float decay = lut_table[x][y][age];
// 计算补偿后的灰阶
uint8_t compensated = (uint8_t)(gray / decay);
// 钳位到有效范围
return (compensated > 255) ? 255 : compensated;
}
这个方法简单可靠,但有个硬伤——LUT 太大。一块 4K 面板有 800 多万个像素,每个像素存几十个时间点的衰减数据,存储量轻松上 GB。我在一个 8K 项目里试过,光 LUT 就把外挂 Flash 撑爆了。
4.1.2 多项式拟合法
后来大家学聪明了。不存原始数据,而是存拟合系数。每个像素的亮度衰减曲线可以用一个二次或三次多项式来描述:
L(t) = L0 * (1 - a*t - b*t² - c*t³)
驱动芯片只需要存 3~4 个系数,计算量也不大。我个人习惯用三次多项式,拟合精度在 1% 以内,足够用了。
实战经验:多项式拟合要注意边界条件。我曾经遇到过拟合曲线在长时间后出现「上翘」的情况——衰减曲线居然变成增长曲线了。后来加了约束条件,强制导数始终为负,才解决这个问题。
4.1.3 亮度补偿的精度要求
| 应用场景 | 亮度均匀性要求 | 补偿精度 | 典型方法 |
|---|---|---|---|
| 手机屏 | ≥ 90% | ±3% | 查表法 |
| 电视屏 | ≥ 95% | ±1.5% | 多项式拟合 |
| 专业监视器 | ≥ 98% | ±0.5% | 混合法(查表+拟合) |
4.2 色度补偿算法
亮度补偿搞定了,但用户还会说「屏幕发绿」或者「偏蓝」。为什么?因为 OLED 的 RGB 子像素老化速度不一样。蓝色像素老化最快,红色最慢。时间一长,白平衡就飘了。
色度补偿的核心思路:不是单独调每个子像素的亮度,而是调它们之间的比例。
4.2.1 色度补偿的数学模型
假设目标白平衡的色坐标为 (x₀, y₀),当前像素的色坐标为 (x, y)。我们需要调整 RGB 的驱动权重,让 (x, y) 逼近 (x₀, y₀)。
// 色度补偿核心计算
void chroma_compensate(float r_in, float g_in, float b_in,
float *r_out, float *g_out, float *b_out) {
// 读取当前像素的色度偏移矩阵
float matrix[3][3] = get_chroma_matrix(x, y);
// 矩阵乘法:补偿后的 RGB = 偏移矩阵的逆 × 原始 RGB
*r_out = matrix[0][0]*r_in + matrix[0][1]*g_in + matrix[0][2]*b_in;
*g_out = matrix[1][0]*r_in + matrix[1][1]*g_in + matrix[1][2]*b_in;
*b_out = matrix[2][0]*r_in + matrix[2][1]*g_in + matrix[2][2]*b_in;
}
注意:色度补偿不能独立于亮度补偿做。先做亮度补偿,再做色度补偿,顺序不能乱。我曾经在一个项目里把顺序搞反了,结果补偿后的画面出现了奇怪的色斑,排查了两天才找到原因。
4.2.2 色度补偿的难点
- 灰阶依赖性:同一个像素在不同灰阶下的色偏不一样。低灰阶偏蓝,高灰阶偏红,这是常见现象。
- 温度敏感性:OLED 的发光效率随温度变化,色度也会漂。我建议在驱动 IC 里集成温度传感器,做实时修正。
- 视角相关性:从不同角度看,色度偏移不同。这个在手机屏上还好,电视屏上就比较头疼。
4.3 外部补偿与内部补偿
补偿算法怎么落地?有两种路线:外部补偿和内部补偿。这两者的区别,说白了就是「补偿计算放在哪」的问题。
4.3.1 外部补偿
补偿算法跑在面板外部的芯片或处理器上。常见方案:
- FPGA 方案:灵活,算力强,适合研发阶段和高端产品。
- 独立补偿芯片:比如 Novatek、联咏的专用芯片,成本比 FPGA 低。
- SoC 集成:把补偿算法做到主控芯片里,适合手机、平板等集成度高的产品。
外部补偿的好处是算法可以很复杂,精度高。坏处是增加了系统成本和功耗。
4.3.2 内部补偿
补偿算法直接集成在 OLED 驱动 IC 内部。驱动 IC 里有个小处理器,专门跑补偿算法。
- 优点:成本低、功耗低、不占 PCB 面积。
- 缺点:驱动 IC 的算力和存储有限,算法必须精简。
我的建议:如果做高端产品(电视、专业显示器),用外部补偿,精度优先。如果做消费级产品(手机、手表),用内部补偿,成本优先。我在一个智能手表项目里用过内部补偿,把算法压缩到 2KB 代码、256 字节 RAM 里跑,效果还不错。
4.3.3 两种方案的对比
| 对比项 | 外部补偿 | 内部补偿 |
|---|---|---|
| 算法复杂度 | 高(支持神经网络、高阶拟合) | 低(查表法、线性插值为主) |
| 存储需求 | GB 级(外挂 Flash/DRAM) | KB 级(片上 SRAM) |
| 更新灵活性 | 高(可通过固件升级) | 低(出厂即固化) |
| 典型成本增加 | $2~$10 | $0.3~$1 |
| 适用场景 | TV、Monitor、车载 | 手机、手表、IoT |
4.4 补偿算法的整体流程
下面这张图是我在实际项目中常用的补偿流程,你可以参考一下:
4.5 实战中的避坑指南
最后分享几个我在项目中踩过的坑,希望能帮你少走弯路:
- 补偿精度不是越高越好。我曾经把补偿精度做到 0.1%,结果驱动 IC 算不过来,帧率掉了一半。后来发现人眼对 1% 以内的亮度差异基本不敏感,没必要追求极致精度。
- 注意补偿算法的实时性。4K@60Hz 的屏幕,留给每个像素的补偿时间只有不到 4 微秒。算法必须足够快,否则会拖累刷新率。
- 补偿数据要定期更新。面板的老化不是线性的。我建议每 1000 小时重新标定一次补偿参数,或者用实时监测数据动态调整。
- 别忘了边界情况。低灰阶(0~10)和高灰阶(245~255)的补偿要特别小心。低灰阶容易过补偿导致闪烁,高灰阶容易饱和导致细节丢失。
重要提醒:补偿算法不是万能的。如果面板本身有坏点、亮点或者严重的 Mura,补偿算法只能缓解,不能根治。产线检测和良率控制才是根本。