ホームシアターにカーペットを敷くべきか?
By K.Yoshimi
はじめに
「自宅にホームシアター(シアタールーム)を作って、映画鑑賞やスポーツ観戦、音楽を楽しみたい!」
そのような人が増えていると聞きます。
しかし、高い費用を払って作ったホームシアターが、想像していた音響と違った😖、とはなりたくないものです。
また、騒音・防音を考慮して、吸音材を置いたら音響がどう変わるのかも知りたいでしょう。
このように、あらかじめ実験できないような状態を予測するには、シミュレーションがとても有効です。
本記事では、ホームシアターを作るときや、室内音響を改善する場合に使えるシミュレーションを紹介します。
PyRoomAcoustics
ホームシアターのような室内音響をシミュレーションするのに適したソフトウェアとして、 オープンソースのPyRoomAcousticsがあります。
PyRoomAcousticsは
- 部屋の設定
- マイクの配置
- 音源の配置
- シミュレーション
- 結果の確認
を簡単に行えます。
PyRoomAcousticsのインストール
PyRoomAcousticsのインストールは、Pythonが使える環境で以下のコマンドを実行します。
pip install pyroomacoustics
また、matplotlibもインストールします。
pip install matplotlib
PyRoomAcousticsの例題
ホームシアターのシミュレーションには、下記のPythonスクリプトをテンプレートとして使用します。
🎈 このようなシミュレーターがGUI付きであると便利ですが、ないので今は手動です。
import matplotlib.pyplot as plt
import numpy as np
from scipy.io import wavfile
import pyroomacoustics as pra
if __name__ == "__main__":
# The desired reverberation time and dimensions of the room
rt60_tgt = 0.3 # seconds
room_dim = [10, 7.5, 3.5] # meters
# import a mono wavfile as the source signal
# the sampling frequency should match that of the room
fs, audio = wavfile.read("guitar_16k.wav")
# Set the wall materials
m = pra.make_materials(
ceiling="hard_surface",
floor="concrete_floor",
east="brickwork",
west="brickwork",
north="brickwork",
south="brickwork",
)
# Create the room
room = pra.ShoeBox(
room_dim,
fs=fs,
materials=m,
max_order=3,
ray_tracing=True,
air_absorption=True,
)
# place the source in the room
room.add_source([2.5, 3.73, 1.76], signal=audio, delay=0.5)
# define the locations of the microphones
mic_locs = np.c_[
[6.3, 4.87, 1.2],
[6.3, 4.93, 1.2], # mic 1 # mic 2
]
# finally place the array in the room
room.add_microphone_array(mic_locs)
fig, ax = room.plot()
# Run the simulation (this will also build the RIR automatically)
room.simulate()
room.mic_array.to_wav(
f"guitar_16k_reverb.wav",
norm=True,
bitdepth=np.int16,
)
# measure the reverberation time
rt60 = room.measure_rt60()
print("The desired RT60 was {}".format(rt60_tgt))
print("The measured RT60 is {}".format(rt60[1, 0]))
# Create a plot
plt.figure()
# plot one of the RIR. both can also be plotted using room.plot_rir()
rir_1_0 = room.rir[1][0]
plt.subplot(2, 1, 1)
plt.plot(np.arange(len(rir_1_0)) / room.fs, rir_1_0)
plt.title("The RIR from source 0 to mic 1")
plt.xlabel("Time [s]")
# plot signal at microphone 1
plt.subplot(2, 1, 2)
plt.plot(room.mic_array.signals[1, :])
plt.title("Microphone 1 signal")
plt.xlabel("Time [s]")
plt.tight_layout()
plt.show()
スクリプトの実行
まず、上記のスクリプトを実行してみましょう。
上記スクリプトをroomacoustics.pyという名前のファイルで保存します。
また、音源となるwavファイルとして、ギター演奏が入った
https://github.com/LCAV/pyroomacoustics/tree/master/examples/samples
のguitar_16k.wavをダウンロードし、roomacoustics.pyと同じフォルダに置きます。
そして、以下のコマンドで実行します。
python roomacoustics.py
すると、残響音が付加されたファイルguitar_16k_reverb.wavが出力されます。
それでは、音源となる乾いた音のguitar_16k.wavと、
残響音が付加されたguitar_16k_reverb.wavを聞き比べてみましょう。
-
音源の
乾いた音:guitar_16k.wav -
残響音が付加された
guitar_16k_reverb.wav
テンプレートのスクリプトは
- 天井:レンガ、漆喰のような硬い表面 (hard_surface)
- 壁:レンガ (brickwork)
- 床面にコンクリート (concrete_floor)
を設定していますので、音が反射し、だいぶ残響音があります。
また、スクリプトを実行すると、設定している部屋のレイアウトも描画されますので、参考にしてください。

