游戏中的声音 - 多孔吸声器






4.86/5 (3投票s)
如何在墙前面有吸声材料的房间中计算衰减。
引言
本文重点介绍如何计算将多孔吸声体放置在墙壁或其他硬质表面前时的吸声系数。这意味着,如果您想在家庭工作室、车库或任何其他房间自行建造矿物棉吸声体,您可以使用计算出的值,并在计算混响时间(您可以在此处了解更多信息)中使用它们。
这篇文章篇幅相当短,但它是许多房间及其行为方式的一个重要方面。当您想计算房间内更高级的功能并将其用于声音重现时,了解这些特性也是必要的。
背景
当您想计算多孔吸声体的吸声系数和复杂波数时,有两种不同的主要方法。它们都使用无量纲参数 E,该参数由下式定义:
需要注意的是,p0 通常设置为空气的密度,因为大多数多孔吸声体含有大约 98% 的空气。流动阻力通常在数据表中以 MKS 瑞利/米-1 为单位给出,这是方程中最重要的参数之一,因此了解如何找到它很重要。
两位研究员 Delany 和 Bazley 发表了一个基于许多标准多孔吸声体平均值的近似公式。他们发布的公式分别给出了波数和特性阻抗,这两个公式如下:
这些公式在中高频下都可以正常使用,但在低频下会失效。幸运的是,Mechel 开发了一个不同的公式,该公式结合了中高频的测量值和低频的理论模型。低频部分的公式如下:
其中 是空气的绝热指数,约等于 1.4,而
是材料的孔隙率,通常在 0.98 左右,这意味着吸声体在其体积中含有约 98% 的空气。 中高频下有效的标准公式或公式如下:
Mechel 还为两种不同公式的转换设定了一些边界,这些边界在程序中给出,此处不作讨论。实现此功能后,将输出一个包含这两个参数的类,如下所示:
Module Porous
''' <summary>
''' Calculates the Material coefficients based on FlowResistivity and Frequency
''' </summary>
''' <param name="Frequency">The frequency the calculation is valid for</param>
''' <param name="FlowResistivity">Flow resistivity of the porous material</param>
''' <param name="rho"></param>
''' <param name="c"></param>
''' <returns>most of the prous materials consists of roughly 98% air,
''' so its assumed that this is the caracteristic properties
''' of most of these kind of absorbers</returns>
''' <remarks>returns the complex wave number ia j*k'.
''' This is not useable directly in some formulas</remarks>
Public Function DelanyBazely(ByVal Frequency As Double, ByVal FlowResistivity _
As Double, Optional ByVal rho As Double = 1.21, Optional ByVal c As Double = 340) _
As Acoustics.SimpleMaterialPropertiesHolder
Dim result As New Acoustics.SimpleMaterialPropertiesHolder
Dim E As Double = rho * Frequency / FlowResistivity
result.CharacteristicImpedance = rho * c * (1 + 0.0571 * Math.Pow(E, -0.754) - New Complex(0, 0.087 * Math.Pow(E, -0.732)))
result.PropagationCoeficcient = New Complex(0, 2 * Math.PI * Frequency / c)
result.PropagationCoeficcient *= (1 + 0.0978 * Math.Pow(E, -0.7) - New Complex(0, 0.189 * Math.Pow(E, -0.595)))
Return result
End Function
''' <summary>
''' Calculates the Material coefficients based on FlowResistivity,
''' Adiabat constant, Porousoty of the material and the Frequency
''' </summary>
''' <param name="Frequency">The frequency for the calculation</param>
''' <param name="FlowResistivity">Flow resistivity of the porous material</param>
''' <param name="Porousity">A percentige of air in the material,
''' set to 0.98 by default, mening it has 2% of fibers in a volume</param>
''' <param name="Adiabat">This is the compressability of air</param>
''' <param name="rho">The weight of air</param>
''' <param name="c">The speed of sound in air</param>
''' <returns>most of the prous materials consists of roughly 98% air,
''' so its assumed that this is the caracteristic properties of most of these kind of absorbers</returns>
''' <remarks>returns the complex wave number ia j*k'.
''' This is not useable directly in some formulas</remarks>
Public Function Mechel(ByVal Frequency As Double, ByVal FlowResistivity As Double, _
Optional ByVal Porousity As Double = 0.98, Optional ByVal Adiabat As Double = 1.4, _
Optional ByVal rho As Double = 1.21, Optional ByVal c As Double = 340) _
As Acoustics.SimpleMaterialPropertiesHolder
Dim E As Double = rho * Frequency / FlowResistivity
Dim lessPart As New Acoustics.SimpleMaterialPropertiesHolder
lessPart.PropagationCoeficcient = New Complex(0, 2 * Math.PI * Frequency / c)
lessPart.PropagationCoeficcient *= Complex.Sqrt(New Complex(1, -Adiabat / (2 * Math.PI * E)))
lessPart.CharacteristicImpedance = New Complex(0, -rho * c ^ 2 / (2 * Math.PI * Frequency * Adiabat * Porousity))
lessPart.CharacteristicImpedance *= lessPart.PropagationCoeficcient
Dim NormalPart As New Acoustics.SimpleMaterialPropertiesHolder
NormalPart.PropagationCoeficcient = New Complex(0.2082 * E ^ (-0.6193), 1 + 0.1087 * E ^ (-0.6731))
NormalPart.PropagationCoeficcient *= New Complex(2 * Math.PI * Frequency / c, 0)
NormalPart.CharacteristicImpedance = New Complex(1 + 0.06082 * E ^ (-0.717), -0.1323 * E ^ (-0.6601))
NormalPart.CharacteristicImpedance *= rho * c
Dim FinalResult As New Acoustics.SimpleMaterialPropertiesHolder
FinalResult = NormalPart
If E > 0.04 Then
Return FinalResult
End If
Dim Elimit As New ElimitHolder
If E < Elimit.GammaReal Then
FinalResult.PropagationCoeficcient = _
New Complex(lessPart.PropagationCoeficcient.Real, _
FinalResult.PropagationCoeficcient.Imaginary)
End If
If E < Elimit.GammaImg Then
FinalResult.PropagationCoeficcient = _
New Complex(FinalResult.PropagationCoeficcient.Real, _
lessPart.PropagationCoeficcient.Imaginary)
End If
If E < Elimit.Zreal Then
FinalResult.CharacteristicImpedance = _
New Complex(lessPart.CharacteristicImpedance.Real, _
FinalResult.CharacteristicImpedance.Imaginary)
End If
If E < Elimit.Zimg Then
FinalResult.CharacteristicImpedance = _
New Complex(FinalResult.CharacteristicImpedance.Real, _
lessPart.CharacteristicImpedance.Imaginary)
End If
Return FinalResult
End Function
Private Class ElimitHolder
Public GammaReal As Double = 0.04
Public GammaImg As Double = 0.008
Public Zreal As Double = 0.006
Public Zimg As Double = 0.02
End Class
End Module
Mechel 后来还给出了其他更复杂的公式,这些公式考虑了例如窗帘等因素的影响,您可能不知道孔隙率,需要计算才能得出传播常数和特性阻抗的正确公式。
除了我刚刚展示的两种方法之外,还有其他替代方法,即 Rayleigh 模型,它采用纯理论方法,并且类似于 Mechel 的低频公式,假设多孔吸声体可以被建模为管状矩阵或穿孔板。
Mechel 还有一个区分不同类型矿物棉的公式。他区分了玻璃纤维和矿物纤维(玄武岩或岩棉),并为它们给出了两个不同的表达式。但是,这在书籍《声学吸声体和扩散体》中有介绍,Mechel 在《声学公式》中对计算多孔吸声体的不同方法进行了详细介绍(他的介绍大约有 50 页,而这本书仅仅是一个公式参考书!)。
还有两个模型,一个由 Attenborough 提出,一个由 Allard 和 Johnson 提出,Allard 和 Johnson 的模型在其公式中确实使用了一些 Attenborough 的结果。这些模型相对复杂,在计算介质特性时会考虑更多参数。我以后可能会重新审视这篇文章,并将其扩展以包含他们的模型。
如何进行计算
这实际上与计算方程中使用多孔材料的系数一样困难。我们首先需要一些理论。
一个无限反射面前的层总是具有可以表示为如下的表面阻抗。
请注意,这里我们讨论的是波数而不是传播系数(区别是传播系数 = jk。所以如果我们有传播系数,我们需要乘以 -j 才能得到波数,而波数可能本身就是复数,这很令人困惑。)
一旦我们获得了这种简单材料的表面阻抗,我们就可以继续计算我们的材料相对于材料前的空气的反射。
这代表了反射,但我们关心的是损耗,所以我们必须用 1 减去反射波来找出有多少能量被损耗了。在声学中,反射因子是指反射波的幅度,我们想要的是强度变化,强度与压力平方成正比。这被称为吸声因子,计算方法如下:
该公式计算的是声波的法向入射,这意味着它没有考虑房间中遇到的扩散波。
使用代码
计算吸声系数的代码如下:
''' <summary>
''' Returns the absorbtion coefficient of a porous absorber in front of a hard wall
''' </summary>
''' <param name="Sigma">Flow resistance in the porous material</param>
''' <param name="ThicknessOfPorousAbsorber">Thickness of the porous material</param>
''' <param name="DelanyBazely">If set to true you
''' use Delaney-Bazley, and if false it uses Mechels approximation</param>
''' <returns>Normal incident absorbtion coefficient</returns>
''' <remarks></remarks>
Public Function CalcualtePorousAbsorption(ByVal Sigma As Double, _
ByVal ThicknessOfPorousAbsorber As Double, ByVal DelanyBazely As Boolean) As OctaveBand
'Store the calcualted result
Dim Result As New OctaveBand
'Speed of sound in air
Dim c As Double = 340
'Mass of air in kg/m^3
Dim rho As Double = 1.21
'Caracteristic impedance of air
Dim z0 As Double
z0 = c * rho
For i As Integer = 0 To Result.Count - 1
'Center frequency of Octave band
Dim f As Double = Result.Okt13(i)
Dim MaterialProperties As New SimpleMaterialPropertiesHolder
If DelanyBazely Then
MaterialProperties = Acoustics.Materials.DelanyBazely(f, Sigma)
Else
MaterialProperties = Acoustics.Materials.MechelGrundmann(f, Sigma)
End If
'Calculate the surface impedance
Dim z As New Complex(0, -1)
z *= MaterialProperties.CharacteristicImpedance / _
Complex.Tan(MaterialProperties.PropagationCoeficcient * z * ThicknessOfPorousAbsorber)
'Calculate the reflection coefficient relative to the main propagation material
Dim ReflectionCoefficient As New Complex
ReflectionCoefficient = (z - z0) / (z + z0)
'Calculate the absorbtioncoefficient and store it
Result.Item(i) = 1 - (Complex.Abs(ReflectionCoefficient)) ^ 2
Next
Return Result
End Function
这样就完成了应用程序。
历史
- 2012.10.12 - 初始发布。
如果您查看两种不同类型的计算,即多孔材料在硬墙后层的吸声,您不会看到太大差异,除了在低频范围。通常认为 Delany-Bazley 公式从 250 Hz 及以上有效,因此通常建议改用 Mechel 的公式。
参考
我在此列出的书籍对我的描述提供了很好的解释,并且如果您想了解更多信息,它们是很好的进一步参考。它们按照我在文章中使用的程度排序。
- 《建筑声学》,第一版(2008 年),Tor Erik Vigran,CRC Press
- 《声学吸声体和扩散体 - 理论、设计和应用》,第二版(2009 年),Trevor J. Cox 和 Peter D'Antonio,Taylor & Francis。
- 《声学公式》,第二版,F.P. Mechel,Springer
- 《声学基础》,第四版,Kinsler、Frey、Coppens 和 Sanders,John Wiley & Sons,Inc.