计算人声录音后电平的大小(dB SPL->dBFS)

计算人声录音后电平的大小

这里笔记记录一下,怎么计算已知大小的声音,经过麦克风、声卡录制后软件内录得的音量电平值。(文章最后将计算过程整理为Python代码,方便复用)

假设用正常说话的声音大小65dB(SPL)来计算。思路,这里的链路是:人说话声 -> 麦克风 -> 麦克风输出电压信号 -> 声卡麦克风输入 -> 电脑软件记录。那么计算所需的关键参数:

  1. 麦克风的灵敏度(算得麦克风输出电压信号所需)
  2. 声卡麦克风输入接口的最大输入电平(软件能录到的最大电平值,0dBFS,音量100%的位置)

麦克风的灵敏度

假设麦克风的灵敏度是:

S m V / P a = 10 m V / P a S_{mV/Pa}=10mV/Pa SmV/Pa=10mV/Pa

S d B V = − 40 d B V S_{dBV}=-40dBV SdBV=40dBV

简化计算过程,这里不考虑麦克风的等效输入噪声,不考虑麦克风输入阻抗,也不考虑环境噪声。

声卡麦克风输入规格

某款带可调增益的声卡麦克风输入的部分规格如下:

  • 动态范围(A加权):116dB
  • THD+N:-97dB(-1dBFS@8dB增益)
  • 等效输入噪声(EIN)(A加权):-127dBu
  • 最大输入电平(在最小增益下):16dBu
  • 增益范围:69dB
  • 输入阻抗:3kΩ

简化计算,假设录音时增益设置为0,输入阻抗不考虑,声卡的EIN足够小也不考虑。只取计算过程需要用的最大输入电平:16dBu。

计算过程

声压级单位换算

人说话声音声压级65dB(SPL)单位需要转换为帕斯卡(Pa),否则无法根据麦克风的灵敏度公式转换为mV。找到这两者的关联公式是:

SPL (dB) = 20 log ⁡ 10 ( P P 0 ) \text{SPL (dB)} = 20 \log_{10} \left( \frac{P}{P_0} \right) SPL (dB)=20log10(P0P)

  • P 是需要算出来的帕斯卡声压级。
  • P_0 是参考的帕斯卡声压级,一般取20uPa。

所以算出来是:

P = P 0 × 1 0 S P L ( d B ) 20 = 20 ( u P a ) × 1 0 65 ( d B ) 20 = 35566 ( u P a ) P = P_0 \times 10 ^ { \frac{SPL(dB)}{20} } = 20 (uPa) \times 10 ^ {\frac{65(dB)}{20} } = 35566(uPa) P=P0×1020SPL(dB)=20(uPa)×102065(dB)=35566(uPa)

计算结果四舍五入保留了整数部分。

算出麦克风输出电压

上一步算出来的 35566(uPa) 换算为Pa单位,得到P=0.035566(Pa)。代入麦克风灵敏度公式算得:

V m i c = P × S m V / P a = 0.035566 ( P a ) × 10 ( m V / P a ) = 0.35565 ( m V ) = 3.5565 × 1 0 − 4 ( V ) V_{mic} = P \times S_{mV/Pa}=0.035566(Pa) \times 10 (mV/Pa) = 0.35565(mV)=3.5565 \times 10^{-4}(V) Vmic=P×SmV/Pa=0.035566(Pa)×10(mV/Pa)=0.35565(mV)=3.5565×104(V)

由于声卡灵敏度用的电压是有效值(RMS),所以这里算出来的值也是有效值。

计算电压和声卡最大输入电压的占比
声卡最大输入电压

声卡最大输入电平是16dBu。dBu 是一个对数单位,用于表示相对于参考值 0.775 伏特(有效值)的电压电平。即:

V d B u = 20 × l o g 10 ( V m a x 0.775 ) V_{dBu}=20 \times log_{10}( \frac {V_{max}} {0.775}) VdBu=20×log10(0.775Vmax)

