【C脚本】计算PCM的DBFS(分贝全尺度)

2024-04-01 23:12

本文主要是介绍【C脚本】计算PCM的DBFS(分贝全尺度),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DBFS是分贝全尺度(Decibels Full Scale)的缩写,是一种用于衡量音频信号强度的单位。DBFS是相对于数字音频的最大可能幅度而言的,它的取值范围通常是从0到-∞。在DBFS中,0表示音频信号的最大幅度,-∞表示完全没有信号。

计算一个24bit、大端PCM样本的DBFS

#include <stdio.h>
#include <stdlib.h>
#include <math.h>int main() {unsigned char buf[3];  // 存储大端24bit PCM样本的缓冲区float sample;          // 存储转换后的浮点数样本值float max_sample = pow(2, 23) - 1;  // 最大电平值,即所有位都为1时的值// 假设buf中存储的是大端24bit PCM样本的值buf[0] = 0x12;buf[1] = 0x34;buf[2] = 0x56;// 将24bit PCM样本转换为浮点数int sample_int = (buf[0] << 16) | (buf[1] << 8) | buf[2];  // 先将3个字节拼成一个整数if (sample_int & 0x800000) {  // 如果最高位是1,即负数sample_int |= 0xff000000;  // 则将32位整数的高8位都置为1,表示负数}sample = (float)sample_int / max_sample;  // 转换为浮点数,再除以最大电平值// 计算DBFS值float dbfs = 20 * log10(fabs(sample));  // 用对数函数计算分贝数值printf("DBFS: %.2f\n", dbfs);return 0;
}

之所以用上述方法转负数的原因参见:C语言中负数的存储

求一段PCM的平均DBFS的方法

