音频基础学习四——声音的能量与分贝

news2024/9/21 8:02:00

文章目录

  • 前言
  • 一、能量与分贝
    • 1.音频能量
    • 2.分贝
    • 3.两者的区别
    • 4. 应用场景
  • 二、分贝的计算方式
    • 1.具体数学公式
    • 2.具体算法示例
    • 3.对于算法的释义
      • 大小端
      • 为什么通过计算得到的是负值
      • 范围
      • 实际结果
  • 总结


前言

很多博客中经常会把声音的能量和分贝说成是一个东西,这种说法是错误的。在实际生活中,想要形容声音大小按照之前博客中的介绍,其实就是音频模拟信号的振幅,而在实际的数字信号也就是PCM中,这种振幅被量化成了分贝。

本篇博客会介绍音频能量和分贝的关系,并且给出以16k 双通 short类型的数据进行计算分贝的算法。

|版本声明:山河君,未经博主允许,禁止转载

一、能量与分贝

音频能量和分贝 (dB) 都用于描述声音的强度,但它们的概念和计算方式有所不同。

1.音频能量

音频能量是声音信号中携带的实际物理能量,它通常与声音的振幅(Amplitude)相关。它代表声音的功率或强度,直接反映了声音信号在某个时刻或时间段内的物理表现。

  • 能量与振幅的关系:音频信号的能量与振幅的平方成正比。也就是说,如果音频信号的振幅增大,能量会以平方的速度增长。例如,振幅为2的音频信号,其能量是振幅为1信号的4倍。

数学上,音频信号的能量通常表示为信号样本的平方和,例如:
E = ∑ i = 0 n x i 2 E = \sum_{i = 0}^{n}x^{2}_{i} E=i=0nxi2
其中, x i 2 x^{2}_{i} xi2是每个音频样本的振幅,N 是样本数.

  • 能量的单位:音频能量的单位取决于它的具体表示方式。它可以用功率单位(如瓦特,W)来度量,或者仅作为信号强度的无量纲值表示。

2.分贝

分贝是一种对数单位,用于表示两种能量或强度之间的相对差异。分贝表示相对变化,而不是绝对的物理量,因此它是音频能量的对数缩放形式。分贝用于更方便地表示非常大或非常小的数字,并用于描述信号的强度变化。

  • 分贝与能量的关系:分贝是基于音频信号的能量或振幅的相对值,通过对数计算得出:
    d B = 10 × log ⁡ 10 ( E s i g n a l E r e f e r e n c e ) dB = 10 \times \log_{10}\Bigg( \frac{E_{signal}}{E_{reference}} \Bigg) dB=10×log10(EreferenceEsignal)

如果把能量换做为振幅:
d B = 20 × log ⁡ 10 ( A s i g n a l A r e f e r e n c e ) dB = 20 \times \log_{10}\Bigg( \frac{A_{signal}}{A_{reference}} \Bigg) dB=20×log10(AreferenceAsignal)
其中 E s i g n a l E_{signal} Esignal是信号能量, E r e f e r e n c e E_{reference} Ereference是参考能量, A s i g n a l A_{signal} Asignal是信号振幅, A r e f e r e n c e A_{reference} Areference是参考振幅。

3.两者的区别

  • 本质区别:音频能量是一个物理量,表示声音信号中实际携带的功率或强度;分贝则是一个相对量,用对数方式表示音频能量与某个参考值的比值。

  • 单位不同:音频能量可能有具体的物理单位(如瓦特、焦耳),而分贝没有单位,它是两种能量之间的对数比例。

  • 线性 vs 对数:音频能量是线性变化的(能量值可以直接累加),而分贝是对数变化的(增减6 dB表示能量变化一倍)。

4. 应用场景

音频能量:在实际计算音频信号的物理功率或存储、传输音频信号时,直接使用音频能量。它可以用于描述音频信号的功率输出、能量消耗等。

分贝:用于方便地表示音频信号的相对强度,特别是在处理范围非常广的信号时(如从微弱信号到非常强的信号)。分贝广泛应用于音频工程和声音的感知描述中,如声压级、信号增益等。