V_max是声卡最大输入电压(有效值,RMS)。根据公式,要计算16 dBu对应的电压值,如下:

V m a x = 0.775 × 1 0 V d B u 20 = 0.775 × 1 0 16 ( d B u ) 20 = 4.89 ( V ) V_{max} = 0.775 \times 10^{\frac{V_{dBu}}{20}}=0.775 \times 10^{\frac{16(dBu)}{20}}= 4.89(V) Vmax=0.775×1020VdBu=0.775×102016(dBu)=4.89(V)

这里保留2位小数。

计算人声的电平数值

软件录音电平音量条的最大值通常是0 dBFS(dB Full Scale),这是一个数字音频信号电平单位。dBFS表示满度相对电平,0 dBFS的位置是系统能处理的最大音频信号的编码值,即最大值。实际数字音频信号的幅度相对于这个最大值的比值即为满度相对电平,因此实际的电平值都是负值。

在软件中,音量条的最大值通常表示为0 dBFS,这意味着任何超过这个值的信号都会导致削波失真。为了防止失真,通常会将录音电平设置在-3 dBFS到-6 dBFS之间,以留出一定的余量。

V m i c = 3.5565 × 1 0 − 4 ( V ) , V m a x = 4.89 ( V ) V_{mic} = 3.5565 \times 10^{-4}(V) , \space V_{max} = 4.89(V) Vmic=3.5565×104(V), Vmax=4.89(V)

计算dBFS如下(保留2位小数):

dBFS = 20 × log ⁡ 10 ( V m i c V m a x ) = 20 × log ⁡ 10 ( 3.5565 × 1 0 − 4 ( V ) 4.89 ( V ) ) = − 82.77 ( d B F S ) \text{dBFS} = 20 \times \log_{10} \left( \frac{V_{mic}}{V_{max}} \right)=20 \times \log_{10} \left( \frac{3.5565 \times 10^{-4}(V)}{4.89(V)} \right)=-82.77(dBFS) dBFS=20×log10(VmaxVmic)=20×log10(4.89(V)3.5565×104(V))=82.77(dBFS)

-82.77(dBFS)很小声,播放出来得将音量调很大才能听见声音。这种情况录音时得将增益调大。

计算过程Python实现

直接把文章复制扔给Kimi,开启长思考,代码实现完了。检查了一下能跑,而且计算过程是对的。小改后如下:

# SPDX-License-Identifier: MIT
# ******************************************************************************
# (c) 2025 庵中十三居士
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
# ******************************************************************************import mathdef calculate_dBFS(spl: float, mic_sensitivity_mV_Pa: float, max_input_dBu: float) -> float:'''根据声音声压级、麦克风灵敏度和声卡最大输入电平计算录音后软件内的电平值(dBFS)。参数:spl (float):声音声压级,单位为分贝(dB SPL)mic_sensitivity_mV_Pa (float):麦克风灵敏度,单位为毫伏每帕(mV/Pa)max_input_dBu (float):声卡的最大输入电平,单位为分贝伏特(dBu)返回:float:计算得到的软件内电平值,单位为分贝满量程(dBFS)感谢 Moonshot AI 提供的代码实现。这份计算代码基于庵中十三居士的文章原理编写,帮助您将声学参数与实际录音电平联系起来,方便对录音电平进行预估和调整。'''# 声压级转帕斯卡(Pa)P0 = 20  # uPa(参考声压级)spl_db = splPa = P0 * 10 ** (spl_db / 20)# 转换为Pa单位(因为Pa = V/mic_sensitivity_mV_Pa)Pa = Pa / 1000000  # 将微帕转换为帕# 计算麦克风输出电压(V)V_mic_mV = Pa * mic_sensitivity_mV_PaV_mic = V_mic_mV / 1000# 计算声卡最大输入电压(V)V_ref_dBu = 0.775  # dBu的参考电压max_input_V = V_ref_dBu * 10 ** (max_input_dBu / 20)# 计算dBFSdBFS = 20 * math.log10(V_mic / max_input_V)return dBFSif __name__ == "__main__":# 参数spl = 65  # 人说话声音大小(SPL)=65dBmic_sensitivity_mV_Pa = 10  # 麦克风的灵敏度(mV/Pa)max_input_dBu = 16  # 声卡最大输入电平(dBu)# 计算dBFS = calculate_dBFS(spl, mic_sensitivity_mV_Pa, max_input_dBu)print(f"计算结果:dBFS = {dBFS:.2f} dBFS") # 计算结果:dBFS = -82.77 dBFS

