Provider(6) - Reformat和ClampBufferProvider

ReformatBufferProvider和ClampFloatBufferProvider

简介

ReformatBufferProvider就是用于转换输入和输出的数据format不一致,比如输入是float、输出是int32_t;

ClampFloatBufferProvider则是将float类型的音频数据其能量限制在[-3dB,3dB]中

ReformatBufferProvider转换规则

转换规则大致如下:

void ReformatBufferProvider::copyFrames(void *dst, const void *src, size_t frames)
{memcpy_by_audio_format(dst, mOutputFormat, src, mInputFormat, frames * mChannelCount);//float >> int16: float * (1 << 15) 等比例缩放,并在限制在-32768,32767范围//int16_t >> float: int16_t * (1/(1<<15)),也就是int16_t/16bit的max值//uint8_t >> int16_t: (uint8_t-0x80) << 8;1. -0x80将0~256转换到-128~127,左移8缩放//int16_t >> uint8_t: (int16_t >> 8)+0x80//int16_t >> int32_t: int16_t << 16,这个移位操作实质也是等比例放大,//16_max=2^15 32_max=2^31,设16bit内的值为32000,通过等比例换算//16_max/32_max=32000/x,计算x=2097152000=32000<<16//int32_t >> int16_t: int32_t >> 16
}

精华在注释当中,其具体实现在./system/media/audio_utils/format.c,有兴趣的可自行去查阅,本篇文章不在具体介绍

ClampFloatBufferProvider限制规则

void ClampFloatBufferProvider::copyFrames(void *dst, const void *src, size_t frames)
{//src没有作任何操作,只是将src限制在[-x, x]之间memcpy_to_float_from_float_with_clamping((float*)dst, (const float*)src,frames * mChannelCount,FLOAT_NOMINAL_RANGE_HEADROOM);//3dB的衰减因子,3=20lgx,x=1.412538
}

FLOAT_NOMINAL_RANGE_HEADROOM就是3dB的衰减因子, 3 d B = 20 l g x 3dB=20lg x 3dB=20lgx计算 x = 1.412538 x=1.412538 x=1.412538

进入memcpy_to_float_from_float_with_clamping看看:

/**
* 将dst限制在[-absMx, absMax]
**/
void memcpy_to_float_from_float_with_clamping(float *dst, const float *src, size_t count,float absMax) {// Note: using NEON intrinsics (vminq_f32, vld1q_f32...) did NOT accelerate// the function when benchmarked. The compiler already vectorize using FMINNM f32x4 & similar.// Note: clamping induce a ~20% overhead compared to memcpy for count in [64, 512]//       See primitives_benchmarkfor (; count > 0; --count) {const float sample = *src++;*dst++ = fmax(-absMax, fmin(absMax, sample));}   
}

将dst限制在[-absMx, absMax],可以把音频数据当作是一个能量值;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/48226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大数据】JSON文件解析,对其文本聚类/情感分析

目录 引言 JSON&#xff08;JavaScript Object Notation&#xff09; 文本聚类K-means 基本步骤 优点 缺点 实际应用 情感分析 核心任务与应用场景 算法原理与技术 json数据集 情感分析实现 文本聚类实现 引言 JSON&#xff08;JavaScript Object Notation&#…

从系统层面认识Linux及mysql中的多表查询

为什么计算机起始时间是1970年1月1日 为什么计算机起始时间是1970年1月1日-CSDN博客https://blog.csdn.net/csdn_kou/article/details/81535452 date "%Y-%m-%d %H:%M:%S" 查看日期 sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 在数据层面 CPU不…

Nacos Derby 远程命令执行漏洞(QVD-2024-26473)

0x01 产品简介 Nacos 是一个功能强大的服务注册与发现、配置管理平台,为微服务架构和云原生应用提供了重要的基础设施支持。 0x02 漏洞概述 由于Alibaba Nacos部分版本中derby数据库默认可以未授权访问,恶意攻击者利用此漏洞可以未授权执行SQL语句,最终导致任意代码执行。…

GESP CCF C++ 八级认证真题 2024年6月

第 1 题 GESP活动期间&#xff0c;举办方从获胜者ABCDE五个人中选出三个人排成一队升国旗&#xff0c;其中A不能排在队首&#xff0c;请问 有多少种排法&#xff1f; A.24 B.48 C.32 D.12 第 2 题 7进制数235转换成3进制数是&#xff08; &#xff09;。 A. 11121 B. 11…

Ruby 循环

Ruby 循环 在编程中&#xff0c;循环是一种常用的控制结构&#xff0c;它允许我们重复执行一段代码多次。Ruby 作为一种灵活的编程语言&#xff0c;提供了多种循环方法&#xff0c;包括 while、until、for、each 和 loop 等。本文将详细介绍 Ruby 中的循环机制&#xff0c;并通…

OpenWrt安装快速入门指南

在刷新 OpenWrt 固件之前&#xff0c;建议进行以下准备&#xff1a; 1、不要急于安装&#xff0c;慢慢来。如果在安装过程中出现奇怪之处&#xff0c;请先找到答案&#xff0c;然后再继续。 2、准备好设备的精确型号&#xff0c;以便能够选择正确的OpenWrt固件。 3、手上有关…

密码学原理精解【9】

这里写目录标题 迭代密码概述SPN具体算法过程SPN算法基本步骤举例说明注意 轮换-置换网络一、定义与概述二、核心组件三、加密过程四、应用实例五、总结 轮函数理论定义与作用特点与性质应用实例总结 迭代密码理论定义与原理特点与优势应用场景示例发展趋势 AES特点概述一、算法…