二、分贝的计算方式

1.具体数学公式

在实际数字信号中,计算声音的dB往往计算的不是某一个具体的时间点上样本的dB,而是一段时间上所有样本的均值。

而这个均值很多博主写的完全就是错误的,所以往往有很大误差:

  • 错误做法:把一段时间的采样点值相加取平均
  • 正确做法:通过计算信号各个样本平方的平均值,然后取平方根,得出信号的平均有效值

具体的数学公式为:
d B = 20 × l o g 10 ( R e f e r e n c e R M S R M S o f t h e s i g n a l ) dB=20×log_{10} \Bigg( \frac {Reference RMS} {RMS of the signal} \Bigg) dB=20×log10(RMSofthesignalReferenceRMS)

其中 R e f e r e n c e R M S R M S o f t h e s i g n a l 叫做 R M S ,信号强度的一个度量 \frac {Reference RMS} {RMS of the signal} 叫做 RMS,信号强度的一个度量 RMSofthesignalReferenceRMS叫做RMS,信号强度的一个度量计算方式为:
R M S = 1 N ∑ i = 1 N x i 2 RMS= \sqrt{ \frac{1}{N}\sum_{i=1}^{N}x_i^2} RMS=N1i=1Nxi2

2.具体算法示例

假设现在PCM为16k short 单通的:

#include <stdint.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

int pcm_db_count(const unsigned char* ptr, size_t size) {
    if (size == 0 || ptr == NULL) {
        return -96; // Handle empty or invalid input
    }

    int16_t value;
    double sum_squares = 0.0;

    for (size_t i = 0; i < size; i += 2) {
        // Read 16-bit PCM value from the byte array
        memcpy(&value, ptr + i, sizeof(value));
        // Handle endianess if needed
        // value = (int16_t)ntohs((uint16_t)value); // Convert from network to host byte order
        sum_squares += value * value;
    }

    // Calculate RMS
    size_t num_samples = size / 2;
    double rms = sqrt(sum_squares / num_samples);

    // Convert RMS to dB
    int ndb;
    if (rms > 0) {
        ndb = (int)(20.0 * log10(rms / 32768.0)); // 32768.0 for 16-bit PCM
    } else {
        ndb = -96; // Define a suitable low value for silence or very low levels
    }

    return ndb;
}

3.对于算法的释义

大小端

这里value = (int16_t)ntohs((uint16_t)value); 如果使用的是pcm是大端排列,需要进行大小端转换。

为什么通过计算得到的是负值

在分贝公式中,log10 函数会计算信号与参考值的比例。如果信号的幅度 小于参考值,结果就是负数。这是因为:

  • 当振幅较小时,信号强度 rms 远小于最大值 32768,例如信号振幅为 1000 时:

d B = 20 × log ⁡ 10 ( 1000 37268 ) ≈ 30 d B dB= 20 \times \log_{10} \big( \frac{1000}{37268} \big) \approx 30dB dB=20×log10(372681000)30dB

  • 当信号振幅很低时,例如靠近零(接近静音),dB 值会更小,甚至接近负无穷,所以我们用 − 96 d B -96dB 96dB来表示

范围

在实际医学中,分贝当然是越大才表示声音越大

  • 人正常说话的声音,一般是在40-60分贝。
  • 在低声细语地说话时,一般处于30分贝左右
  • 在大声说话或者吵架的时候,会高达60-70分贝
  • 若在过于嘈杂的环境中,可能会达到100分贝左右。

而在我们算法中

  • 人声的正常分贝范围:通常在 -30 dB 到 -10 dB 之间。
  • 正常对话:约 -25 dB 到 -15 dB。
  • 轻声或远距离人声:约 -35 dB 到 -20 dB。
  • 大声说话或近距离录音:约 -10 dB 到 -5 dB。

实际结果

下图是每10ms打印
在这里插入图片描述


总结

  • RMS 是计算信号强度的基础,表示信号的均方根值,是一种 绝对强度 的度量。
  • 信号振幅与参考振幅的比值 是用来计算分贝的,它衡量信号相对于参考值的强度,并通过对数缩放表示为分贝(dB)。
  • 音频能量:描述声音信号的实际强度,通常与振幅平方相关,表示声音信号中的物理功率。
  • 分贝:是一种对数单位,用于表示相对音频强度或能量,便于描述信号的增减和相对变化。

