声压级 matlab,语音信号处理教程(二)声音的声压级和响度

本节内容我们来看下如何用Matlab和Python计算声音的声压级和响度。

声压级

1. 声压级定义

首先来看声压级,这个就是指的我们平时所说的声音有多少分贝。声压定义为声波在某一点产生的逾量瞬时压强的均方根值。由于声压容易被人耳感知,也易于测量,因此,通常使用声压作为描述声波大小的物理量。

声压级以符号SPL(sound pressure level)表示,其定义为将待测声压有效值p(e)与参考声压p(ref)的比值取常用对数,再乘以20,即:

d65c7e3ed7887ca9d8bbbcb0325c08f2.png

在空气中参考声压p(ref)一般取为2e-5帕,这个数值是正常人耳对800赫声音刚刚能觉察其存在的声压值,也就是800赫声音的可听阈声压。一般讲,低于这一声压值,人耳就再也不能觉察出这个声音的存在了。显然该可听阈声压的声压级即为零分贝。

指的是声压有效值,就是一段声音信号的均方根(RMS)。设语音长度为T, 离散点数为N, 则有效声压的计算公式为:

55f3e289f65838fca492f141e06391e9.png

常见的声音分贝值:

声音种类

声压级(分贝)

烈性炸药爆炸声

170

火箭、导弹发射场

150

飞机发动机

120

发电机工作

100

卡车

90

正常谈话

50

轻声耳语

30

农村静夜

10

Matlab代码

由前面的定义可很容易写出SPL的代码,需要注意的是,程序中的输入信号是数字信号,与实际的模拟信号大小成倍数关系。

function spl = SPLCal(x)

len = length(x);

%%

% 有效声压计算,即求RMS

pa = sqrt(sum(x.^2)/len);

%% 声压级计算

% 声压级值spl=20*log10(pa/p0),单位为dB

p0 = 2e-5;

spl = 20*log10(pa/p0);

end

完整代码如下:

clear all;clc;close all;

%%

[x,fs]=audioread('mySpeech.wav');

len=length(x);

%% 语音分帧

% 每帧大小为frameLen,当语音长度不是帧长的整数倍时:

% (1)若剩余长度大于等于帧长的二分之一,则补零至帧长

% (2)若剩余长度小于帧长的二分之一,则舍弃

% 常用的语音帧长:20ms、50ms、100ms、200ms

framTime = 100; % 单位:ms

% 每帧信号点数

frameLen=fs*framTime/1000;

% m为Length/frameLen后得到的余数

m = mod(len,frameLen);

if m >= frameLen/2 % 补零

x = [x;zeros(frameLen-m,1)];

len = length(x);

else   % 即m 

nframe = floor(len/frameLen);

x = x(1:nframe*frameLen);

len = length(x);

end

% 最终的语音分帧总帧数

N = len/frameLen;

%% 计算声压级

s = zeros(1,frameLen);

% N帧信号的声压级值存储在spl向量里

spl = zeros(1,N);

for k = 1:N

s = x((k-1)*frameLen + 1:k*frameLen);

spl(k) = SPLCal(s);

end

%% 绘图

t = 1:len;

spl_rep = repmat(spl, frameLen, 1);

figure();

subplot(211);plot(t/fs,x);grid on;xlabel('时间(s)');title('输入语音波形');

subplot(212);stairs(t/fs,spl_rep(:),'r');grid on;xlabel('时间(s)');ylabel('声压级(dB)');

title('语音信号的声压级(dB)');

6e8c27d2e30c2273ef47cf25db8c4bba.png

image-20210220185851447

Python代码

Python代码如下:

import pyaudio

import wave

import numpy as np

import matplotlib.pyplot as plt

def load_wav(wave_input_path):

wf = wave.open(wave_input_path, 'rb')  # 读 wav 文件

fs = wf.getframerate()

nframes = wf.getnframes()

str_data = wf.readframes(nframes)

wf.close()

wave_data = np.fromstring(str_data, dtype=np.short)

return wave_data.astype(np.float64), fs

def SPLCal(x):

Leng = len(x)

pa = np.sqrt(np.sum(np.power(x, 2))/Leng)

p0 = 2e-5

spl = 20 * np.log10(pa / p0)

