简单房间麦克风声压级测量仿真程序

之前一直想写一篇关于麦克风测量声压级的文章,一直没腾出时间,刚好前段时间有个项目用到了这方面的知识,趁项目结束,把这块的相关知识也总结出来。

大体构思是在一个房间,由点声源发声,然后测量在房间任何一处位置的声压,给出仿真程序。这里面肯定用到 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

 

这也符合常理,前段时间听到的声音,毕竟在听者脑子里,记忆里留下印象,而且越短印象越深刻

猜你喜欢

转载自blog.csdn.net/book_bbyuan/article/details/115763197