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

声压级

1. 声压级定义

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

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

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

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

常见的声音分贝值:

声音种类

声压级(分贝)

烈性炸药爆炸声

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)');

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()

绘图如下:

image-20210221155302000

响度

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

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

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

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

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

image-20210220112716013

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

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

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

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

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

其中,

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

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

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

  1. 语音信号处理基础(二)

    语音信号处理基础(二) 1.2.2 语音编码 语音编码的目的 保证在一定语音质量的前提下,尽可能降低编码比特率,以节省频率资源. 语音编码技术的鼻祖:研究开始于1939年军事保密通信的需要,贝尔电话实 ...

  2. MATLAB语音信号处理

    数字信号处理课设,我们使用MATLAB对语音信号进行了一系列处理,并将其所有功能集中于下图界面中: 这个界面涉及功能众多,其中包括语音信号的观察分析.音色变换.AM调制解调.减抽样.加噪去噪.相频分析 ...

  3. 基于matlab的语音信号处理,基于MATLAB语音信号处理的研究

    摘 要:语音信号处理是研究用数字信号处理技术和语音学知识对语音信号进行处理的新兴的学科,是目前发展最为迅速的信息科学研究领域的核心技术之一.通过语音传递信息是人类最重要.最有效.最常用和最方便的交换信 ...

  4. matlab语音信号处理实验_现代通信综合实验系统平台

    现代通信综合实验系统平台 近30年来,随着我国电信行业的迅猛发展,该行业的发展水平已成为衡量一个国家实力的一大关键因子.行业的发展同时,为当代相关专业大学生创造了极大的就业市场,市场对通信类人才有着极 ...

  5. matlab语音信号处理GUI

    主要内容 运用matlab软件实现对声音的变声处理,利用离散付里叶变换进行频谱分析:设计数字滤波器组:通过时域和频域方法做出各种音效效果,实现变速(慢放.快放),变调(频谱左移.右移),低通.高通滤波 ...

  6. 清浊音判别 matlab,matlab语音信号处理如何判别清浊音?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这是我一个学长给的程序,他说里面要算得基本上已经实现了改一下就可以用了...但是i本人不是主攻matlab的说白了就是不怎么会,,想问下该怎么改来实现判断 ...

  7. 语音信号处理-基础(二): 发声生理、听觉生理与听觉心理

    一.语音的来源 1.声带 喉部的声带是对发音影响很大的器官. 声带的声学功能是为语音提供主要的激励源: 由声带震动产生声音,是形成声音的基本声源. 2.基频 声带开启和闭合使气流形成一系列脉冲,每开启 ...

  8. matlab 小波 清浊音,matlab语音信号处理如何判别清浊音?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这是我一个学长给的程序,他说里面要算得基本上已经实现了改一下就可以用了...但是i本人不是主攻matlab的说白了就是不怎么会,,想问下该怎么改来实现判断 ...

  9. matlab怎么选清浊音做短时谱,matlab语音信号处理如何判别清浊音?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这是我一个学长给的程序,他说里面要算得基本上已经实现了改一下就可以用了...但是i本人不是主攻matlab的说白了就是不怎么会,,想问下该怎么改来实现判断 ...

最新文章

  1. 隐式马可夫模型(hidden markov model,HMM)
  2. M-point moving-average(M点滑动平均)Matlab 实现
  3. shell shift与{}_一文掌握shell脚本中shift的用法及功能
  4. mysql 主机不存在_MySQL 当记录不存在时插入,当记录存在时更新
  5. oracle创建联机重做日志,oracle联机重做日志文件管理!
  6. x86汇编代码转x64平台使用(VS2010测试通过)最简单的方法
  7. 典范杜希奇与机器人_典范英语7_16 杜希奇与机器人.ppt
  8. webservice服务及客户端 编程 - 入门
  9. 浅谈FTP服务的几个知识点
  10. scratch-www 在Win10下的环境配置
  11. React-Native之轮播组件looped-carousel的介绍与使用
  12. 父亲节python代码半个心_2019父亲节活动方案,暖心来袭!
  13. 一个国企老兵给后辈们的忠告:三十岁之前远离国企
  14. 笔试题-2023-燧原-数字IC设计【个人解答版】
  15. linux下删除以-开头的文件
  16. mysql忘记密码(无秘登录)for Linux
  17. 4g网络什么时候淘汰_4G网络即将被淘汰?4G手机:我还没过时
  18. vue的生命周期函数有哪些
  19. 北京科技大学计算机考研专业课计算机综合一871分享
  20. DNF登陆的时候说连接服务器失败,请检查您的网络。是否启用修复程序进行修复?,要买春节套,DNF游戏安全组件发生异常强制退出怎么办?...

热门文章

  1. corosync+openais+pacemaker+web
  2. 4.3英寸屏双核 LG Prada K2通过FCC认证
  3. iPhone开发笔记[1/50]:初学iPhone上用Quartz 2D画图
  4. 解决 IE8下 vs2008 无法调试
  5. 飞康CEO:敢于向传统的灾备法则说“不”
  6. 智能硬件的时代,嵌入式是否已经日薄西山
  7. 易语言神经网络验证码识别_递归神经网络 GRU+CTC+CNN 教会验证码识别
  8. TensorFlow 分布式
  9. 安装云端服务器操作系统,安装云端服务器操作系统
  10. 通过__tablename__ = 'xxx' #定义表名