如果对您有帮助,请帮忙点个赞吧

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

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

相关文章

原型模式prototype

此篇为学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/prototype 能够复制已有对象&#xff0c; 而又无需使代码依赖它们所属的类 所有的原型类都必须有一个通用的接口&#xff0c; 使得即使在对象所属的具体类未知的情况下也能复制对象。 原型对…

云计算之云原生(上)

目录 一、消息队列RocketMQ 1.1 功能介绍 1.1.1 业务消息首选&#xff1a;消息队列 RocketMQ 1.1.2 【收发流量隔离约束】读写分离控制提高集群稳定性 1.1.3 【Dashboard 仪表盘】实时观测实例状态 1.1.4 【消息轨迹追踪】消息生命周期状态一目了然 1.1.5 【实时扩缩容】…

单点登录OAuth2.0

OAuth 2.0&#xff08;Open Authorization 2.0&#xff09;是OAuth协议的第二个版本&#xff0c;于2012年正式成为RFC 6749标准。在OAuth 2.0之前&#xff0c;OAuth 1.0版本已经为Web应用提供了一定程度的授权功能&#xff0c;但随着时间的推移&#xff0c;这些版本逐渐显露出一…

“Docker网络模式详解与应用“

目录 前言 Docker内置网络 bridge 基本概念 案例 工作原理 使用场景 host 基本概念 案例 工作原理 使用场景 none 基本概念 案例 &#xff01;&#xff01;&#xff01;大佬救命 container 基本概念 案例 自定义网络 自定义bridge 基本概念 案例 Docker…

界面控件KendoReact中文教程 - 如何创建动态进度条?

Kendo UI致力于新的开发&#xff0c;来满足不断变化的需求。现在我们非常自豪地宣布&#xff0c;通过React框架的Kendo UI JavaScript封装来支持React Javascript框架。Kendo UI for React能够为客户提供更好的用户体验&#xff0c;并且能够更快地构建更好的应用程序。 KendoR…

树莓派外设驱动WiringPi库

树莓派外设驱动WiringPi库 文章目录 树莓派外设驱动WiringPi库一、树莓派安装WiringPi库二、WiringPi库的使用方法 一、树莓派安装WiringPi库 wiringPi库其实已经很熟悉了&#xff0c;在香橙派中大量使用过&#xff0c;这个库中集成了很多使用的功能性函数&#xff0c;树莓派安…

设计模式-行为型模式-状态模式

1.状态模式的定义 允许一个对象在其内部状态改变时改变他的行为&#xff0c;用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题&#xff0c;状态模式将一个对象的状态从该对象中分离出来&#xff0c;封装到专门的状态类中&#xff0c;使得对象的状态可以灵活变化&…

【STM32】GPIO输入实现按键控制LED

1.stm32cubemx配置 和上篇博客配置一样 2.代码编写 实现一个按键按下LED1亮&#xff0c;另一个按下LED灭 KEY1实现LED1亮&#xff0c;KEY2实现LED2灭 1.配置GPIOA,GPIOB时钟使能 2.配置GPIOB模式初始化 3.配置GPIOA模式初始化 基本和2一样&#xff0c;不一样的是按键使用的…

(详)Vue3 + Typescript 项目配置 eslint + prettier + husky + lint-staged

目录 1&#xff0c;前言1.1&#xff0c;eslint 和 prettier 的关系1.2&#xff0c;Node.js 版本的问题 1&#xff0c;eslint1.1&#xff0c;安装1.2&#xff0c;配置文件1.3&#xff0c;集成对 vue 文件的配置1.4&#xff0c;在 package.json 中添加命令 2&#xff0c;prettier…

【代码随想录训练营第42期 Day52打卡 - 岛屿问题2

