工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

FDTD法によるスピーカーエンクロージャーの角丸め効果のシミュレーション

概要

スピーカーエンクロージャーの角丸め有無がもたらす回折音抑制効果について、FDTD法によるシミュレーションを行い、音の周波数や丸め半径の大きさとの関係を可視化できた。



背景と目的

最近、久しぶりにスピーカーエンクロージャーの製作をしようと考えている。検討課題の1つとして、スピーカーエンクロージャーのバッフル形状の角をどう処理すべきか?ということがある。 エンクロージャーは、直方体が最も作りやすいが、直方体は角が立った形状で、余計な回折波を生みやすいといわれる。実際、私も過去の自作エンクロージャーにおいて角を丸く加工したことはあるが作業は結構面倒だった。そこで、今回製作するにあたって、わざわざ作業時間を割く意味がどれほどあるのか?効果を得るにはどの程度丸める必要があるのか?ということの納得性ある証拠を得たい。そこで、数値シミュレーション手法の1つであるFDTD法を用いて、スピーカーエンクロージャーの角を立てた場合と丸める処理をした場合について比較・考察を行ってみる。



詳細

1. シミュレーション概要

1.0 参考資料

そもそも、私はFDTD法については素人である。便利なツールも持っていない。そこで、Web上の情報を探したところ、なんと運よく友人がコーディングしたFDTD法による音響シミュレーションのPythonソースコードに行き着いた。というわけで、これを参考にコーディングしてみる。

https://gist.github.com/peace098beat/6cb8d051919d19511d7c

また、他の参考資料は以下。


1.1 シミュレーション領域

シミュレーション領域は2次元とする。FDTD法素人なので、ひとまず2次元でちゃんとできるようにしたい。 2次元なので、エンクロージャーの天面を見下ろす形となる。 時間離散化幅を10.4usec(≒サンプリング周波数96kHzの1周期)とし、Courantの安定条件を満たすように空間離散幅を決める。 結果的に、縦横のセル数は225 * 225となった。

  • 奥行: 1m
  • 横幅: 1m
  • 媒質: 空気
    • 密度: 1.205 kg/m3
    • 音速: 343.5 m/s
  • 周囲の境界: PML層
    • 層数: 32
    • テーパー乗数: 4
  • 空間離散化幅: 6.25 mm
  • 時間離散化幅: 10.4 usec

1.2 エンクロージャ

直方体とする。2次元なので上から見下ろした長方形となる。角丸めについては後述。

  • 横幅: 約250mm
  • 奥行: 約300mm

1.3 音源

音源は、ガウシアンパルスとし、中心位置の時刻をt0としたとき、パルスの裾野すなわち時刻0と2t0において十分に減衰し不連続とならないように係数を設定する。

また、音源の位置は、スピーカーユニットがバッフル面の中央についていると想定した位置とする。

  • 中心位置: t0
  • 係数a = 20 * 105 / (t0 * t0 * 400 * 400)
  • 係数m=0.001


2. コーディング

基本的には、参考のソースコードやリンクにある通り。参考のソースコードは3次元なので、2次元に変更。エンクロージャーの存在する領域をシミュレーション条件として与える部分だけ記述する。

エンクロージャーの表面は全反射とすると、表面で粒子速度0になるようにする必要がある。 エンクロージャー表面および内部領域で、係数0、それ以外が1となるような係数行列maskを以下のように定義する。ここで、marumeという変数は丸めの強さを指定するもので、0で直角、1,2,3がそれぞれ約6mm、12mm、18mmである。 その他、細かいインデクス変数名については、参考のソースコードを参照。

# 全部1
mask = np.ones(p.shape)
# エンクロージャー表面および内部領域を0
mask[ion - 1:iox + 1, jon - 1:jox + 1] = 0.0
# 角の丸め
if marume >= 1:

    mask[ion - 1, jon - 1] = 1.0 # 隅
    mask[ion, jon - 1] = 1.0 # 上
    mask[ion - 1, jon] = 1.0 # 右

    mask[ion - 1, jox] = 1.0 # 隅
    mask[ion, jox] = 1.0 # 上
    mask[ion - 1, jox - 1] = 1.0 # 左

    if marume >= 2:
        mask[ion + 1, jon - 1] = 1.0 # 上2
        mask[ion, jon] = 1.0 # 右上
        mask[ion - 1, jon + 1] = 1.0 # 右2

        mask[ion + 1, jox] = 1.0 # 上2
        mask[ion, jox - 1] = 1.0 # 左上
        mask[ion - 1, jox - 2] = 1.0 # 左2

    if marume >= 3:
        mask[ion + 2, jon - 1] = 1.0 # 上3
        mask[ion - 1, jon + 2] = 1.0 # 右3
        mask[ion + 2, jox] = 1.0 # 上3
        mask[ion - 1, jox - 3] = 1.0 # 左3

そして、タイムステップごとに繰り返される処理内において、算出された粒子速度が格納された配列vx, vyについてこのマスクを掛け合わせる。掛け合わせた結果に基づいてそのタイムステップの音圧が計算される。

vx *= mask
vy *= mask


3. 結果

3.0 条件

ガウシアンパルスの幅は音の周波数に対応し、低周波音と高周波音の2条件とする。角の条件は、直角=丸めなしの場合と、半径18mmで丸めた場合の2条件とする。

  • 角の条件: 直角、半径18mm丸め
  • ガウシアンパルスの幅: t0=0.5msec、1msec
  • シミュレーション長さ: 3msec(t0=0.5msecのとき)、6msec(t0=1msecのとき)

3.1 結果の見方

  • 画像下側がエンクロージャー正面=リスナー方向
  • 青が正の音圧、赤が負。色の濃さが、音圧の大きさ
  • 中央のグレーと薄青の長方形、赤丸、みどり丸がエンクロージャーのある領域
  • 黒い×が音源位置。スピーカーユニットがバッフル面の中央にある想定。
  • マゼンタの×がエンクロージャーバッフル面の角位置をあらわす。

3.1 低周波(パルスt0=1.0msec)

低周波では、丸めの有無による差がほとんどない。低周波音に対しては、角丸めの効果は特にない。ウーファー周辺を頑張って丸める必要はなさそうだ。

角=直角

角=R18mm

3.2 高周波(パルスt0=0.5msec)

高周波では、丸めの有無による差が出た。直角の場合にバッフルの端できれいな回折音の波面が発生しているのに対して、丸めた場合はエンクロージャー正面=リスナーに向かってくる波面を含め、全体的に回折音を低減できている。中~高域のユニットの周辺の角は丸める効果がありそうだ。

角=直角

角=R18mm

なお、予備実験として18mm以下の丸めも試しているがあまり差が出なかった。したがって、音の周波数帯域によるが、18mm程度が必要。18mmだと、DIY用のトリマーでは削ることが難しい。どうやって作業しようか。

※本当は、ガウシアンパルスの周波数スペクトルを求めておけばいいのだが、サボった。

また、今回の関心の対象ではないが、エンクロージャー後面端においても回折音が生じている。スピーカーの近くに壁があると、悪影響がありそうに見えて面白い。



まとめと今後の課題

今回の条件においては、エンクロージャーの半径18mm程度の角丸めによって、数kHz以上の音に対して回折音を低減する効果が期待できそうだとわかった。 製作予定のエンクロージャーでは、角の丸め処理をする前提で設計を進めることとする。