PDM系列文章之三:sigma-deleta思想应用实践之降帧率算法

原创 嵌入式Lee 2024-05-29 08:01

一. 前言

我们前面分享了两篇文章, 从头脑风暴,纯思想实验出发,引出了PDM以及sigma-deleta的原理。如果读者有心,仔细去回味,思考,可能会举一反三,发现实践中很多场景可以应用类似的思想,其实这是一类问题,一通则百通。

如果没有,那么看完本文, 希望能有。看完你可能会拍案而起,或者激动的拍大腿,这也是本人希望分享技术文章的初衷,希望能让读者读到欲罢不能甚至有激动兴奋的感觉。本文重点还是一如既往的希望授人以渔,而不是单纯的输出一个技术点。

https://mp.weixin.qq.com/s/9Vhe1rUCI8ZGBGGy3todcw PDM系列文章之二:一文搞懂PDM编码基本原理1bit sigma-deleta ADC,

https://mp.weixin.qq.com/s/uuKljd3zPjj-gkrjlvWEbg PDM系列文章之一- 前菜篇,假如来发明我们自己的PDM

二. 降帧问题

这个问题是一个读者私下问我的一个问题,即我们在音视频处理中生产者消费者可能速率不匹配,比如视频采集帧率很快,但是视频编解码可能达不到采集的帧率需要降帧率处理。对于降帧比是整数倍的很好解决,就是指定帧数处理一帧就行,比如输入10FPS需要降帧率到5FPS处理,那么就是每两帧丢掉一帧即可。那么如果不是整数倍数的降帧率呢,比如输出10FPS要按照3FPS处理,算法如何实现?

说实话我之前也没有写过该算法,但是看到这个问题,我一秒钟就想到了我们之前讨论过的PDM的原理。我们还是按照之前文章提出的思路,先抽象,再分析。这个问题题干很简单,简单描述就是对帧率为xFPS的输入,如何挑选丢弃一些帧得到更小的帧率yFPS,当然要保证均匀性。我们进一步抽象,按照之前设计自己的PDM的思路进行,先对输入对象抽象,输入对象就是帧流,我们可以每一帧用1表示,那么输入就是11111的流,而输出是对11111流的挑选是否需要进行处理,如果需要对输入进行处理就输出1,不需要处理就输出0。那么结果就是10的序列编码输出。那么问题就抽象为了如何对输入流11xxxx,通过挑选使得其输出流10xxxxx,满足1均匀分布,且1的比例(密度)正好是指定的倍数。原来1的密度认为是100%,那么降低帧率倍数为x,那么输出的1的密度就是原来的1/x.

我们再来看抽象后的模型不就是我们的PDM编码吗? 1的密度代表帧率,之前引出PDM时是用1的密度代表电压,所以不管是代表电压还是代表帧率还是代表什么妖魔鬼怪,都是一样的问题,对于抽象或者数学上来说就是一个数字。所以再次说明我们之前提出的,解决问题的第一步是抽象这一重要观点。

如果读者看过之前两篇文章,且确实是用心去思考理解过的话,到此为此,应该就要拍大腿,激动的说哦原来如此了,所以实际本文至此就可以结束了。但是我们还是善始善终,还是把整个实现过程分享一下。

三. 算法实现

为了方便编码,我们还是回忆下sigma-deleta的系统框图, 把我们的问题抽象后,映射到模型上,图像化,才能方便实现。

典型的1bit sigam-delta系统框图如下,由一个差分模块(计算本次偏差),积分模块(计算累计误差),和一个比较模块-DAC输出模块(负反馈)组成。如下所示,DAC输出实际是一个开关控制输出,要么输出VREF参考电压,要么输出0,参考电压VREF大于Xi输入电压,开关的控制由比较器决定,比较器的输出由误差的累计决定,也就是说有正向误差则控制DAC输出VREF,此时Xi差分模块的输出就是负数,这样积分器的输出就减小,形成负反馈,也就是控制DAC输出不断开关-开关,使得其PWM输出结果平均值等效于Xi(因为只要有误差就会反向调整),最终收敛或者震荡(平均值收敛)

不说什么高深的概念,四个字就可以说明其核心思想,多退少补! 多了往少的方向调整,少了往多的方向调整。

移植到我们降低帧率的问题来看,DAC的输出即参考电压VREF对应的是输入帧率,需要对其进行不断的开关开关(10xxx序列),最终使得其等效为输出帧率Xi(即待采样电压)

积分器的输出就是实时的误差,DAC的开关序列即帧的挑选序列。

好了有了以上的模型说明,编码其实很简单了

几行就搞定,只需要简单的加减法即可,非常高效