执行之后结果:

$ python test.py
计算结果:dBFS = -82.77 dBFS

文章CSDN:庵中十三居士

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

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

相关文章

【MySQL数据库】C/C++连接数据库

MySQL要想在C/C下使用,就必须要有 MySQL 提供的头文件和相关的库。 在Ubuntu系统上,使用 apt install mysql-server 安装MySQL服务器后,仅安装了MySQL数据库服务本身,并没有安装MySQL开发所需的库和头文件。因此,在尝试…

Kubernetes调度策略深度解析:NodeSelector与NodeAffinity的正确打开方式

在Kubernetes集群管理中,如何精准控制Pod的落点?本文将深入解析两大核心调度策略的差异,并通过生产案例教你做出正确选择。 一、基础概念快速理解 1.1 NodeSelector(节点选择器) 核心机制:通过标签硬匹配…

Golang的linux运行环境的安装与配置

很多新手在学go时,linux下的配置环境一头雾水,总结下,可供参考! --------------------------------------Golang的运行环境的安装与配置-------------------------------------- 将压缩包放在/home/tools/下 解压 tar -zxvf g…

自定义实现elementui的锚点

背景 前不久有个需求,上半部分是el-step步骤条,下半部分是一些文字说明,需要实现点击步骤条中某个步骤自定义定位到对应部分的文字说明,同时滚动内容区域的时候还要自动选中对应区域的步骤。element-ui-plus的有锚点这个组件&…

Oracle Fusion常用表

模块表名表描述字段说明sodoo_headers_all销售订单头表sodoo_lines_all销售订单行表sodoo_fulfill_lines_all销售订单明细行表popo_headers_all采购订单头表popo_lines_all采购订单行表popo_line_locations_all采购订单分配表popo_distributions_all采购订单发运表invEGP_SYSTE…

面试常问系列(一)-神经网络参数初始化-之-softmax

背景 本文内容还是对之前关于面试题transformer的一个延伸,详细讲解一下softmax 面试常问系列(二)-神经网络参数初始化之自注意力机制-CSDN博客 Softmax函数的梯度特性与输入值的幅度密切相关,这是Transformer中自注意力机制需要缩放点积结果的关键原…

5.9-selcct_poll_epoll 和 reactor 的模拟实现