部屋の寸法
それでは、ご自身の部屋を設定しましょう。
まず、部屋の寸法を測ります。
❗部屋は直方体しか設定できません
PyRoomAcousticsでは、多角形を押し出したような部屋も作成できますが、 天井・壁面・床面の吸音率を変更したい場合は、直方体の部屋のみをサポートしています。 部屋が直方体でない場合は、直方体で近似する必要があります。
❗複雑形状では、有限要素法などのガチなシミュレーションが必要です
複雑な形の部屋や家具なども考慮したい場合は、 音響解析ソフトウェアActran のようなソフトウェアが必要になります。
計測した部屋の横幅(m)、縦の長さ(m)、高さ(m)をスクリプトに反映させます。
room_dim = [横幅(m)、縦の長さ(m)、高さ(m)]の意味です。 (デフォルトの設定では、横幅10m、縦の長さ7.5m、高さ3.5mとなっています。)
room_dim = [10, 7.5, 3.5] # meters
天井・壁面・床面の種類の変更
次に、天井・壁面・床面の種類を変更します。
下記リンクを参照ください。
❗家の天井・壁面・床面の種類をお調べください。
吸音率の異なるさまざまな材質のデータベースが用意されていますので、 ご自身の家の材質に近いものに変更します。
また、床をウッドフローリングにしたり、コットンカーペットを敷いたり、壁にカーテンを付けたりと色々変更でき、 それぞれを聞き比べることができます。
スクリプトの変更箇所は下記です。
# Set the wall materials
m = pra.make_materials(
ceiling="hard_surface", # 天井
floor="concrete_floor", # 床面
east="brickwork", # 東側の壁
west="brickwork", # 西側の壁
north="brickwork", # 北側の壁
south="brickwork", # 南側の壁
)
たとえば、床に
- 9mmタフテッドパイルカーペット、フェルト下地 (carpet_tufted_9m)
を敷くとこうなります。
コンクリート床のときより、音が吸収され、残響音が減ります。
さらに、四方の壁に
- コットンカーテン(0.5kg/m2)を壁から約130mm離して3/4の面積に掛ける (curtains_cotton_0.5)
を付けると、ほとんど残響音がなくなります。
音源の配置
音源の位置は、座標[x, y, z]で指定します。
# place the source in the room
room.add_source([2.5, 3.73, 1.76], signal=audio, delay=0.5)
これにより、スピーカーを置く位置を変えることができ、最適なスピーカーの配置を検討できます。
マイクの配置
マイクの配置は、座標[x, y, z]で指定します。
# define the locations of the microphones
mic_locs = np.c_[
[6.3, 4.87, 1.2],
[6.3, 4.93, 1.2], # mic 1 # mic 2
]
マイクの位置を変えることで、どこにソファーを置くと良いかを検討できます。 また、複数のマイクを置くこともできます。
後処理
PyRoomAcousticsには、短時間フーリエ変換(STFT)などの多彩な処理が実装されています。
これらを使用すると、視覚的にも何らかの示唆が得られるかもしれません。
下図は、例で使用したギター音の短時間フーリエ変換(STFT)の結果です。

おわりに
この記事では、オープンソースのPyRoomAcousticsを使って、
ホームシアターの室内音響シミュレーションを行う方法を説明しました。
これを使用すると、床にカーペットを敷いた方が良いか?も検討できるでしょう。
ぜひ、シミュレーションを活用して、夢のホームシアターを実現してください👍
また、ガチの音響解析にご興味がある場合は、弊社までお問い合わせください。
✉️ https://www.rccm.co.jp/contact/