/** * \struct sigma_delta_st * sigma_delta结构体*/typedef struct{    int input;      /**< 输入值(参考值)    */    int output;     /**< 目标值           */    int integrator; /**< 积分器输出        */    int dac;        /**< 比较器输出, 0表示DAC无需输出参考值,1表示DAC需要输出参考值 */} sigma_delta_st;
/** * \fn sigma_delta_init  * 初始化 * \param dev 用户提供的实例, \ref sigma_delta_st * \param input 输入值(参考值) * \param output 目标值*/static void sigma_delta_init(sigma_delta_st* dev, int input, int output){    if(dev == (sigma_delta_st*)0)    {        return;    }    dev->dac = 0;     /**< 初始时DAC无输出,初始积分器偏差为0-output */    dev->integrator = 0-output;    dev->input = input;    dev->output = output; }
/** * \fn sigma_delta_update  * 计算下一步1bit DAC是否输出, 1输出, 0不输出 * 反复调用本函数反复输出10序列,10序列即input的开关序列,其平均效果等效于目标output的值. * \param dev 用户提供的实例, \ref sigma_delta_st * \return 返回1或者0,即DAC的输出开关,1表示输出,0表示不输出*/static int sigma_delta_update(sigma_delta_st* dev){    if(dev == (sigma_delta_st*)0)    {        return 0;    }    /* (偏差)积分值,经过比较器(和0比较),确认偏差的正负方向,然后控制DAC输出反向调整积分值,形成负反馈      * 目标是让积分器的输出趋于0,即偏差趋于0,即差分输入正负输出等效,即output和input的开关序列等效     */    if(dev->integrator > 0)    {        /* 如果积分值大于0, 则DAC使能输出,即输出input           差分输入dev->output-dev->input小于0,使得积分值减小,反向调整积分值         */        dev->dac = 1;        dev->integrator += dev->output-dev->input;      }    else    {        /* 如果积分值小于等于0, 则DAC停止输出,即输出0            差分输入dev->output-0大于0,使得积分值增大,反向调整积分值         */        dev->dac = 0;        dev->integrator += (dev->output-0);    }    return dev->dac;}

.测试

测试代码如下

/** * \fn sigma_delta_test  * 测试函数 * \param[in] input 输入值 * \param[in] input 输出值 * \param[in] pnum  更新次数*/static void sigma_delta_test(int input, int output, int pnum){    sigma_delta_st dev;    sigma_delta_init(&dev, input, output);    printf("\r\n");    while(pnum--)    {        int res = sigma_delta_update(&dev);         printf("%d %d %d\r\n",res,dev.input,dev.integrator);        os_delay(10);    }}

我们实现命令行方便测试

void sdtestfunc(uint8_t* param){  int input;  int output;  int pnum;  if(3 == sscanf((const char*)param, "%*s %d %d %d", &input, &output, &pnum))  {    sigma_delta_test(input,output,pnum);  }}

测试不同的降采样率比例,打印挑选序列

10:8降采样率,第一列为抽取序列1表示输出0表示丢弃,第三列表示当前偏差,可以看到任意5个中有41,正好是10:8

sh>

sdtest 10 8 20

0 10 0

0 10 8

1 10 6

1 10 4

1 10 2

1 10 0

0 10 8

1 10 6

1 10 4

1 10 2

1 10 0

0 10 8

1 10 6

1 10 4

1 10 2

1 10 0

10:3降采样率,第一列为抽取序列1表示输出0表示丢弃,第三列表示当前偏差,可以看到任意10个中有31,正好是10:3

sh>

sdtest 10 3 20

0 10 0

0 10 3

1 10 -4

0 10 -1

0 10 2

1 10 -5

0 10 -2

0 10 1

1 10 -6

0 10 -3

0 10 0

0 10 3

1 10 -4

0 10 -1

0 10 2

1 10 -5

0 10 -2

0 10 1

1 10 -6

0 10 -3

可以看到满足均匀输出,且抽取比例符合需求,当然可能存在偶尔一个窗口内有偏差的情况,因为输出只能是要么输出input要么输出0,颗粒度不是无限小,所以从长期时间平均才能更高精度等效,时间越长精度越高,这也是sigma-deleta ADC精度高但是需要采样时间长的原因,即时间换精度。

我们还是保持刨根问题和发散思维的精神,上述说的是降采样率,那么问题来了,如何升采样率呢,即对低采样率进行插值得到高采样率呢。我们要有逆向思考的思维,升采样率还是一回事,我们就假设知道升采样率后的帧率,然后对其降采样率,那么输出1则表示是使用输入帧,输出0则表示该帧需要插值。

..总结

好的,看到上面是不是还意犹未尽,我们继续思考是不是还可以想到类似的系统?

理想运放?

负反馈系统?

DC-DC?

PID?

等等是不是都是类似的,实际上你在实践中会发现更多类似的系统。

其实我们从哲学的角度来考虑这个问题会更有深刻的认知,中国传统文化其实是提倡中庸之道的,你会发现古人的智慧,其实负反馈就是中庸之道,负反馈系统是真实世界最最常见的系统,为什么呢,因为其中庸之道,多了少点,少了多点,趋于中庸稳定。而正反馈系统,则会一直朝一个方向发散最后失控,就好比宇宙来源于大爆炸,最终肯定还是会坍缩,重复下一次大爆炸, 反复不息....,做人,工作,生活又何尝不是如此呢。

