【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

相关文章

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n