不同音频振幅dBFS计算方法

embedded/2025/1/12 8:47:48/

1. 振幅的基本概念

振幅是描述音频信号强度的一个重要参数。它通常表示为信号的幅度值,幅度越大,声音听起来就越响。为了更好地理解和处理音频信号,通常会将振幅转换为分贝(dB)单位。分贝是一个对数单位,能够更好地反映人耳对声音强度变化的感知。

2. 振幅计算方法

2.1 总 RMS(Total RMS)

总 RMS 是一种常用的振幅计算方法,表示整个音频信号的平均能量。其计算公式为:
RMS = 20 ⋅ log ⁡ 10 ( 1 N ∑ i = 1 N x i 2 + 1.0 × 1 0 − 9 ) \text{RMS} = 20 \cdot \log_{10}(\sqrt{\frac{1}{N} \sum_{i=1}^{N} x_i^2} + 1.0 \times 10^{-9}) RMS=20log10(N1i=1Nxi2 +1.0×109)

其中, x i x_i xi是音频信号的样本值, N N N 是样本总数。总 RMS 提供了音频信号的整体响度感知。

2.2 最大 RMS(Max RMS)

最大 RMS 是通过将音频信号分成多个窗口,计算每个窗口的 RMS 值,并返回这些值中的最大值。其计算公式为:
Max RMS = max ⁡ ( 20 ⋅ log ⁡ 10 ( 1 N ∑ i = 1 N x i 2 + 1.0 × 1 0 − 9 ) ) \text{Max RMS} = \max \left( 20 \cdot \log_{10} \left( \sqrt{\frac{1}{N} \sum_{i=1}^{N} x_i^2} + 1.0 \times 10^{-9} \right) \right) Max RMS=max 20log10 N1i=1Nxi2 +1.0×109

其中:

  • x i x_i xi 是窗口内的音频样本值。
  • N N N是窗口内样本的总数。

2.3 最小 RMS(Min RMS)

最小 RMS 与最大 RMS 类似,但它返回的是每个窗口中计算出的最小 RMS 值。其计算公式为:
Min RMS = min ⁡ ( 20 ⋅ log ⁡ 10 ( 1 N ∑ i = 1 N x i 2 + 1.0 × 1 0 − 9 ) ) \text{Min RMS} = \min \left( 20 \cdot \log_{10} \left( \sqrt{\frac{1}{N} \sum_{i=1}^{N} x_i^2} + 1.0 \times 10^{-9} \right) \right) Min RMS=min 20log10 N1i=1Nxi2 +1.0×109

其中:

  • x i x_i xi 是窗口内的音频样本值。
  • N N N 是窗口内样本的总数。

2.4 平均 RMS(Avg RMS)

平均 RMS 是所有窗口 RMS 值的平均值,提供了音频信号的整体响度水平。其计算公式为:
Avg RMS = 1 M ∑ j = 1 M ( 20 ⋅ log ⁡ 10 ( 1 N ∑ i = 1 N x i j 2 + 1.0 × 1 0 − 9 ) ) \text{Avg RMS} = \frac{1}{M} \sum_{j=1}^{M} \left( 20 \cdot \log_{10} \left( \sqrt{\frac{1}{N} \sum_{i=1}^{N} x_{ij}^2} + 1.0 \times 10^{-9} \right) \right) Avg RMS=M1j=1M 20log10 N1i=1Nxij2 +1.0×109

其中:

  • x i j x_{ij} xij 是第 j j j 个窗口内的音频样本值。
  • N N N 是每个窗口内样本的总数。
  • M M M 是窗口的总数。

2.5 峰值幅度(Peak Amplitude)

峰值幅度是音频信号中最大绝对值的幅度,通常用于表示信号的瞬时强度。其计算公式为:
Peak = 20 ⋅ log ⁡ 10 ( max ⁡ ( ∣ x ∣ ) + 1.0 × 1 0 − 9 ) \text{Peak} = 20 \cdot \log_{10}(\max(|x|) + 1.0 \times 10^{-9}) Peak=20log10(max(x)+1.0×109)

峰值幅度能够快速反映音频信号的瞬时响度,但不一定能准确表示人耳的感知。

3. 听觉结果的一致性

人耳对声音的感知是非线性的,通常对响度变化的感知与实际的物理振幅变化不成正比。使用 RMS 和分贝单位进行计算,可以更好地模拟人耳的感知特性。以下是不同计算方法与听觉结果的一致性分析:

  • 总 RMS:提供了整体响度的良好估计,通常与听觉感知一致。
  • 最大 RMS:能够捕捉到音频信号中的最强响度部分,适合用于动态范围分析。
  • 最小 RMS:有助于识别音频信号中的弱响度部分,适合用于音频修复和增强。
  • 平均 RMS:提供了稳定的响度水平,适合用于音频混音和母带处理。
  • 峰值幅度:虽然能够快速反映瞬时响度,但由于其瞬时特性,可能与人耳的感知不完全一致。

4. 程序实现

