RWCP 実環境音声・音響データベース ドライソースとインパルス応答の畳み込み計算法 |
(株)三菱総合研究所 比屋根一雄、飯尾淳
| 1.ドライソースとインパルス応答の畳み込み |
![]() |
「ドライソース」とは無響室で測定した音データのことである。 無響室では、一般の部屋や屋外計測で問題となる、 残響(反射音)や背景雑音がほぼゼロである。 音源から直接マイクに到達した音波のみが測定される。 つまり、ドライソースとは音源が本来発生した原音のデータのことである。
ドライソースとして収録する最大のメリットは、 ある特定の部屋における音を再構成できる再現性にある。 部屋の音響特性(インパルス応答)を測定しておけば、 それと畳み込む(コンボリューション)ことによって、 あたかもその部屋で発生したかのような残響音が加えることができる。
原理は極めて単純である。 手を叩く音のドライソースを x(i), t=1,...,N 、 ある会議室のインパルス応答を w(i), t=1,...,M としよう。 その会議室で手を叩いたときの音は次式で再構成することができる。

しかしながら、 48kHzサンプリングのわずか1秒のドライソースでも48,000点のデータ長があり、 インパルス応答も通常数万点の長さを持つ。 したがって、数十億回の乗算を行わなければならない。 以下で、畳み込み計算を高速フーリエ変換(FFT : Fast Fourier Transform)を 用いて高速に計算する方法を示し、さらに畳み込み計算プログラムを提供する。
| 2.高速フーリエ変換による高速畳み込み計算 |
![]() |
ドライソースがインパルス応答よりも短い場合 (N < M) には、 一回のフーリエ変換で畳み込むことができる。 簡単のためにインパルス応答のデータ長 M は2のべき乗であるとする。
X(f) = F[x(t)] f = 1,…,2M
W(f) = F[w(t)] f = 1,…,2M
Y(f) = X(f) W(f) f = 1,…,2M
y(t) = F-1[Y(f)] t = 1,…,2M
インパルス応答は長くとも1〜2秒であるが、ドライソースは数十秒におよぶ場合もある。 原理的にはインパルス応答をドライソースと同じ長さになるよう、後ろをゼロで埋めて フーリエ変換すれば前述の方法で計算できる。 しかし、埋めたゼロの分まで計算するのは効率が悪く、 コンピュータのメモリの制限もある。 そこで、ドライソースを分割して計算することが望ましい。
以下に分割畳み込みの手順を示す。
| 3.ソフトウエア |
![]() |
ドライソースとインパルス応答の畳み込みプログラムを提供する。 動作確認済みの稼働環境は RedHat Linux 6.2 であるが、 一般的な UNIX 環境であればコンパイル、実行可能であろう。 なお、本ソフトウエアの配布条件は GPL (GNU General Public License)に従う。
RedHat Linux 6.x などの glibc-2.1 の Linux 環境であれば、 dryconv の実行形式を /usr/local/bin などの 実行パスにコピーするだけである。
ソースファイル dryconv.cからコンパイルするには、 次のGNUの数値解析用科学ライブラリ(GSL)が必要である。
$ gcc -O2 -o dryconv dryconv.c -lgsl -lgslblasnative
usage : dryconv [option] dryfile impulsefile [outfile]
(necessaries)
dryfile : dry source file - 16bit int
impulsefile : impulse response file - 32bit float
(options)
-len ??? : output length of data [point]
outfile : reproduced signal file - 16bit int
引数として、ドライソースファイル名とインパルス応答ファイル名を与える。
出力ファイル名を指定しなければ、標準出力に書き出される。
オプション -len で出力ファイルのデータ長を指定することができる。
なお、出力となる再構成信号がドライソースとレベルが同じになるよう、
インパルス応答を正規化して畳み込み計算を行っている。
それぞれのファイルフォーマットは次の通りである。 いずれもへッダのない Raw 形式である。
ファイル フォーマット (入力)ドライソース 16ビット整数 Raw 形式 (入力)インパルス応答 32ビット実数 Raw 形式 (出力)再構成信号 16ビット整数 Raw 形式
| 4.サンプル |
![]() |
最初のグラフにある手を叩く音のドライソースデータ claps.dat と、 会議室(残響時間 0.38 秒)のインパルス応答 ir383.dat から、 会議室の拍手音 output.dat を再構成するには、次のようにプログラムを実行する。
$ dryconv claps.dat ir383.dat output.dat