本文是作者投稿到“21dB声学人”公众号的文章,现经有允许转载到自己的博客,技术交流可以联系593170280@qq.com

房间脉冲响应(Room Impulse Response, RIR)表征了房间系统的系统响应,可以用于房间均衡和计算房间声学参数等用途。在使用脉冲响应反向积分法计算房间混响时间时,首先需要测量房间内的声源到传声器的脉冲响应。测量房间脉冲响应有许多种方法,文献[1]中对不同的房间脉冲响应测量方法进行了详细的介绍和对比。本文详细介绍其中最为常用的最大长度序列法[2](Maximum Length Sequence, MLS),并在实际房间中使用该方法进行房间脉冲响应的测量。最大长度序列是一种二进制伪随机序列,是具有全带特性的信号。最大长度序列易于硬件生成且具有可重复性,因此通常被作为激励信号由扬声器系统进行重放以进行房间脉冲响应的测量。阶数为 ,周期为 的最大长度序列信号的自相关函数具有以下性质:
Rss ⁡ ( k ) = 1 L ∑ n = 0 L − 1 s ( n ) s ( n + k ) = { 1 k = 0 , L , 2 L , … − 1 L k ≠ 0 , L , 2 L , … \operatorname{Rss}(k)=\frac{1}{L} \sum_{n=0}^{L-1} s(n) s(n+k)=\left\{\begin{array}{cl} 1 & k=0, L, 2 L, \ldots \\ -\frac{1}{L} & k \neq 0, L, 2 L, \ldots \end{array}\right. Rss(k)=L1​n=0∑L−1​s(n)s(n+k)={1−L1​​k=0,L,2L,…k=0,L,2L,…​

可以发现最大长度序列信号的自相关函数为单位脉冲响应。在计算房间脉冲响应时,正是利用了公式中最大长度序列的自相关函数性质。房间可以被视为一个线性时不变系统,因此计算房间脉冲响应可以被视为一个系统辨识问题。在忽略噪声的情况下,系统的输出信号 y ( t ) y(t) y(t)可以由系统的输入信号 x ( t ) x(t) x(t)和系统的脉冲响应 h ( t ) h(t) h(t)卷积得到:
y ( t ) = ∫ − ∞ ∞ x ( t − k ) h ( k ) d k y(t)=\int_{-\infty}^{\infty} x(t-k) h(k) d k y(t)=∫−∞∞​x(t−k)h(k)dk

在公式两端对输入信号 x ( t ) x(t) x(t)进行互相关运算,可得:
Ryx ⁡ ( τ ) = lim ⁡ T → ∞ 1 T ∫ − T / 2 T / 2 ∫ − ∞ ∞ x ( t + τ − k ) h ( k ) x ( t ) d k d t = ∫ − ∞ ∞ Rxx ⁡ ( τ − k ) h ( k ) d k \begin{aligned} \operatorname{Ryx}(\tau) &=\lim _{T \rightarrow \infty} \frac{1}{T} \int_{-T / 2}^{T / 2} \int_{-\infty}^{\infty} x(t+\tau-k) h(k) x(t) d k d t \\ &=\int_{-\infty}^{\infty} \operatorname{Rxx}(\tau-k) h(k) d k \end{aligned} Ryx(τ)​=T→∞lim​T1​∫−T/2T/2​∫−∞∞​x(t+τ−k)h(k)x(t)dkdt=∫−∞∞​Rxx(τ−k)h(k)dk​

将最大长度序列的自相关函数的性质带入上式,可得:
R y x ( τ ) = h ( τ ) Ryx(\tau)=h(\tau) Ryx(τ)=h(τ)

以上推导表明:对系统的输入信号和输出信号进行互相关运算,即可计算出系统的脉冲响应。对于房间系统而言,互相关运算计算出了房间脉冲响应。
由于最大长度序列是可重复信号,因此可以进行多次测量取平均以减少测量的随机误差,这也是最大长度序列信号相对于白噪声信号的优势之一。需要注意的是,在生成最大长度序列信号时应该根据所需房间脉冲响应的长度选择合适的阶数。如果阶数过小,生成的最大长度序列信号长度短语所需房间脉冲响应的长度,会造成信号混叠,导致计算错误[2]。图1分别展示了在真实房间中使用最大长度序列法进行测量时的输入信号、输出信号,以及测得的房间脉冲响应。
精准地测量房间脉冲响应需要专业的仪器与人员,并且耗费较多的时间与精力,不利于大规模测量。在构建混响语音数据集用于训练深度神经网络时,由于数据集的大小与质量直接决定了算法的性能,因此为了获取大量的房间脉冲响应数据,往往采用计算机模拟的方法人工生成房间脉冲响应。
计算机模拟房间脉冲响应的方法主要可分为四类:第一类是基于波动声学的方法,如有限元法[3]和边界元法[4]。这类方法可以准确地模拟房间中的声波传输,但是对于高频声波的计算复杂度比较高。第二类是基于射线声学的方法,如虚源法[5]和路径追踪法[6]。这类方法因为计算复杂度较低而被广泛使用,但是该类方法对于低频声波的仿真存在局限。第三类是基于RIR统计模型的方法,如Schroder统计模型,但是该类方法模拟的RIR与真实的RIR在早期混响部分存在显著差异。第四类是基于深度学习的方法,以上介绍的三类传统RIR模拟


图 1 在真实房间中使用最大长度序列法进行测量时的信号: (a) 输入信号; (b) 输出信号; (c)测得的房间脉冲响应

方法均适用于特定的理论假设条件,其模拟的RIR与实际的RIR存在一定差异,造成深度学习模型在实际场景下性能下降。因此,有学者提出基于生成对抗网络(Generative Adversarial Network, GAN)的RIR模拟方法[7],提升了深度学习模型在远场语音识别任务下的准确度。然而,该方法无法模拟具有特定混响时间的RIR且远场语音识别任务下使用的混响时间大多在0.8s以下,缺乏长混响时间对应的RIR数据库。作者随后提出一种快速的RIR模拟方法[8],极大提升了RIR的模拟速度。然而,该方法也是主要用于模拟中短混响(0.2-0.7 s)的RIR,并且与真实房间的RIR仍存在差距。在众多的房间脉冲响应模拟方法中,目前应用得最广泛的方法是虚源法。图2 展示了虚源法模拟的房间脉冲响应的时域波形图。

图2 使用虚源法模拟的房间脉冲响应时域波形图

房间脉冲响应主要由直达声、早期反射声、晚期反射声三部分组成,分别使用黑色、红色、蓝色进行标注。从房间脉冲响应最大值所对应的时间开始计算,前8 ms 的信号属于直达声,从8 ms 到50 ms的信号属于早期反射声,50 ms以后的信号属于晚期反射声。在具有长混响时间的房间中,晚期反射声占有主导地位。虚源法所模拟的房间脉冲响应具有在时域上稀疏的特性,并且其波形由标准的脉冲声和反射声组成。然而,实际房间中的房间性质及反射物更为复杂,因此使用虚源法模拟的房间脉冲响应往往与实际房间中的房间脉冲响应不符。此外,由于虚源法是一种基于射线声学理论的理论模型,无法模拟低频声波特性和复杂房间中的声波传播过程。因此,在使用虚源法所模拟的房间脉冲响应训练深度学习模型时,会造成模型失配问题,导致混响时间盲估计模型在实际应用中性能下降。因此,需要提出一些更加切合实际的房间脉冲响应模拟法,尽量避免了使用虚源法模拟房间脉冲响应带来的弊端。

关键词:

房间脉冲响应、房间脉冲响应测量

参考文献:
[1] STAN G B, EMBRECHTS J J, ARCHAMBEAU D. Comparison of different impulse response measurement techniques[J]. Journal of the Audio engineering society, 2002, 50(4): 249-262.
[2] NIELSEN J L. Maximum-Length Sequence Measurement of Room Impulse Responses with High-Level Disturbances[C]//Audio Engineering Society Convention 100. Audio Engineering Society, 1996.
[3] SHUKU T, ISHIHARA K. The analysis of the acoustic field in irregularly shaped rooms by the finite element method[J]. Journal of Sound and Vibration, 1973, 29(1): 67-IN1.
[4] KIRKUP S. The boundary element method in acoustics: A survey[J]. Applied Sciences, 2019, 9(8): 1642.
[5] ALLEN J B, BERKLEY D A. Image method for efficiently simulating small-room acoustics[J]. The Journal of the Acoustical Society of America, 1979, 65(4): 943-950.
[6] KROKSTAD A, STROM S, SØRSDAL S. Calculating the acoustical room response by the use of a ray tracing technique[J]. Journal of Sound and Vibration, 1968, 8(1): 118-125.
[7] RATNARAJAH A, TANG Z, MANOCHA D. IR-GAN: Room Impulse Response Generator for Far-field Speech Recognition[J/OL]. 2020[2021-07-26]. https://arxiv.org/abs/2010.13219v3.
[8] RATNARAJAH A, ZHANG S X, YU M, 等. FAST-RIR: Fast neural diffuse room impulse response generator[J]. arXiv preprint arXiv:2110.04057, 2021.

房间脉冲响应测量与模拟方法相关推荐

  1. 测量固有频率的方法有哪些

    测量固有频率的方法有以下几种: 动态法: 通过测量物体在振动状态下的频率来确定固有频率. 静态法: 通过测量物体静止状态下的振动情况来确定固有频率. 模拟法: 通过数学模型来模拟物体的振动情况,从而确 ...

  2. UA MATH575B 数值分析下 统计物理的随机模拟方法5

    UA MATH575B 数值分析下 统计物理的随机模拟方法5 Ising Model Gibbs Sampling Glauber Dynamics 这一讲介绍Ising Model,它是MCMC与G ...

  3. UA MATH575B 数值分析下 统计物理的随机模拟方法4

    UA MATH575B 数值分析下 统计物理的随机模拟方法4 这一讲介绍MCMC方法,这个方法最早出现在Metropolis在1953年发在J Chem Phys上的Equation of state ...

  4. UA MATH575B 数值分析下VI 统计物理的随机模拟方法2

    UA MATH575B 数值分析下VI 统计物理的随机模拟方法2 扩散过程的停时问题 理论解 模拟解 扩散过程的停时问题 简单一点,考虑一维的随机扩散问题,假设扩散系数D=12D=\frac{1}{2 ...

  5. UA MATH575B 数值分析下VI 统计物理的随机模拟方法1

    UA MATH575B 数值分析下VI 统计物理的随机模拟方法1 模拟SDE的解 用蒙特卡罗方法估计SDE解的自相关函数 模拟SDE的解 以最简单的随机微分方程为例,考虑随机游走 dxt=ξtdtdx ...

  6. asm 查看 数据文件 修改 时间_更高效的GMX分段模拟方法:修改tpr文件

    原标题:更高效的GMX分段模拟方法:修改tpr文件 ■2020-11-01 22:42:18 在以前的一篇文章中, 我简单说过基于GROMACS的分段模拟方法 [1] . 这种方法非常通用, 几乎能完 ...

  7. 分号可以用来分段么_更高效的GMX分段模拟方法:修改tpr文件

    ■2020-11-01 22:42:18 在以前的一篇文章中, 我简单说过基于GROMACS的分段模拟方法[1]. 这种方法非常通用, 几乎能完成任意的功能, 且无须修改源代码, 但是运行效率比较差, ...

  8. c++ 提取傅里叶描述子_非谐声子模拟方法(Normal Mode Decomposition)

    (本文是2018年"蓝火计划"的调研报告,有修改) 个人博客链接: 非谐声子模拟方法(Normal Mode Decomposition) 引言 固体中的格波由相互独立的简正模式组 ...

  9. 手机怎样测海拔高度?手机测量海拔的方法分享。

    手机怎样测海拔高度?相信很多小伙伴也是十分好奇自己选择所在的海拔高度是怎样的,我们手里拿的东西距离地面是多远等等问题,这时候,需要测量就需要尺子等一系列仪器了,但是在我们没有专业设备的前提下,该怎么办 ...

最新文章

  1. OpenCV A-KAZE匹配的实例(附完整代码)
  2. 10分钟了解JSON Web令牌(JWT)
  3. parentNode,parentElement,childNodes,children的区别
  4. 如何实现 C/C++ 与 Python 的通信?
  5. uefi启动如何进入
  6. 为什么有了接口还要增加一层抽象类?
  7. android入门基础笔记,Sqlite数据库下载
  8. STM32固件库详解
  9. linux中睡眠命令,linux sleep命令详解
  10. 我的项目经验v3.0
  11. Robo3T连接远程mongodb
  12. unity 360°全景图
  13. PS的钢笔,路径,选取,描边(虚线)
  14. yolo模型转换:pytorch -> onnx -> caffe
  15. 民航票务管理系统-C语言--录入,查询,订票,退票,修改航班信息以及主菜单和子菜单。
  16. 寒武纪面试——深度学习工程师
  17. vivado生成bit流错误:Combinatorial Loop Alert
  18. 「π」里藏着所有人的银行卡密码和生日?
  19. 基于S32K的MBD开发环境搭建
  20. 【编程题】【Scratch二级】2019.06 飞不出去的蝴蝶

热门文章

  1. 使用 CSS 创建自定义鼠标游标
  2. 【嵌入式Linux学习笔记】Linux驱动开发
  3. 今日芯声 | 不寒而栗!针孔摄像头画质竟然是4K高清的
  4. 企业邮箱注册购买优惠有哪些,企业工作邮箱怎么注册购买?
  5. 在RMD使用过程中,右侧不生成图片的问题
  6. children()和children以及childrenNode的区别
  7. Vue_01_组件的使用
  8. mysql查询汉字拼音首字母_MySQL查询汉字的拼音首字母实例教程
  9. jz2440---使用uboot烧录程序
  10. Axure RP 8.1 下载(附汉化+注册码)