所以以上全文技术点用一句三岁小孩都懂的话来总结,就是多了就少点,少了就多点,所以技术没有什么高深的,原理都很简单,而用一句话让不懂技术的人搞懂,也是评估你是不是真的懂的最好的标准,如果你需要用一大堆高深的术语公式去说明一个技术问题,那么说明你肯定没有真的搞懂。而我们学习一个技术也要思考其背后的思想,甚至从哲学层面去思考,而不是仅仅停留在技术表面。


评论
  • 作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!没错,USB资源就是你打开新世界得钥匙,它能做哪些扩展呢?1.1  USB扩网口通用ARM处理器大多带两路网口,如果项目中有多路网路接口的需求,一般会选择在主板外部加交换机/路由器。当然,出于成本考虑,也可以将Switch芯片集成到ARM核心板或底板上,如KSZ9897、
    万象奥科 2024-12-03 10:24 75浏览
  • 概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解决的问题。本文在说明(三)的基础上,继续探讨为SiPM读出测试系统寻求合适的模拟脉冲检出方案。前四代SiPM使用的高速比较器指标缺陷 由于前端模拟信号属于典型的指数脉冲,所以下降沿转换速率(Slew Rate)过慢,导致比较器检出出现不必要的问题。尽管比较器可以使能滞回(Hysteresis)模块功
    coyoo 2024-12-03 12:20 131浏览
  • 当前,智能汽车产业迎来重大变局,随着人工智能、5G、大数据等新一代信息技术的迅猛发展,智能网联汽车正呈现强劲发展势头。11月26日,在2024紫光展锐全球合作伙伴大会汽车电子生态论坛上,紫光展锐与上汽海外出行联合发布搭载紫光展锐A7870的上汽海外MG量产车型,并发布A7710系列UWB数字钥匙解决方案平台,可应用于数字钥匙、活体检测、脚踢雷达、自动泊车等多种智能汽车场景。 联合发布量产车型,推动汽车智能化出海紫光展锐与上汽海外出行达成战略合作,联合发布搭载紫光展锐A7870的量产车型
    紫光展锐 2024-12-03 11:38 112浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 123浏览
  • 戴上XR眼镜去“追龙”是种什么体验?2024年11月30日,由上海自然博物馆(上海科技馆分馆)与三湘印象联合出品、三湘印象旗下观印象艺术发展有限公司(下简称“观印象”)承制的《又见恐龙》XR嘉年华在上海自然博物馆重磅开幕。该体验项目将于12月1日正式对公众开放,持续至2025年3月30日。双向奔赴,恐龙IP撞上元宇宙不久前,上海市经济和信息化委员会等部门联合印发了《上海市超高清视听产业发展行动方案》,特别提到“支持博物馆、主题乐园等场所推动超高清视听技术应用,丰富线下文旅消费体验”。作为上海自然
    电子与消费 2024-11-30 22:03 98浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 102浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 130浏览
  • 11-29学习笔记11-29学习笔记习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-02 23:58 81浏览
  • TOF多区传感器: ND06   ND06是一款微型多区高集成度ToF测距传感器,其支持24个区域(6 x 4)同步测距,测距范围远达5m,具有测距范围广、精度高、测距稳定等特点。适用于投影仪的无感自动对焦和梯形校正、AIoT、手势识别、智能面板和智能灯具等多种场景。                 如果用ND06进行手势识别,只需要经过三个步骤: 第一步&
    esad0 2024-12-04 11:20 65浏览
  •         温度传感器的精度受哪些因素影响,要先看所用的温度传感器输出哪种信号,不同信号输出的温度传感器影响精度的因素也不同。        现在常用的温度传感器输出信号有以下几种:电阻信号、电流信号、电压信号、数字信号等。以输出电阻信号的温度传感器为例,还细分为正温度系数温度传感器和负温度系数温度传感器,常用的铂电阻PT100/1000温度传感器就是正温度系数,就是说随着温度的升高,输出的电阻值会增大。对于输出
    锦正茂科技 2024-12-03 11:50 121浏览
  • 遇到部分串口工具不支持1500000波特率,这时候就需要进行修改,本文以触觉智能RK3562开发板修改系统波特率为115200为例,介绍瑞芯微方案主板Linux修改系统串口波特率教程。温馨提示:瑞芯微方案主板/开发板串口波特率只支持115200或1500000。修改Loader打印波特率查看对应芯片的MINIALL.ini确定要修改的bin文件#查看对应芯片的MINIALL.ini cat rkbin/RKBOOT/RK3562MINIALL.ini修改uart baudrate参数修改以下目
    Industio_触觉智能 2024-12-03 11:28 92浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