如何利用Lv值实现三级降帧
目录一、核心逻辑二、5 种帧率 → 精简为 3 级三、LV 阈值划分四、代码实现一、核心逻辑亮度越暗 → LV 越小 → 帧率越低亮度越亮 → LV 越大 → 帧率越高三级降帧就是高亮度高帧率30fps中亮度中帧率20/25fps低亮度低帧率10/8fps二、5 种帧率 → 精简为 3 级三级档位定义最常用、最稳定等级 3高亮→ 30fps等级 2中亮→ 20fps / 25fps等级 1低亮→ 10fps / 8fps三、LV 阈值划分你的 LV 范围0 ~ 196 偏置后LV ≥ 12.0→ 等级 3 →30fps6.0 ≤ LV 12.0→ 等级 2 →20/25fpsLV 6.0→ 等级 1 →10/8fps阈值可自由微调逻辑不变。滞回完美防抖动升高帧率阈值 滞回降低帧率阈值 − 滞回不会在阈值附近反复跳变。四、代码实现#include stdint.h #include stdio.h // 核心配置 #define Q12_SCALE 4096 // Q12 定点格式 2^12 #define LV_OFFSET 6 // LV 偏置确保全正数 // 三级帧率定义 typedef enum { FPS_8FPS 0, // 低亮度 FPS_20FPS 1, // 中亮度 FPS_30FPS 2, // 高亮度 FPS_DEFAULT FPS_30FPS } FPS_LEVEL_e; // 【可调参数】LV 阈值浮点方便调试 // LV 范围0 ~ 19.0已 6 偏置 #define LEVEL_HIGH_TO_MID 12.0f // LV 12 → 30→20 #define LEVEL_MID_TO_LOW 6.0f // LV 6 → 20→8 #define HYSTERESIS_VAL 0.5f // 滞回宽度防抖 // 自动转 Q12 定点无需手动计算 #define TO_Q12(val) ((int32_t)((val) * Q12_SCALE)) static const int32_t THRESH_HIGH_MID TO_Q12(LEVEL_HIGH_TO_MID); static const int32_t THRESH_MID_LOW TO_Q12(LEVEL_MID_TO_LOW); static const int32_t HYST TO_Q12(HYSTERESIS_VAL); // 优化版三级降帧 滞回防抖 FPS_LEVEL_e auto_frame_control(int32_t lv_q12) { static FPS_LEVEL_e cur_level FPS_DEFAULT; // 静态保存当前状态 switch (cur_level) { // 当前30fps高亮 case FPS_30FPS: if (lv_q12 THRESH_HIGH_MID - HYST) cur_level FPS_20FPS; break; // 当前20fps中亮 case FPS_20FPS: if (lv_q12 THRESH_HIGH_MID HYST) cur_level FPS_30FPS; else if (lv_q12 THRESH_MID_LOW - HYST) cur_level FPS_8FPS; break; // 当前8fps低亮 case FPS_8FPS: if (lv_q12 THRESH_MID_LOW HYST) cur_level FPS_20FPS; break; default: cur_level FPS_DEFAULT; break; } return cur_level; } // 帧率输出 void set_target_fps(FPS_LEVEL_e level) { switch(level) { case FPS_30FPS: printf(FPS 30\n); break; case FPS_20FPS: printf(FPS 20\n); break; case FPS_8FPS: printf(FPS 8\n); break; default: printf(FPS 30\n); } } // 调用示例 int main(void) { // 传入 LUT 输出的 Q12 格式 LV全正数 int32_t current_lv_q12 TO_Q12(9.5f); // 自动判断等级 FPS_LEVEL_e level auto_frame_control(current_lv_q12); // 输出帧率 set_target_fps(level); return 0; }