之前一直想写一篇关于麦克风测量声压级的文章,一直没腾出时间,刚好前段时间有个项目用到了这方面的知识,趁项目结束,把这块的相关知识也总结出来。
大体构思是在一个房间,由点声源发声,然后测量在房间任何一处位置的声压,给出仿真程序。这里面肯定用到 RIR(房间冲击响应),模拟声传输路径、声压级的计算这三大部分。
1、房间冲激响应和T60
房间冲击响应函数还是使用德国老牌的方法,镜面法
https://www.audiolabs-erlangen.de/fau/professor/habets/software/rir-generator
c = 340; % Sound velocity (m/s)
fs = 16000; % Sample frequency (samples/s)
r = MicPos; % Receiver position [x y z] (m)
s = SpeakerPos; % Source position [x y z] (m)
Rdim = [L W H]; % Room dimensions [x y z] (m)
%吸声系数
alpha = 0.3;
rc = 1 - alpha;
beta = rc *ones(1,6);
h = rir_generator(c, fs, r, s, Rdim, beta, n);
其中beta是 两种输入方式,单个数据,就是混响时间,如果是 1行6列向量,就可以单独设定 房间六个面的 反射系数
clean_signal = audioread('test.wav');
reverb_signal = fftfilt(h,clean_signal);
audiowrite('test_reverb.wav',reverb,fs);
一段声音经过声传输路径衰减且增加了混响,效果如下:
注意,这还只是1个点声源结果,另外也没有任何附加噪声
T60时间简单,直接借助工具计算即可
%计算体积
V = L*W*H;
%计算表面积
S = 2*(L*W + W*H + H*L);
T60 = 0.161*V/(alpha*S);
2、Matlab绘图模拟声传输路径
借助Matlab中的shape,可以很方便的画出房间,电声源和mic的模拟位置
这是直达声,反射声比较麻烦,尤其是多次反射,我这里为了方便只处理单次反射
首先找到speaker声源点对某个墙面镜像
MirrorPos = [2*L - SpeakerPos(1),SpeakerPos(2),SpeakerPos(3)];
下图绿点是speaker关于右侧墙面的对称点
借助下列程序,求空间直线和平面的交叉点
交叉点记为黄色
https://www.mathworks.com/matlabcentral/fileexchange/17751-straight-line-and-plane-intersection
连线,画出箭头,隐藏掉虚镜像点
由此画出6个(单次)反射情况:
各反射路径和衰减情况,可能有所不同,再加上直达声,合并造成了混响场的效果
3、声压级计算
假设speaker电声源的声压是80dBSPL,求麦克风处的声压,这个我们根据信号的rms值,直接可以算出来了
首先根据相关标准,需要产生A-weighting滤波器,由下面的程序产生
https://www.mathworks.com/matlabcentral/fileexchange/64231-calibratevoicespl?s_tid=srchtitle
%产生 A-weighting filter
[b,a] = adsgn(fs);
[h,w] = freqz(b,a,1024);
semilogx(w/pi,20*log10(abs(h)));
和真实的曲线比较:
http://www.larsondavis.com/support/sound-measurement-terminology
简单的相加和就能算出 mic位置点的声压
4、一些扩展说明
真正的声压的计算方法,应该在标准 iec_61672 中,专门对声压的描述 Sound level meters - Part 1: Specifications
根据Matlab参考的一些资料,https://www.mathworks.com/help/audio/ref/splmeter-system-object.html
以及github 中的py相关资料 https://github.com/python-acoustics/python-acoustics/blob/master/acoustics/standards/iec_61672_1_2013.py
大概有以下几种声压级:
frequency-weighted sound levels Lf ?
fast or slow time-weighted sound levels Lt
equivalent-continuous sound levels(等效连续声压级) Leq
peak sound levels Lp
maximum sound levels Lmax
重点说两个:
a、等效连续声压级,感觉是积分且平均
b、time-weighted sound levels 感觉曲线会实时变化,是声压级设备使用的?【待考证】,分成fast和slow两种
定义为 y(经过权重) 和冲击响应的 卷积,涉及到 指数函数求积分
真实用到声级计上有三种:
http://www.intecconinc.com/index.php/productos?format=raw&task=download&fid=24
35ms 125ms,还有1s对应下面的 τ (tao)
py给出的常数:
上面 的指数函数
负无穷,t一般从0开始,所以负半轴不用考虑,exp函数,在 tx =0 时最小,在tx = t的时候接近1,那么也就是对时间的一种加权
越远离时间,权重越低,越近越高
类似于遗忘曲线,https://zhuanlan.zhihu.com/p/274352214
https://zhuanlan.zhihu.com/p/274352214
这也符合常理,前段时间听到的声音,毕竟在听者脑子里,记忆里留下印象,而且越短印象越深刻。