return spl

if __name__ == '__main__':

x, fs = load_wav('audio.wav')

Leng = len(x)

frameTime = 100

frameLen = fs * frameTime // 1000

m = np.mod(Leng, frameLen)

if m>=frameLen/2:

x = np.append(x, np.zeros(int(frameLen-m)))

Leng = len(x)

else:

nframe = np.floor(Leng/frameLen)

x = x[0:nframe * frameLen + 1]

Leng = len(x)

N = Leng // frameLen

spl = np.array([])

for k in range(N):

s = x[k*frameLen: (k+1)*frameLen]

spl = np.append(spl, SPLCal(s))

spl_rep = np.repeat(spl, frameLen)

plt.figure()

plt.subplot(211)

plt.plot(x)

plt.subplot(212)

plt.plot(spl_rep)

plt.show()

绘图如下:

ee8ccb9d0ce3f0d5b7c100859129ff51.png

image-20210221155302000

响度

当用同样的力气讲话的时候,为什么我们总觉得女性的声音要比男性的响?这就是我们下面要讲的响度。响度是听觉判断声音强弱的属性,跟人主观感觉有关。人主观感觉判断的声音强弱,即声音响亮的程度,根据它可以把声音排成由轻到响的序列。

当外界声振动传入人耳内,人们在主观感觉上形成听觉上声音强弱的概念。人们习惯于地用“响”与“不响”来描述声波的强度,但这一描述与声波的强度又不完全等同。人耳对声波响度的感觉还与声波的频率有关,即使相同声压级但频率不同的声音,人耳听起来会不一样响。例如,同样是60dB的两种声音,但一个声音的频率为100Hz,而另一个声音为1000Hz,人耳听起来1000Hz的声音要比100Hz的声音响。要使频率为100Hz的声音听起来和频率为1000Hz、声压级为60dB的声音同样响,则其声压级要达到67dB。

下面介绍几个相关的概念:

响度级: 按人耳对声音的感觉特性,依据声压和频率定出人对声音的主观音响感觉量,称为响度级,单位为方。

方(Phon):当某一频率的纯音和1000Hz的纯音听起来同样响时,这时1000Hz纯音的声压级就定义为该待定声音的响度级。因此在1kHz的频率上,声压级为60dBSPL信号的响度为60方。对各个频率的声音作这样的听音比较,得出达到同样响度级时频率与声压级的关系曲线,这就是我们人耳的听觉等响曲线。

8531c503aaa71e8e3269386591d21362.png

image-20210220112716013

从等响曲线图中我们发现,人耳对高频的声音更加敏感,同样声压级下的高频声音响度级比低频的高。一般女性发声的高频成分较多,而男性发声的低频成分相对较多,这就是在同样力气讲话时(声压级相同),女性的声音听上去更加响的原因。

由于这种客观单位只是非常有限地表达了人耳对于响度的反应,因此可以引入一个关于响度的主观概念——宋。

宋(Sone):表示人耳在自然状态下,根据声压级的变化所表现出的对于响度听感的变化。

“宋”与“方”的关系表现为1宋等于40方(即在等响曲线图中,1kHz处代表40dBSPL),并且以1宋为标准,在2宋时响度增加一倍,在0.5宋时响度减小一倍。

根据IS0226--2003标准H等响度曲线的定义,声压级LP 为:

d011d215cff26fc274adf5cb0e9261a6.png

其中,

0f40ef3141288b0264f380f37e178f54.png

其中,为听力阈值;为响度感知指数;为以1000Hz为标准所计算的线性传输函数的幅值。这三个参数都可以在ISO226中查到。

17587bc268a442d7c02648969de7c9fc.png

image-20210220130314703

计算响度的Matlab代码如下:

function [spl, freq] = loudnessCal(phon)

f = [20 25 31.5 40 50 63 80 100 125 160 200 250 315 400 500 630 800 ...

1000 1250 1600 2000 2500 3150 4000 5000 6300 8000 10000 12500];

af = [0.532 0.506 0.480 0.455 0.432 0.409 0.387 0.367 0.349 0.330 0.315 ...

0.301 0.288 0.276 0.267 0.259 0.253 0.250 0.246 0.244 0.243 0.243 ...

0.243 0.242 0.242 0.245 0.254 0.271 0.301];