import os
import numpy as np
import librosa
def calculate_total_rms_dbfs(audio_data):rms_level = 20 * np.log10(np.sqrt(np.mean(audio_data ** 2)) + 1.0e-9)  # 计算总 RMS 并转换为 dBFSreturn rms_level
def calculate_max_rms_dbfs(audio_data, window_size):rms_values = []for start in range(0, len(audio_data), window_size):end = min(start + window_size, len(audio_data))window = audio_data[start:end]if len(window) > 0:rms = 20 * np.log10(np.sqrt(np.mean(window ** 2)) + 1.0e-9)rms_values.append(rms)return np.max(rms_values) if rms_values else -np.inf  # 返回 -inf 如果没有 RMS 值
def calculate_min_rms_dbfs(audio_data, window_size):rms_values = []for start in range(0, len(audio_data), window_size):end = min(start + window_size, len(audio_data))window = audio_data[start:end]if len(window) > 0:rms = 20 * np.log10(np.sqrt(np.mean(window ** 2)) + 1.0e-9)rms_values.append(rms)return np.min(rms_values) if rms_values else -np.inf  # 返回 -inf 如果没有 RMS 值
def calculate_avg_rms_dbfs(audio_data, window_size):rms_values = []for start in range(0, len(audio_data), window_size):end = min(start + window_size, len(audio_data))window = audio_data[start:end]if len(window) > 0:rms = 20 * np.log10(np.sqrt(np.mean(window ** 2)) + 1.0e-9)rms_values.append(rms)return np.mean(rms_values) if rms_values else -np.inf  # 返回 -inf 如果没有 RMS 值
def calculate_peak_amplitude(audio_data):return 20 * np.log10(np.max(np.abs(audio_data)) + 1.0e-9)
def analyze_audio_file(audio_path, window_duration=0.05):audio_data, sr = librosa.load(audio_path, sr=None)window_size = int(window_duration * sr)total_rms_dbfs = calculate_total_rms_dbfs(audio_data)max_rms_dbfs = calculate_max_rms_dbfs(audio_data, window_size)min_rms_dbfs = calculate_min_rms_dbfs(audio_data, window_size)avg_rms_dbfs = calculate_avg_rms_dbfs(audio_data, window_size)peak_amplitude = calculate_peak_amplitude(audio_data)print(f"File: {audio_path}")print(f"Total RMS (dBFS): {total_rms_dbfs:.2f}")print(f"Max RMS (dBFS): {max_rms_dbfs:.2f}")print(f"Min RMS (dBFS): {min_rms_dbfs:.2f}")print(f"Avg RMS (dBFS): {avg_rms_dbfs:.2f}")print(f"Peak Amplitude(dBFS): {peak_amplitude:.2f}")
if __name__ == "__main__":audio_path = '/Volumes/T9/DATA/构建数据集/SELE/real_echo/0011217_echo.wav'analyze_audio_file(audio_path)

在这里插入图片描述

在这里插入图片描述计算结果与Audition一致。


http://www.ppmy.cn/embedded/153251.html

相关文章

C语言二级考试

你必须知道的 二级考试不是编写程序,或者说不只是编程的考核,它还会考核计算机C语言相关语言还有内涵等基础知识,比较全面综合(说人话,要看最新考纲具备一定的基础知识) 考试时间 120 分钟 分值 100 分&…

大语言模型提示技巧(七)-扩展

扩展是将较短的文本,例如一组提示或主题列表,输入到大型语言模型中,让模型生成更长的文本。我们可以利用这个特性让大语言模型生成基于某个主题的电子邮件或小论文。通过这种方式使用大语言模型,可以为工作与生活提供诸多便利&…

Lua语言的多线程编程

Lua语言的多线程编程 引言 Lua是一种轻量级的、高效的脚本语言,因其简洁的语法和良好的可扩展性而广泛应用于游戏开发、嵌入式系统和互联网应用等领域。然而,Lua的标准实现(即PicoLisp与LuaJIT)天然并不支持多线程,因…

2025年三个月自学手册 网络安全(黑客技术)

🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“…

web服务器+selinux实验

实验1:基本实现 yum install nginx -y systemctl start nginx.service systemctl restart nginx.service vim /etc/nginx/nginx.conf 修改配置文件 把 root 的路径改为 /var/www/html echo "hello world" > /var/www/html/index.html 重启服务 [ro…

设计模式 行为型 模板方法模式(Template Method Pattern)与 常见技术框架应用 解析

模板方法模式(Template Method Pattern)是软件设计模式中的一种行为设计模式。它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下重定义算法的某些特定步骤。 假设我们在制作不同…

2025新春烟花代码(二)HTML5实现孔明灯和烟花效果

效果展示 源代码 <!DOCTYPE html> <html lang"en"> <script>var _hmt _hmt || [];(function () {var hm document.createElement("script");hm.src "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34";var …

用 Python 绘制可爱的招财猫

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​ ​​​​​​​​​ ​​​​ 招财猫&#xff0c;也被称为“幸运猫”&#xff0c;是一种象征财富和好运的吉祥物&#xff0c;经常…