第三届智能机械与人机交互技术学术会议(IHCIT 2024)

【北航主办丨本届SPIE独立出版丨已确认ISSN号】 第三届智能机械与人机交互技术学术会议&#xff08;IHCIT 2024&#xff09; 2024 3rd International Conference on Intelligent Mechanical and Human-Computer Interaction Technology 2024年7月27日----中国杭州&#xff0…

083、Python 读二进制文件

在Python中&#xff0c;读取二进制文件使用open()函数&#xff0c;并将模式&#xff08;mode&#xff09;设置为rb&#xff08;r’表示读取&#xff0c;b’表示二进制&#xff09;。这样&#xff0c;可以读取文件内容作为字节&#xff08;bytes&#xff09;对象&#xff0c;而不…

构建之源:深入解析Gradle的settings.gradle文件

标题&#xff1a;构建之源&#xff1a;深入解析Gradle的settings.gradle文件 在Gradle的世界中&#xff0c;settings.gradle文件扮演着至关重要的角色。它是Gradle多项目构建的心脏&#xff0c;负责定义和管理项目结构&#xff0c;包括项目的组织、子模块的包含和项目之间的关…

敲详细的springframework-amqp-rabbit源码解析

看源码时将RabbitMQ的springframework-amqp-rabbit和spring-rabbit的一套区分开&#xff0c;springboot是基于RabbitMQ的Java客户端建立了简便易用的框架。 springboot的框架下相对更多地使用消费者Consumer和监听器Listener的概念&#xff0c;这两个概念不注意区分容易混淆。…

Vatee万腾平台:智慧金融的创新引擎,驱动金融服务升级

在数字化浪潮席卷全球的今天&#xff0c;金融行业正经历着前所未有的变革与升级。Vatee万腾平台&#xff0c;作为智慧金融领域的创新先锋&#xff0c;正以其独特的技术优势、前瞻的战略布局和卓越的服务能力&#xff0c;成为推动金融服务升级的重要引擎。 智慧金融&#xff1a;…

一个关于STM32的DAC输出的遗忘点

众所周知熟练使用HAL库可以帮你解决不少stm32的开发难题&#xff0c;但是是谁让你陷入了这些难题&#xff0c;别问。 如上图所示&#xff0c;正常初始化这个模块后生成代码如下图所示&#xff1b; * DAC init function */ void MX_DAC_Init(void) {/* USER CODE BEGIN DAC_Ini…

Build Your Own X: 通过实践深入理解技术的开源项目

在当今快速发展的技术世界中,深入理解各种技术的工作原理变得越来越重要。而 Build Your Own X 项目正是为此而生,它旨在帮助开发者通过从头构建各种技术来真正掌握编程精髓。今天,让我们一起来了解这个令人兴奋的开源项目。 Build Your Own X 简介 Build Your Own X 是一个开…

2024年计算机软考中级【硬件工程师】面试题目汇总(附答案)

硬件工程师面试题汇总分析 1、解释一下同步电路和异步电路 解题思路 同步电路和异步电路是指同步时序电路和异步时序电路。由于存储电路中触发器的动作特点不同&#xff0c;因此可以把时序电路分为同步时序电路和异步时序电路两种。同步时序电路所有的触发器状态的变化都是在同…

技术设计文档:订单管理系统

1. 概述 1.1 目的 本文档旨在描述订单管理系统的技术实现方案&#xff0c;包括架构设计、数据模型、技术选型、接口设计、安全性和性能要求。 1.2 范围 本设计文档涵盖系统架构、模块划分、数据库设计、前后端技术栈以及系统集成点。 2. 架构设计 2.1 系统架构 微服务架…

【AI工具基础】—B树(B-tree)

B树&#xff08;B-tree&#xff09;是一种自平衡的树状数据结构&#xff0c;它能够在保持数据有序的同时&#xff0c;优化大块数据的读写操作&#xff0c;使得查找、顺序访问、插入和删除等操作都能在对数时间内完成。以下是对B树原理的详细描述&#xff1a; 一、定义与特性 …

【单目3D检测】smoke(1):模型方案详解

纵目发表的这篇单目3D目标检测论文不同于以往用2D预选框建立3D信息&#xff0c;而是采取直接回归3D信息&#xff0c;这种思路简单又高效&#xff0c;并不需要复杂的前后处理&#xff0c;而且是一种one stage方法&#xff0c;对于实际业务部署也很友好。 题目&#xff1a;SMOKE&…

Java 中的异常

异常&#xff1a;就是出现的问题。 在Java中异常被当成对象进行处理&#xff0c;所有的异常类都继承于Throwable类&#xff0c;如果Java提供的异常类并不能满足需求&#xff0c;用户还可以自己定义一个异常类。 下面是异常体系结构&#xff1a; Throwable又分成了Error和Exce…

【Linux网络】epoll实现的echo服务器{nocopy类/智能指针/echo服务器}

文章目录 1.代码基础1.1某类唯一存在1.2C智能指针 2.epoll实现的echo服务器日志套接字CMakeepoll封装主函数服务器 1.代码基础 1.1某类唯一存在 这段代码定义了一个名为 nocopy 的类&#xff0c;它旨在防止该类的实例被复制或赋值。这是通过在类中显式删除拷贝构造函数&#…