声音响度、声压级计权(A B C)实现

news2024/11/29 21:29:16

 声压 sound pressure

声压就是大气压受到声波扰动后产生的变化,即为大气压强的余压,它相当于在大气压强上的叠加一个声波扰动引起的压强变化。由于声压的测量比较容易实现,通过声压的测量也可以间接求得质点速度等其它物理量,所以声学中常用这个物理量来描述声波

我们知道大气压强单位 1Pa = 1 pascal = 1N/m

实际计算可以参考http://www.sengpielaudio.com/calculator-soundlevel.htm

由于人对不同的声音频段 听感大小不一致,所以要对声音进行计权处理

如下实现 A  B   C 计权的实现,计权的实现参考标准,用于逼近实际的等响度曲线

 

ISO 226-2003标准

A、B、C三种计权网络特性,分别对应于倒置的40、70、100Phon等响曲线(1000Hz归一化到0dB),其作用是分别反应人耳对低、中、高声压级的响度感觉。A计权被证实是人耳对声压级主观反应的极好校正。对由A计权测量的声级称为A声级,记作LPA 或dB(A)。近来B计权、C计权已很少采用。

  • A计权:40Phon等响曲线的翻转,模拟55dB以下低强度噪声特性。

  • B计权:70Phon等响曲线的翻转,模拟55~85dB中等强度噪声特性。

  • C计权:100Phon等响曲线的翻转,模拟高强度噪声特性。

  • D计权:专用于飞机噪声的测量。


target_folder='audio/'
audio_targets = '.wav'
spl_folder = '/c_audio'
from  librosa import load
from  os import  listdir,path
from scipy.signal import lfilter,bilinear
from numpy import pi, convolve,log10,sqrt,sum,power
from csv import writer

def a_weighting_coeffs_design(sample_rate):
    """Returns b and a coeff of a A-weighting filter.
    Parameters
    ----------
    sample_rate : scalar
        Sample rate of the signals that well be filtered.
    Returns
    -------
    b, a : ndarray
        Filter coefficients for a digital weighting filter.
    Examples
    --------
    >>> b, a = a_weighting_coeff_design(sample_rate)
    To Filter a signal use scipy lfilter:
    >>> from scipy.signal import lfilter
    >>> y = lfilter(b, a, x)
    See Also
    --------
    b_weighting_coeffs_design : B-Weighting coefficients.
    c_weighting_coeffs_design : C-Weighting coefficients.
    weight_signal : Apply a weighting filter to a signal.
    scipy.lfilter : Filtering signal with `b` and `a` coefficients.
    """

    f1 = 20.598997
    f2 = 107.65265
    f3 = 737.86223
    f4 = 12194.217
    A1000 = 1.9997
    numerators = [(2 * pi * f4)**2 * (10**(A1000 / 20.0)), 0., 0., 0., 0.]
    denominators = convolve([1., +4 * pi * f4, (2 * pi * f4)**2],
                            [1., +4 * pi * f1, (2 * pi * f1)**2])
    denominators = convolve(convolve(denominators, [1., 2 * pi * f3]),
                            [1., 2 * pi * f2])
    return bilinear(numerators, denominators, sample_rate)


def b_weighting_coeffs_design(sample_rate):
    """Returns `b` and `a` coeff of a B-weighting filter.
    B-Weighting is no longer described in DIN61672.
    Parameters
    ----------
    sample_rate : scalar
        Sample rate of the signals that well be filtered.
    Returns
    -------
    b, a : ndarray
        Filter coefficients for a digital weighting filter.
    Examples
    --------
    >>> b, a = b_weighting_coeff_design(sample_rate)
    To Filter a signal use :function: scipy.lfilter:
    >>> from scipy.signal import lfilter
    >>> y = lfilter(b, a, x)
    See Also
    --------
    a_weighting_coeffs_design : A-Weighting coefficients.
    c_weighting_coeffs_design : C-Weighting coefficients.
    weight_signal : Apply a weighting filter to a signal.
    """

    f1 = 20.598997
    f2 = 158.5
    f4 = 12194.217
    B1000 = 0.17
    numerators = [(2 * pi * f4)**2 * (10**(B1000 / 20)), 0, 0, 0]
    denominators = convolve([1, +4 * pi * f4, (2 * pi * f4)**2],
                            [1, +4 * pi * f1, (2 * pi * f1)**2])
    denominators = convolve(denominators, [1, 2 * pi * f2])
    return bilinear(numerators, denominators, sample_rate)