Lu = [-31.6 -27.2 -23.0 -19.1 -15.9 -13.0 -10.3 -8.1 -6.2 -4.5 -3.1 ...

-2.0  -1.1  -0.4   0.0   0.3   0.5   0.0 -2.7 -4.1 -1.0  1.7 ...

2.5   1.2  -2.1  -7.1 -11.2 -10.7  -3.1];

Tf = [ 78.5  68.7  59.5  51.1  44.0  37.5  31.5  26.5  22.1  17.9  14.4 ...

11.4   8.6   6.2   4.4   3.0   2.2   2.4   3.5   1.7  -1.3  -4.2 ...

-6.0  -5.4  -1.5   6.0  12.6  13.9  12.3];

Ln = phon;

%从响度级计算声压级

Af=4.47E-3 * (10.^(0.025*Ln) - 1.15) + (0.4*10.^(((Tf+Lu)/10)-9 )).^af;

Lp=((10./af).*log10(Af)) - Lu + 94;

spl = Lp;

freq = f;

end

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

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

相关文章

javascript 之作用域-06

作用域 作用域:是指变量可访问的范围,他规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。 作用域有两种工作模式: 静态作用域 :又称为词法作用域,在编译阶段就可以决定变量的引用,…

被裁之后才明白:有一种抗风险能力,叫做会讲故事

如果你注意观察,会发现周围总有这么一种人:他说的每句话,单拎出来都没毛病,但一说出口就让人无法接受,很难说服你。尤其在职场里,这种无效沟通特别多,以至于产生了庞大的“沟通成本”&#xff1…

saltstack php,Saltstack快速入门简单汇总

[rootmaster~]# salt \* test.pingminion-1:Trueminion-2:Trueminion-3:Trueminion-4:TrueTrue代表正常,没有响应当然代表客户端没有启动或者没有认证成功之类的。指定目标主要有五种方式一: Global,即salt默认的匹配方式,能识别终…

课下测试03!03!03!题目截图及解析(不完全正确)第四周--信息安全系统设计基础...

课下测试03,也就是第三章内容,以下分析和解析仅供参考哦~ 注意!最好是对着题目看一下书,自己思考一下题目(毕竟我页数都给你标出来了),不是说这样你就能提高了,而是我正确率真不高&a…

哦!数组还能这么用,学到了!

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng这个问题源于读者在阅读redis源码时的一个疑问。先看下面的代码,对于包含动态字符串成员的两个结构体Test0和Test1占用空间分别是多少呢?//来源:…

推荐开源代码2004/12/17

严正声明:本博客中的任何随笔、文章、图片等内容都不能私自转载,必须书面征得作者同意才能转载,并不能随意篡改,如要作出任何改动,必须书面征得作者同意方可,作者拥有一切权利并保留一切追究权利&#xff0…

广东,就是这么横?

昨晚的稿 今天发一下 应该有好久好久没有写篮球相关的文章了,因为之前写了被骂了,不过,今天不一样,毕竟方超巨打得这么好,不吹一下,总感觉今天不完整,骂就骂了吧,反正也不差这一次了…

在ASP.NET中利JavaScript实现控件的聚焦

在Windows应用程序中很容易控制控件的聚焦&#xff0c;但是在ASP.NET中并没有提供这样的功能&#xff0c;但是我们同样可以实现这样的功能&#xff0c;这篇文章就讲述了通过JaveScript实现在页面上某一特定控件获得焦点的功能。 下面是用到的JavaScript代码。 <script langu…

电厂各类设备原理动图,绝对让你看花眼!

▲ 火力发电流程原理▲ 核能发电流程原理▲ 水力发电流程原理▲ 光热发电原理▲ 垃圾发电原理▲ 蒸汽吸收式制冷原理▲ 尿素热解脱硝流程原理▲ 湿法脱硫工艺原理▲ 钢球磨煤机内煤的破碎原理▲ 碎煤机工作原理▲ 螺旋输送机&#xff08;绞龙&#xff09;原理▲ 多管电除尘器▲…

也谈MMU管理机制

