基础知识
1秒(S)=1000毫秒(ms)=1000_000微妙(µs)=1000_000_000纳秒(ns)
1GHz=1000Mhz=1000_000KHz=1000_000_000Hz
1Hz=1/s
抗频闪原理
海思AE模块参数中有一个LinesPer500ms的参数,意思为500ms对应的曝光行数。此个参数和抗频闪有关。
我们知道:
50HZ交流电能量周期:T = 1/(50*2)s
sensor曝光一行 line_time = line_length/pclk=HTS*(1/pclk),
line_length = pclk * line_time;
fps=pclk/(VTS*HTS)
= pclk/(frame_length*line_length)
line_time = 1/(frame_length *fps ) = 1/(VTS *fps )
为了避免flicker,必须满足每一行获取的能量是交流电能量周期的整数倍,否则会应为获取的能量不一致,导致水波纹现象的产生。即:
line_time* Step = n * T
故:
Step= n*T/line_time=n*T/(1/(VTS *fps ))=n*T*VTS*FPS=n*VTS*FPS/100 (n取正整数)
Fps为一秒内的帧数,因此line_time应该以秒为单位。或者说是pclk 以MHZ为单位需要转换为Hz为单位,才与50Hz在同一个度量水平。而1Hz=1/s,所以line_time参数也是以s为单位。
linesPer500ms参数主要是进行以曝光行为单位的曝光时间和微妙为单位的曝光时间的转换。AE自动曝光算法内部还是以曝光行为单位进行AE的调整,而调试工具界面除了曝光时间上下限是以曝光行为单位,其他时间相关的都是以微妙为单位。
海思抗频闪方式描述如下:
Lines_per_500ms=pclk/(Picture_width+Width of the horizontal blanking region)/2=pclk/HTS/2
上述公式怎么得到的呢?
我们知道sensor一行的曝光时间为line_time=HTS/pclk,那么500ms需要对应曝光多少曝光行呢?
1/line_time=x/0.5 注意等式两边时间单位是以s为单位
x=0.5/line_time=pclk/HTS/2
即500ms对应的需要曝光pclk/HTS/2曝光行才行。
抗频闪参数(Lines_per_500ms)定义的问题
以50HZ抗频闪为例,50HZ抗频闪每行需要曝光10ms,也即是pclk/HTS/100,也即VTS*fps/100
那为什么不直接定义一个linesPer10ms(10ms对应的曝光行数)的参数去进行抗闪时间计算呢?如果定义linesPer500ms的参数,那还需要再此参数的基础上再除以50才能以转换为以每10ms为步进进行曝光。本质上linesPer10ms和linesPer500ms在此情景中是一样的作用。实际内部计算中用linesPer10ms去计算曝光时间根据方便些。
抗频闪参数(Lines_per_500ms)定义的问题
原因1
再继续思考定位。发现海思内部计算工频闪烁类型的时候有用到Lines_per_500ms参数。如下图描述:
大概意思是利用获取到的3帧图像数据根据LinePerSecond变量,计算出当前环境是有无工频闪。有工频闪时候,是50HZ还是60Hz工频闪,亦或是未知类型的工频闪。
计算工频闪烁的时候需要LinePerSecond,即1秒的最大总曝光行数。
我们知道1s=0.01*100s=0.5*2s。
假设当前帧率为8帧,VTS等于1124为偶数
我们以Lines_per_500ms=VTS*fps/2,Lines_per_10ms=VTS*fps/100分别计算得到:
Lines_per_500ms = 1124*8/2=4496
Lines_per_10ms = 1124*8/100=89
然后以Lines_per_500ms 、Lines_per_10ms分别计算LinePerSecond,
分别得到4496*2=8992,、89*100=8900。
以上以Lines_per_10ms计算得到的LinePerSecond存在误差,而以Lines_per_500ms计算得到的LinePerSecond无误差
假设当前帧率为8帧,VTS等于1125为奇数
我们以Lines_per_500ms=VTS*fps/2,Lines_per_10ms=VTS*fps/100分别计算得到:
Lines_per_500ms = 1125*8/2=4500
Lines_per_10ms = 1125*8/100=90
以上以Lines_per_10ms计算得到的LinePerSecond无误差,而以Lines_per_500ms计算得到的LinePerSecond无误差
即使是帧率为奇数帧,VTS为奇数,根据Lines_per_500ms 、Lines_per_10ms分别计算LinePerSecond时,以Lines_per_500ms计算得到的LinePerSecond也会比以Lines_per_10ms计算得到LinePerSecond误差要小些。
通过图像帧数据和LinePerSecond判断当前是否有误频闪的时候,LinePerSecond参数越精确越好。如果以Lines_per_10ms为抗闪参数,在计算LinePerSecond时会有些许误差。最后将导致判断频闪类型的时候可能会出现误判或者漏判的情况。所以海思的抗闪参数定义为Lines_per_500ms。
原因2:
基于同样精度的原因,在下述海思曝光行转换为微秒的关系式中,由于Lines_per_10ms计算的值相对比Lines_per_500ms 计算得到的值误差要大些,再按照下述关系转换为微秒的时候误差也较大;相反的,由微秒为单位的曝光时间转换为对应以曝光行为单位的曝光时间的时候,前者转换后的结果所带来的误差也比后者大。
在应用层面上,由于带来的误差可能将导致一些应用逻辑失效或者出错。
所以,以Lines_per_500ms 为抗频闪参数,为的是尽量减小精度保证相应逻辑正确的的前提下所设计的参数值。
其他原因:?? 欢迎讨论补充