设计网络网站,网站优化具体怎么做,网址域名查询,做网站的分页查询DBFS是分贝全尺度#xff08;Decibels Full Scale#xff09;的缩写#xff0c;是一种用于衡量音频信号强度的单位。DBFS是相对于数字音频的最大可能幅度而言的#xff0c;它的取值范围通常是从0到-∞。在DBFS中#xff0c;0表示音频信号的最大幅度#xff0c;-∞表示完全… DBFS是分贝全尺度Decibels Full Scale的缩写是一种用于衡量音频信号强度的单位。DBFS是相对于数字音频的最大可能幅度而言的它的取值范围通常是从0到-∞。在DBFS中0表示音频信号的最大幅度-∞表示完全没有信号。 计算一个24bit、大端PCM样本的DBFS
#include stdio.h
#include stdlib.h
#include math.hint 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(byte3){for(i0;isampling_num;i){int bsize i * interval_bit;int value (*(databsize) 16) | (*(databsize1) 8) | *(databsize2);if (value 0x800000) { // 如果最高位是1即负数value | 0xff000000; // 则将32位整数的高8位都置为1表示负数}sample fabs(value);}}else if(byte2){for(i0;isampling_num;i){int bsize i * interval_bit;short int value (*(databsize) 8) | *(databsize1);sample fabs(value);}}}else{// 小端/* if(byte3){for(i0;isampling_num;i){int bsize i * interval_bit;int value (*(databsize2) 16) | (*(databsize1) 8) | *(databsize);if (value 0x800000) { // 如果最高位是1即负数value | 0xff000000; // 则将32位整数的高8位都置为1表示负数}sample fabs(value);}}else if(byte2){for(i0;isampling_num;i){int bsize i * interval_bit;short int value (*(databsize1) 8) | *(databsize);sample fabs(value);}} */}sample / sampling_num;double dbfs 20 * log10(sample / pref);return dbfs;
}