5.9-select_poll_epoll 本文演示 select 等 io 多路复用函数的应用方法,函数具体介绍可以参考我过去写的博客。 先绑定监听的文件描述符 int sockfd socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in serveraddr; memset(&serveraddr, 0, sizeof(struc…

Python基础语法(上)

常量和表达式 我们可以使用python来进行一些 - * / %的一些运算 print(1 2 - 3) print(1 2 * 3) print(1 2 / 3) python中的运算规则与数学当中一致,先乘除后加减,有括号的先计算括号里面的。 形如 1 2 - 3 这样是算式, 在编程语言中称为 表达式,…

数图闪耀2025深圳CCFA中国零售博览会:AI+零售数字化解决方案引发现场热潮

展会时间:2025年5月8日—10日 地点:深圳国际会展中心(宝安新馆) 【深圳讯】5月8日,亚洲规模最大的零售行业盛会——2025 CCFA中国零售博览会在深圳盛大开幕。本届展会汇聚全球25个国家和地区的900余家参展商&#xff…

方法:批量识别图片区域文字并重命名,批量识别指定区域内容改名,基于QT和阿里云的实现方案,详细方法

基于QT和阿里云的图片区域文字识别与批量重命名方案 项目场景 ​​企业档案管理​​:批量处理扫描合同、发票等文档,根据编号或关键信息自动重命名文件​​医疗影像管理​​:识别X光、CT等医学影像中的患者信息,按姓名+检查日期重命名​​电商订单处理​​:从订单截图中提…

Mybatis解决以某个字段存在,批量更新,不存在批量插入(高效)(一)

背景 在开发企业级应用时,我们经常需要处理批量数据的插入和更新操作。传统的逐条处理方式性能低下,而简单的REPLACE INTO或INSERT ... ON DUPLICATE KEY UPDATE在某些场景下又不够灵活。本文将介绍一种基于临时表的高效批量插入/更新方案,解…

JVM、JRE、JDK的区别

JVM JVM全称Java虚拟机(Java Virtual Machine, JVM),它是运行java字节码的虚拟机,JVM针对不同的系统有不同的实现,目的运行相同的字节码有同样的结果,JVM是“一次编译,到处运行”实现的关键。如下不同的编程语言编译生成字节码文…

神经元和神经网络定义

在深度学习中,神经元和神经网络是构成神经网络模型的基本元素。让我们从基础开始,逐步解释它们的含义和作用。 1️⃣ 神经元是什么? 神经元是神经网络中的基本计算单元,灵感来自于生物神经系统中的神经元。每个人的脑中有数以亿…

CDGP重点知识梳理

写在前面 全文11700字,共82个重点知识 目 录 考点分布 考试要求 第一章 数据管理-5%

Ubuntu 22.04 安装配置远程桌面环境指南

在云服务器或远程主机上安装图形化桌面环境,可以极大地提升管理效率和用户体验。本文将详细介绍如何在 Ubuntu 22.04 (Jammy Jellyfish) 系统上安装和配置 Xfce4 桌面环境,并通过 VNC 实现远程访问。 系统环境 操作系统:Ubuntu 22.04 LTS (Jammy Jellyfish)架构:AMD64安装…

node提示node:events:495 throw er解决方法

前言 之前开发的时候喜欢使用高版本,追求新的东西,然后回头运行一下之前的项目提示如下 项目技术栈:node egg 报错 node:events:495 throw er; // Unhandled error event ^ Error: ENOENT: no such file or directory, scandir F:\my\gi…

【软件设计师:软件工程】9.软件开发模型与方法

一、软件危机与软件工程 软件危机与软件工程是计算机科学发展中密切相关的两个概念。 1.软件危机(Software Crisis) 背景:20世纪60年代至80年代,随着计算机硬件性能提升,软件规模与复杂度剧增,传统开发方法难以应对,导致大量项目失败。 表现: 成本失控:开发周期长、…

范式之殇-关系代数与参照完整性在 Web 后台的落寞

最近参加了一个PostgreSQL相关的茶会,感慨良多。原本话题是PostgreSQL 在 SELECT 场景中凭借其成熟的查询优化器、丰富的功能特性和灵活的执行策略,展现出显著优势。在窗口函数(Window Functions)、JOIN 优化、公共表表达式&#…

WebRTC工作原理详细介绍、WebRTC信令交互过程和WebRTC流媒体传输协议介绍

简介 WebRTC(Web Real-Time Communication)是一项允许在网页浏览器之间进行音视频通信的技术,基本不需要安装额外的插件。它的核心特点是支持低延迟的点对点(P2P)通讯,常用于视频聊天、实时文件共享、多人…

【大语言模型ChatGPT4/4o 】“AI大模型+”多技术融合:赋能自然科学暨ChatGPT在地学、GIS、气象、农业、生态与环境领域中的应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…