頭部伝達関数(HRTF)を取得するJavaプログラム

先々月大学院を修了しました.学生の余りある時間にたくさんの無駄を試行しました.おそらくその5%程度は,公開することでお役に立てるのではと勝手に推察し,今後いくつかの資料を切出して公開しようと思います.


CONNETTA(ジャケットB)(DVD付)

頭部伝達関数データベース

Head Related Transfer Function (HRTF)は音源から外耳道入口までの音響伝達関数のことです.任意の方角のHRTFを音源信号にたたみこむと,あたかも音が任意の方角から聞こえたような効果が得られます.


名古屋大学の西野助教が有効なデータベースを無償公開していらっしゃいます.データベースを利用した場合は,引用した事実を明記してください.

頭部伝達関数データベース
http://www.sp.m.is.nagoya-u.ac.jp/HRTF/index-j.html


Javaアプレットによるデモンストレーションを作りましたのでこちらもご覧ください.
(年に数回メールで質問を受けるので追記しますが,)このような任意の角度におけるHRTFを取得したい場合には,データベースとして保存されているHRTFから複数信号を選んで補間する計算処理が必要です.

Javaから簡単にHRTFを取得するクラス

このデータベースをJavaから簡単にアクセスするためにクラスを作りました.メソッドをstatic定義しているので,コンストラクタを宣言せずに希望の角度のHRTFが取得できます.標本化周波数は44.1kHzです.
※データベースに存在しない角度のHRTFを取得する場合には,近隣の4点の伝達関数から線形補間しています.

// 例1: 任意の水平角&仰角における両耳のHRTFを取得
double hrtf = HRTF.get(azimuth, elevation);

// 左耳のHRTF:hrtf[0]
// 右耳のHRTF:hrtf[1]

利用の際は上記の頭部伝達関数データベースから HRTF data (2) をダウンロードして,クラスと同じディレクトリに置いてください.

Javaから簡単にHRTFを取得するクラス(水平面上のみ)

仰角は水平面に固定していいというニーズもあると思い,水平面上のみ習得する簡易クラスもあります.こちらは HRTF data (2) のelev0を,クラスと同じディレクトリに置いてください.
※データベースに存在しない角度のHRTFを取得する場合には,近隣の2点の伝達関数から線形補間しています.

// 例2: 水平面上のある角度における両耳のHRTFを習得
double hrtf
        = HeadRelatedTransferFunction.get(azimuth);

// 左耳のHRTF:hrtf[0]
// 右耳のHRTF:hrtf[1]

Javaから簡単にHRTFを取得するクラス(頭部近傍バージョン)

さらに頭部近傍のHRTFデータベースである HRTF data (4) を適用したクラスもあります.こちらも同様に任意仰角と水平面上のみとの2種類のクラスがあります.こちらは標本化周波数が HRTF data (2) と異なり48kHzですのでご注意ください.

// 例3: 任意の水平角&仰角における両耳のHRTFを取得
double hrtf = HRTF20.get(azimuth, elevation);

// 左耳の頭部近傍HRTF:hrtf[0]
// 右耳の頭部近傍HRTF:hrtf[1]
// 例4: 水平面上のある角度における両耳のHRTFを習得
double hrtf
        = HeadRelatedTransferFunction20.get(azimuth);

// 左耳の頭部近傍HRTF:hrtf[0]
// 右耳の頭部近傍HRTF:hrtf[1]

ダウンロード

こちらからファイルをダウンロードできます.BSDライセンスを適用します.ぜひ感想を頂けると今後のモチベーションを持てるのでよろしくお願いします.なお感想は歓迎ですが,「HRTFってなに?」とかいう根本的な質問や,「うまくできないので信号処理のソースを全部くれ」という依頼にはお断りをしています.