1&#xff0c;结构&#xff1a; MMU存储器系统的结构允许对存储器系统的精细控制。大部分的控制细节由存在存储器中的转换表提供。这些表的入口定义了从1KB 到1MB 的各种存储器区域的属性。这些属性包括&#xff1a; 虚拟地址到物理地址映射 ARM 处理器产生的地址叫虚拟…

__ATTRIBUTE__ 你知多少?

_ATTRIBUTE__ 你知多少&#xff1f; 1 #include "stdio.h"2 3 /* 地址参考基准 */4 5 char r1;6 short r2;int refer;7 8 struct p9 { 10 int a; 11 12 char b; 13 14 short c; 15 16 }__attribute__((aligned(4))) pp; 17 /* 4字节对齐&#xff0c;a…

跟几位大佬共进晚餐

这是一篇几个程序员大佬聚会的聚后感文章这次聚会比较唐突&#xff0c;连总从广州专门开车来深圳看望我们&#xff0c;我们约在了某个地铁站的八合里牛肉火锅店&#xff0c;这是一个周五的下午&#xff0c;理论上是非常简单的一个周五&#xff0c;但是因为这些男人女人的存在&a…

vue.js框架搭建

安装脚手架 前提条件&#xff1a;已安装node&#xff08;4.0版本以上&#xff09;&#xff0c;npm a、全局安装 vue-cli npm install -g vue-cli 安装成功后可以通过命令行查看版本号&#xff0c;如图 b、初始化项目 新建一个文件夹命名为01vue&#xff0c;准备在此文件夹下存放…

oracle数据库imp导入,imp 导入 没有数据库

IMP-00009: 导出文件异常结束今天准备从生产库向测试库进行数据导入&#xff0c;结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误&#xff0c;google一下&#xff0c;发现可能有如下原因导致imp的数据太大&#xff0c;没有写buffer和commit两个数据库字符集不同从…

MIK C语言面试两题

这是一个读者朋友在知识星球上提到的两个笔试题&#xff0c;第一个题目比较简单&#xff0c;关键在第二个题目「编程题」&#xff0c;我文章中写的解题思路应该不是最好的&#xff0c;希望大神读者们给出更好的答案&#xff0c;让这个充满乐趣的程序世界再增添一些乐趣吧&#…

看看大疆的C语言面试题

惯例&#xff0c;这笔试题也是一个读者朋友发给我的&#xff0c;简单看了下&#xff0c;并不觉得这是一个非常困难的题目&#xff0c;最近是校招准备的时候&#xff0c;很多人给我说发面试题对大家有帮助。这个题目面试官强调了这个跑在64位系统下。代码如下:#define mal(x,y) …

RocketMQ实战(一)

阿里巴巴有2大核心的分布式技术&#xff0c;一个是OceanBase&#xff0c;另一个就是RocketMQ。在实际项目中已经领教过RocketMQ的强大&#xff0c;本人计划写一个RocketMQ实战系列&#xff0c;将涵盖RocketMQ的简介&#xff0c;环境搭建&#xff0c;初步使用、API详解、架构分析…

C面试总结文档

最近很多人有参加面试&#xff0c;面试就避免不了笔试&#xff0c;嵌入式面试的话&#xff0c;避免不了C语言&#xff0c;所以给大家准备了两份pdf C语言面试总结的文档。在本公众号回复 「C面试」获取pdf下载链接推荐阅读&#xff1a;专辑|Linux文章汇总专辑|程序人生专辑|C语…

程序员到底怎么了

我们是这样的一群人&#xff1a;每天都在“努力”的工作着&#xff0c;每天都和计算机打交道&#xff0c;泡在网上&#xff0c;打游戏&#xff0c;查资料&#xff0c;发微博。可是有一天&#xff0c;突然意识到&#xff0c;我们的未来在哪里&#xff0c;每个月那点可怜的工资&a…

来看看比尔盖茨当年写的BASIC解释器源代码吧,你就知道泰勒级数有什么用了...

几年前当我刚上大学那会&#xff0c;我曾经问过我一位学计算机同学的一个问题&#xff1a;计算机是如何计算诸如 或者 这种运算的&#xff1f;当初这个问题曾经困扰了我好长时间&#xff0c;这个问题并非是我当年在微积分课堂上解决的&#xff0c;而是直到我后来接触编程后才彻…