def c_weighting_coeffs_design(sample_rate):
    """Returns b and a coeff of a C-weighting filter.
    Parameters
    ----------
    sample_rate : scalar
        Sample rate of the signals that well be filtered.
    Returns
    -------
    b, a : ndarray
        Filter coefficients for a digital weighting filter.
    Examples
    --------
    b, a = c_weighting_coeffs_design(sample_rate)
    To Filter a signal use scipy lfilter:
    from scipy.signal import lfilter
    y = lfilter(b, a, x)
    See Also
    --------
    a_weighting_coeffs_design : A-Weighting coefficients.
    b_weighting_coeffs_design : B-Weighting coefficients.
    weight_signal : Apply a weighting filter to a signal.
    """

    f1 = 20.598997
    f4 = 12194.217
    C1000 = 0.0619
    numerators = [(2 * pi * f4)**2 * (10**(C1000 / 20)), 0, 0]
    denominators = convolve([1, +4 * pi * f4, (2 * pi * f4)**2],
                            [1, +4 * pi * f1, (2 * pi * f1)**2])
    return bilinear(numerators, denominators, sample_rate)
    
def SPLCal(x):
    Leng = len(x)
    pa = sqrt(sum(power(x, 2))/Leng)
    p0 = 2e-5
    spl = 20 * log10(pa / p0)
    return spl    



def preprocess_spl(name,spl):
    """Main logic for SPL weighting"""
    n = 1
    ##at = find_recordings(target_folder, audio_targets)
    at =listdir(target_folder)
    for f in at:
        filename = path.join(target_folder, f)
        x, Fs = load(filename)
        b, a = c_weighting_coeffs_design(Fs)
        y = lfilter(b, a, x)
        out = SPLCal(y)
        spl.append(out)
        name.append(f[:-4])
        print(filename[6:-4]+"     spl:"+str(out))
        '''print("--- Preprocessing SPLs: " + str(round(n / len(at) * 100, 2)) +
              "% done. ---\t\t",
              end='\r\r\r\n\n')'''
        n += 1    
if __name__ == '__main__':
    name =[]
    spl= []
    preprocess_spl(name,spl)
    header =['name', 'spl(dbc)']
    with open('save.csv', 'w') as file:
        # 2. Create a CSV writer
        mywrite = writer(file)
        # 3. Write data to the file
        mywrite.writerow(header)
        tmp = zip(name,spl)
        mywrite.writerows(tmp)
        file.close()

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

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

相关文章

人工智能入门教学——AI代理(AI Agent)

目录 一、简介 二、特征 三、结构 四、工作流程 五、类型 六、应用 一、简介 AI代理 (Artificial Intelligence Agent)是指使用人工智能技术和算法来执行特定任务、解决问题或实现目标的程序或系统。这些代理可以是简单的程序,也可以是复杂的系统&#xff0c…

学生党福音!一个能自定义词库的单词软件--单词魔方

大家好 我是Yhen 这一期给大家介绍一款自制的单词软件–单词魔方 文章目录 一.创作缘由二.功能介绍&升级内容三.使用方法四.程序获取 一.创作缘由 为什么会有想法开发这个单词软件呢? 因为平时自己在做阅读,看电影时积累下来了一些单词 当我想要系…

Spring Cache(缓存框架)

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

C++ libcxxabi中dynamic_cast 实现

摘要:最近在看一个崩溃的过程中详细看了一遍cxxabi的定义,就想着看一些llvm中cxxabi的一些实现。本文描述了cxxabi中dynamic_cast的实现以及原理。   关键字:cxxabi,dynamic_cast 1 简介 C中,dynamic_cast用于有虚函数的继承链…

Linux系统管理:WinSCP 安装与使用