目录 一、做题心得 二、题目与题解 题目一&#xff1a;卡码网 101. 孤岛的总面积 题目链接 题解&#xff1a;DFS 题目二&#xff1a;卡码网 102. 沉没孤岛 题目链接 题解&#xff1a;DFS 三、小结 一、做题心得 今天做题时间比较晚了&#xff0c;只打卡完成了岛屿问题…

条件生成模型 (conditional generation)

我们之前讲的 GAN 中的生 成器&#xff0c;它没有输入任何的条件&#xff0c;它只是输入一个随机的分布&#xff0c;然后产生出来一张图片。我们现 在想要更进一步的是希望可以操控生成器的输出&#xff0c;我们给它一个条件x&#xff0c;让他根据条件x跟 输入z 来产生输出y。那…

硬件-经典开机电路

文章目录 一&#xff1a;网友公司祖传的开机电路二&#xff1a;电路符号名称三&#xff1a;电路原理分析道友&#xff1a;对于利益相关的人&#xff0c;要展示你的实力和智力。对于利益不相关的人&#xff0c;展示你的礼貌就好。 一&#xff1a;网友公司祖传的开机电路 业务逻辑…

【二】TDEngine快速入门

TDEngine快速入门 目录 TDEngine深入理解 概述 一、核心概念解析 二、基本操作 三、可视化管理工具 总结 概述 TDEngine创始人在官方出品的书籍中写到&#xff1a;我观察到&#xff0c;无论是出行行业还是更广义的运输行业&#xff0c;以及分布式能源系统&#xff0c;都将…

【网络安全 | 渗透工具】Cencys+Shodan使用教程

原创文章,不得转载。 文章目录 Cencys准备语法全文搜索字段和值搜索通配符搜索布尔逻辑搜索嵌套搜索时间相关搜索范围搜索双引号 (")转义序列和保留字符Censys 搜索语言中的主机查询查看主机搜索结果Censys 搜索语言中的证书查询查看证书搜索结果生成报告其余Shodan准备使…

解决MongoDB创建用户报错command createUser requires authentication

1、执行创建用户报错如下&#xff1a; 2、解决方法 2.1 关闭 MongoDB /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/mongod.conf --shutdown 2.2 修改配置文件 vim /usr/local/mongodb/mongod.conf 将security.authorization值从enabled改为disabled 2.3 启动MongoD…

HTML/CSS/JS学习笔记 Day2(HTML--标签 上)

跟着该视频学习&#xff0c;记录笔记&#xff1a;【黑马程序员pink老师前端入门教程&#xff0c;零基础必看的h5(html5)css3移动端前端视频教程】https://www.bilibili.com/video/BV14J4114768?p12&vd_source04ee94ad3f2168d7d5252c857a2bf358 Day2 内容梳理&#xff1a;…

redission中的锁分类

redis 分布式锁的核心命令 redis分布式锁的实现主要是依靠setnx和expire两个命令完成。 注意&#xff1a;由于setnx和expire是两个命令&#xff0c;会存在如果 setnx 是成功的&#xff0c;但是 expire 设置失败&#xff0c;一旦出现了释放锁失败&#xff0c;或 者没有手工释放…

用华为智驾,开启MPV的下半场

作者 |老缅 编辑 |德新 8月28日&#xff0c;岚图正式对外公布了全球首款搭载华为乾崑智驾和鸿蒙座舱的MPV——全新岚图梦想家。 新车定位「全景豪华科技旗舰MPV」&#xff0c;全系标配四驱&#xff0c;分为四驱鲲鹏版和四驱乾崑版。 其中岚图逍遥座舱和鲲鹏智驾构成的鲲鹏版…

yolov5 +gui界面+单目测距 实现对图片视频摄像头的测距

可实现对图片&#xff0c;视频&#xff0c;摄像头的检测 项目概述 本项目旨在实现一个集成了YOLOv5目标检测算法、图形用户界面&#xff08;GUI&#xff09;以及单目测距功能的系统。该系统能够对图片、视频或实时摄像头输入进行目标检测&#xff0c;并估算目标的距离。通过…

【Java】基于JWT+Token实现完整登入功能(实操)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 认识依赖4.2 使用JWT4.3 登入实现4.4 配置拦截器4.5 获取数据 五、总结&…