下面的函数只统计第一个声道的DBFS,且小端数据的计算一直有问题,结果不一定是负数,不清楚是数据有问题还是方法用错了,希望大神指教,感谢。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>/* 
@param char *data PCM数据
@param int Endianness 大小端标识,大端为真、小端为假
@param int byte 字节大小,可选:2字节(16bit)、3字节(24bit)
@param int sampling_num 统计的次数
@param int channel 声道数,几声道就写几,如双声道就写2*/
double averageDBFS(char *data, int Endianness, int byte, int sampling_num, int channel) {int i;double sample = 0;double pref = pow(2, byte*8-1);int interval_bit = channel * byte;if(Endianness){// 大端if(byte==3){for(i=0;i<sampling_num;i++){int bsize = i * interval_bit;int value = (*(data+bsize) << 16) | (*(data+bsize+1) << 8) | *(data+bsize+2);if (value & 0x800000) {  // 如果最高位是1,即负数value |= 0xff000000;  // 则将32位整数的高8位都置为1,表示负数}sample += fabs(value);}}else if(byte==2){for(i=0;i<sampling_num;i++){int bsize = i * interval_bit;short int value = (*(data+bsize) << 8) | *(data+bsize+1);sample += fabs(value);}}}else{// 小端/* if(byte==3){for(i=0;i<sampling_num;i++){int bsize = i * interval_bit;int value = (*(data+bsize+2) << 16) | (*(data+bsize+1) << 8) | *(data+bsize);if (value & 0x800000) {  // 如果最高位是1,即负数value |= 0xff000000;  // 则将32位整数的高8位都置为1,表示负数}sample += fabs(value);}}else if(byte==2){for(i=0;i<sampling_num;i++){int bsize = i * interval_bit;short int value = (*(data+bsize+1) << 8) | *(data+bsize);sample += fabs(value);}} */}sample /= sampling_num;double dbfs = 20 * log10(sample / pref);return dbfs;
}

这篇关于【C脚本】计算PCM的DBFS(分贝全尺度)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868379

相关文章

计算绕原点旋转某角度后的点的坐标

问题: A点(x, y)按顺时针旋转 theta 角度后点的坐标为A1点(x1,y1)  ,求x1 y1坐标用(x,y)和 theta 来表示 方法一: 设 OA 向量和x轴的角度为 alpha , 那么顺时针转过 theta后 ,OA1 向量和x轴的角度为 (alpha - theta) 。 使用圆的参数方程来表示点坐标。A的坐标可以表示为: \[\left\{ {\begin{ar

UE3脚本UnrealScript UC语法点滴

持续更新 目录 类定义修饰符  1.dependson(CLASSNAME) 2.config(ININAME) 3.native 4.notplaceable 5.inherits(CLASSNAME1[,CLASSNAME2,...]) 类对象实例创建 类默认属性设置 变量 1.声明 var local 2.修饰符 config  3.array 类型变量 以及

YOLOv8改进 | SPPF | 具有多尺度带孔卷积层的ASPP【CVPR2018】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进——点击即可跳转 Atrous Spatial Pyramid Pooling (ASPP) 是一种在深度学习框架中用于语义分割的网络结构,它旨

【云计算 复习】第1节 云计算概述和 GFS + chunk

一、云计算概述 1.云计算的商业模式 (1)软件即服务(SaaS) 有些景区给游客提供烧烤场地,游客需要自己挖坑或者砌烧烤台,然后买肉、串串、烧烤。 (2)平台即服务(PaaS) 有些景区给游客提供烧烤场地,同时搭建好烧烤台,游客只需要自己带食材和调料、串串、烧烤。 (3)基础设施即服务(IaaS) 有些景区给游客提供烧烤场地,同时搭建好烧烤台,还有专门的厨师来烧烤,用户不需要关心前面的所有

【青龙面板辅助】JD商品自动给好评获取京豆脚本

1.打开链接 开下面的链接进入待评价商品页面 https://club.jd.com/myJdcomments/myJdcomments.action?sort=0 2.登陆后执行脚本 登陆后,按F12键,选择console,复制粘贴以下代码,先运行脚本1,再运行脚本2 脚本1代码 可以自行修改评价内容。 var content = '材质很好,质量也不错,到货也很快物流满分,包装快递满

Redis-在springboot环境下执行lua脚本

文章目录 1、什么lua2、创建SpringBoot工程3、引入相关依赖4、创建LUA脚本5、创建配置类6、创建启动类7、创建测试类 1、什么lua “Lua”的英文全称是“Lightweight Userdata Abstraction Layer”,意思是“轻量级用户数据抽象层”。 2、创建SpringBoot工程 3、引入相关依赖 <?xml version

vscode python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

在vscode中控制台运行python文件出现:无法将"pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 使用vscode开发python,需要安装python开发扩展: 本文已经安装,我们需要找的是python安装所在目录,本文实际路径如下: 如果在本文路径中没有此目录,请尝试在C盘中搜索 python,搜索到相关python目录后,点击Python 3.9进入目录,

android的strings整理脚本

统一对String整理的工具,结构如下 代码 package com.owant.toollib;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.util.ArrayList;import java.util.List;import java.util

网页脚本输入这么简单

如何在网页中进行脚本操作呢? 研究了一下,很简单,用google浏览器的Console直接操作javaScript。思路: Created with Raphaël 2.1.0 开始 输入(如何输入) 点击(如何点击) 结束 下面是,通过脚本刷直播屏的实现,直接在Console输入即可 var words=new Arra

什么是dB?dBm、dBc、dBi、dBd怎么计算,有什么区别?

什么是dB?dBm、dBc、dBi、dBd怎么计算,有什么区别? 引言 在电子工程、通信和音频领域,dB(分贝)是一个常见的术语。许多人刚接触时可能会感到困惑,因为它不仅仅是一个简单的单位,还有多种不同的形式,如dBm、dBc、dBi和dBd。这篇文章将详细解释这些概念,并介绍如何计算它们,帮助初学者更好地理解和应用。 什么是dB? dB,即分贝,是一种表示两个数值比值的对数单位。分贝的基