目录 一、实验 1.下载WinSCP 2.安装WinSCP 3.使用WinSCP 一、实验 1.下载WinSCP (1)地址 Downloading WinSCP-6.1.2-Setup.exe :: WinSCP 2.安装WinSCP (1)选择安装程序模式 (2)点击 (3…

vite-性能优化-构建优化-cnd加速优化

CDN 加速优化 - 感觉用不大到 主要作用 : 将引入的依赖,打包部署后,在用户访问的时候, 通过网络CDN的方式进行加载,而非直接从你自己的服务器上加载。优点 : 1、直接降低了你自己的打包的体积&#xff0c…

基于helm的方式在k8s集群中部署gitlab - 部署(一)

文章目录 1. 背景说明2. 你可以学到什么?3. 前置条件4. 安装docker服务(所有节点)5. 部署k8s集群5.1 系统配置(所有节点)5.2 安装kubelet组件(所有节点)5.2.1 编写kubelet源5.2.2 安装kubelet5.2.3 启动kubelet 5.3 集…

2023nacos源码解读第4集——整体了解nacos源码模块

文章目录 1、类Linux tree的windows treee工具2、源码目录结构3、模块依赖关系 1、类Linux tree的windows treee工具 windows 自带的tree 不够用,使用node npm安装一个类Linux 的treee npm install -g cnpm --registryhttps://registry.npm.taobao.org npm config…

MySQL 8 手动安装后无法启动的问题解决

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,(…

springframe工程导入

配置gradle工程 init.d 目录下新建init.gradle allprojects {repositories {mavenLocal()maven {allowInsecureProtocol trueurl https://maven.aliyun.com/nexus/content/repositories/central/}} } 报错Plugin [id: org.jetbrains.dokka, version: 0.10.1, apply: false] w…

Python集合类型

目录 目标 版本 官方文档 集合分类 实战 创建 循环 常用方法 目标 掌握set和frozenset两种集合的使用方法,包括:创建、交集、并集、差集等操作。 版本 Python 3.12.0 官方文档 Set Types — set, frozensethttps://docs.python.org/3/library/s…

常见指令的数据通路和执行过程

作此篇的原因是17年19题: 本题选A,做的时候总感觉不够通透,因此把这题涉及到的内容全部看了一遍,顿时没有那种朦胧感了 零、五段式流水线: 以下均为MIPS设定:指令长度为32位,主存按字节编址&a…

RC-MVSNet:无监督的多视角立体视觉与神经渲染--论文笔记(2022年)

RC-MVSNet:无监督的多视角立体视觉与神经渲染--论文笔记(2022年) 摘要1 引言2 相关工作2.1 基于监督的MVS2.2 无监督和自监督MVS2.3 多视图神经渲染 3 实现方法3.1 无监督的MVS网络 Chang, D. et al. (2022). RC-MVSNet: Unsupervised Multi-…

领域驱动设计总结——如何构造领域模型

领域驱动设计总结——如何构造领域模型 本文为领域驱动设计系列总结的第三篇,主要对领域驱动设计概念做个介绍,本系列领域驱动设计总结主要是在Eric Evans 所编写的《领域驱动设计》 一书的基础上进行归纳和总结。本文主要介绍在领域驱动设计中如何构造…

【数据中台】开源项目(2)-Dbus系统架构

大体来说,Dbus支持两类数据源: RDBMS数据源 日志类数据源 1 RMDBMS类数据源的实现 以mysql为例子. 分为三个部分: 日志抽取模块(最新版DBus已经废弃该模块,使用canal直接输出到kafka) 增量转换模块 全量拉取模块 1.1 日志抽…

紫光展锐 展讯芯片 展讯处理器解锁BL 各分区结构 ROM 分区列表代表什么 bin img 表示什么意思

是展锐 Android 10.0、Android 9.0 平台 ROM 空间划分情况以及分区格式、分区大小和分区功能的 初步描述。 prodnv 开机后系统中的 productinfo 分区,保 存 adc 校准参数、eng.db 数据库。 Miscdata 保存 ota、recovery 时的一些数据 recovery 存放 recovery.i…

【深度学习实验】图像处理(二):PIL 和 PyTorch(transforms)中的图像处理与随机图片增强

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入需要的工具包1. PIL图像处理a. 生成绿色和蓝色图像b. 缩放和合成图像c 在合成图像上添加文字d. 展示并保存图像 2. PIL随机图像增强a. 定义随机图像增强函数b. 实验结果展示 3. PyTorch&…

【Amazon】通过代理连接的方式导入 AWS EKS集群至KubeSphere主容器平台

文章目录 一、设置主集群方式一:使用 Web 控制台方式二:使用 Kubectl命令 二、在主集群中设置代理服务地址方式一:使用 Web 控制台方式二:使用 Kubectl命令 三、登录控制台验证四、准备成员集群方式一:使用 Web 控制台…

P17C++析构函数

目录 前言 01 什么是析构函数 1.1 举个栗子 02 为什么要写析构函数 前言 今天我们要讨论一下它的“孪生兄弟”,析构函数,它们在某些方面非常相似。 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时&…

[LaTex]arXiv投稿攻略——jpg/png转pdf

一、将图片复制进ppt,右键单击图片选择设置图片格式,获取图片高度和宽度 二、选择“设计-幻灯片大小-自定义幻灯片大小” 三、设置幻灯片大小为图片大小 四、 选择“最大化” 五、 检查幻灯片大小是否与图像大小一致 六、导出为PDF