
目录
[二、5 种帧率 → 精简为 3 级](#二、5 种帧率 → 精简为 3 级)
[三、LV 阈值划分](#三、LV 阈值划分)
一、核心逻辑
亮度越暗 → LV 越小 → 帧率越低 亮度越亮 → LV 越大 → 帧率越高
三级降帧就是:
- 高亮度:高帧率(30fps)
- 中亮度:中帧率(20/25fps)
- 低亮度:低帧率(10/8fps)
二、5 种帧率 → 精简为 3 级
三级档位定义(最常用、最稳定)
- 等级 3:高亮 → 30fps
- 等级 2:中亮 → 20fps / 25fps
- 等级 1:低亮 → 10fps / 8fps
三、LV 阈值划分
你的 LV 范围:0 ~ 19(+6 偏置后)
- LV ≥ 12.0 → 等级 3 → 30fps
- 6.0 ≤ LV < 12.0 → 等级 2 → 20/25fps
- LV < 6.0 → 等级 1 → 10/8fps
阈值可自由微调,逻辑不变。
滞回完美防抖动
- 升高帧率:阈值 + 滞回
- 降低帧率:阈值 − 滞回不会在阈值附近反复跳变。
四、代码实现
cpp
#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;
}