多核架构中,RTOS小核跑sensor 的normal模式,大核linux核跑WDR模式,将小核的曝光时间映射到WDR模式中的曝光时间的方法

目录

核心思路

一、数学映射模型(核心公式)

基础映射公式

联立求解

硬件限制修正

[二、完整代码实现(C 语言,可直接移植到 Linux 大核)](#二、完整代码实现(C 语言,可直接移植到 Linux 大核))

代码关键说明

三、调优建议

总结


在多核架构下,将小核(Sensor Normal 模式)算出的单帧曝光时间 ,合理映射到大核 Linux 系统中 WDR(宽动态范围)模式所需的长曝光时间短曝光时间,确保两种模式的曝光参数在视觉效果上保持一致性。

核心思路

WDR 模式的核心是通过长短曝光帧合成实现宽动态,映射的关键原则是:

  1. 长短曝光的总光通量要与 Normal 模式的单帧光通量等效(保证整体亮度一致);
  2. 长短曝光的比例要符合 WDR 的动态范围需求(通常短曝光为长曝光的 1/4~1/16,具体看 Sensor 支持);
  3. 所有曝光时间必须在 Sensor 的硬件限制范围内(最小 / 最大曝光时间、帧频约束)。

以下是可直接落地的映射算法和实现方案:


一、数学映射模型(核心公式)

假设:

  • Tnormal:小核 Normal 模式算出的目标曝光时间(单位:us,微秒);
  • Tlong:WDR 模式的长曝光时间;
  • Tshort:WDR 模式的短曝光时间;
  • k:长短曝光比例系数(k=Tshort/Tlong,通常取 1/8 或 1/16,需根据 Sensor 规格调整);
  • α:光通量等效系数(考虑 WDR 合成算法的增益,通常取 0.8 1.0,保证亮度匹配)。

基础映射公式

  1. 光通量等效约束:长短曝光的加权和等于 Normal 模式的光通量(忽略增益差异时):Tlong+Tshort=α×Tnormal
  2. 长短曝光比例约束:Tshort=k×Tlong

联立求解

将公式 2 代入公式 1,

可得:Tlong​=(α×Tnormal​​)/(1+k)

Tshort​=k×Tlong​=(α×k×Tnormal​​)/(1+k)

硬件限制修正

Sensor 的曝光时间有硬件边界,需对结果做钳位:

  • Tlong∈Tmin,Tmax(Sensor 支持的最小 / 最大长曝光时间);
  • Tshort≥Tmin(短曝光不能小于硬件最小值);
  • 需满足帧频约束:1/(Tlong+Tshort+行消隐时间)<=目标帧频(避免帧率不达标)。
  • 更一般的约束是(Tlong+Tshort+offset)<=VTS

二、完整代码实现(C 语言,可直接移植到 Linux 大核)

cpp 复制代码
#include <stdint.h>
#include <math.h>

// Sensor硬件参数配置(需根据实际Sensor规格修改)
#define SENSOR_EXP_MIN_US    100     // 最小曝光时间(us)
#define SENSOR_EXP_MAX_US    50000   // 最大长曝光时间(us)
#define WDR_K_RATIO         (1.0/8) // 短曝光/长曝光 = 1/8
#define ALPHA_COEFF         0.9     // 光通量等效系数(可微调)
#define TARGET_FPS          30      // 目标帧频(fps)
#define ROW_BLANKING_US     1000    // 行消隐时间(us,需查Sensor手册)

/**
 * @brief 将Normal模式曝光时间映射为WDR的长短曝光时间
 * @param t_normal: 小核传入的Normal模式曝光时间(us)
 * @param t_long: 输出WDR长曝光时间(us)
 * @param t_short: 输出WDR短曝光时间(us)
 * @return 0:成功, -1:参数无效
 */
int map_normal_to_wdr_exp(uint32_t t_normal, uint32_t *t_long, uint32_t *t_short) {
    // 入参校验
    if (t_normal == 0 || t_long == NULL || t_short == NULL) {
        return -1;
    }

    // 1. 基础公式计算
    double temp_long = (ALPHA_COEFF * t_normal) / (1 + WDR_K_RATIO);
    double temp_short = WDR_K_RATIO * temp_long;

    // 2. 硬件边界钳位(优先保证长曝光在合理范围)
    // 长曝光下限
    if (temp_long < SENSOR_EXP_MIN_US) {
        temp_long = SENSOR_EXP_MIN_US;
        temp_short = SENSOR_EXP_MIN_US; // 短曝光不小于最小值
    }
    // 长曝光上限
    if (temp_long > SENSOR_EXP_MAX_US) {
        temp_long = SENSOR_EXP_MAX_US;
        // 短曝光按比例同步调整,避免比例失衡
        temp_short = WDR_K_RATIO * temp_long;
    }
    // 短曝光下限兜底
    if (temp_short < SENSOR_EXP_MIN_US) {
        temp_short = SENSOR_EXP_MIN_US;
    }

    // 3. 帧频约束校验(总曝光时间+消隐时间 <= 1/FPS)
    uint32_t max_total_exp = 1000000 / TARGET_FPS - ROW_BLANKING_US; // 总曝光时间上限(us)
    if ((temp_long + temp_short) > max_total_exp) {
        // 按比例缩减排总曝光时间,满足帧频
        double scale = (double)max_total_exp / (temp_long + temp_short);
        temp_long *= scale;
        temp_short *= scale;
    }

    // 4. 转换为整数(Sensor曝光时间为整数)
    *t_long = round(temp_long);
    *t_short = round(temp_short);

    return 0;
}

// 测试示例
int main() {
    uint32_t t_normal = 20000; // 小核传入Normal模式曝光时间20ms
    uint32_t t_long, t_short;

    if (map_normal_to_wdr_exp(t_normal, &t_long, &t_short) == 0) {
        printf("Normal曝光时间: %d us\n", t_normal);
        printf("WDR长曝光时间: %d us\n", t_long);
        printf("WDR短曝光时间: %d us\n", t_short);
    }

    return 0;
}

代码关键说明

  1. 参数配置区 :所有大写宏定义都是 Sensor 相关的硬件参数,你需要根据实际 Sensor 的 datasheet 修改(比如SENSOR_EXP_MAX_USROW_BLANKING_US);
  2. 核心计算:先通过数学公式算出理论值,再依次做硬件边界和帧频约束的修正,避免参数超出 Sensor 能力;
  3. 帧频约束:WDR 模式需要连续采集长短两帧,总曝光时间 + 消隐时间不能超过帧频对应的单帧时长(比如 30fps 对应单帧最大时长≈33333us);
  4. 整数转换 :Sensor 的曝光时间只能是整数微秒,最后用round()取整保证精度。

三、调优建议

  1. α 系数微调 :如果 WDR 合成后画面偏亮 / 偏暗,可调整ALPHA_COEFF(0.8~1.2),偏亮则减小,偏暗则增大;
  2. k 比例调整:动态范围要求高(如逆光场景),可将 k 调小(如 1/16);普通场景可调大(如 1/4),减少运动拖影;
  3. 平滑滤波 :大核计算出的T_long/T_short不要突变,可加一阶低通滤波(如T_long = 0.8*T_long_prev + 0.2*T_long_curr),避免画面亮度抖动;
  4. 硬件校准:不同 Sensor 的光电转换效率不同,建议在实际场景中做灰度卡校准,修正 α 系数。

总结

  1. 核心映射逻辑:以 "光通量等效" 为原则,通过长短曝光比例系数 k,将 Normal 模式的单曝光时间拆分为 WDR 的长短曝光时间;
  2. 工程约束:必须校验 Sensor 硬件边界(最小 / 最大曝光)和帧频约束,避免参数无效;
  3. 多核通信:优先用共享内存传递 Normal 曝光参数,加锁 + 时间戳保证数据有效性,大核计算后建议做平滑滤波。
相关推荐
HLC++9 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室10 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy13 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕13 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫15 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生15 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1116 小时前
linux基础IO
linux·运维·服务器
BelongPanda18 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯18 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983419 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器