はじめに
音声分析において、フーリエ変換後の周波数領域で、声の高さ(ヘルツ)がどのように得られるのかをまとめた。
この記事は、私が前に書いた記事を読んでからの方が理解しやすいように思う。
音声分析におけるフーリエ変換とスペクトログラムを理解する
周波数とヘルツ(Hz)
- 周波数:
単位時間あたりの振動数
のこと。単位時間とは1秒ではなく任意。 - ヘルツ(Hz):
周波数の単位
。周波数の単位がヘルツの場合は1秒あたりの振動数
。
人間は音の高さ
を1秒あたりの振動数
で認識する。そのため、周波数の単位がヘルツ(Hz)でないと、音の高さを知ることができない。しかし、python等のライブラリでフーリエ変換を行う場合は、周波数領域の単位が得られないことが多い。では、どのように周波数領域の単位をヘルツに変換するのかを考える。
wavファイルの1秒とは
wavファイルの時間軸の何点が1秒間であるかは単位付きのサンプリング周波数
で示される。「単位付きの」と表現しているのは、上記で説明した通り、サンプリング周波数に単位がない場合は1秒あたりでない可能性がある
からだ。サンプリング周波数の単位がヘルツの場合はwavファイルの1秒間の点数
を示す。サンプリング周波数(Hz)は1秒を何点で表すかであり、音の高さを示す周波数ではないので注意が必要。
ちなみに、点で波の1周期を描画するためには最低でも2点必要である。そのため、サンプリング周波数20kHzで描画できる最大の波の振動数は10000周期。すなわち、サンプリング周波数20kHzのwavファイルで表現できる音の最大周波数は10kHzまでである。
サンプリング周波数 | wavを音にしたときに表現できる最大の周波数 |
---|---|
20kHz | 10kHz |
30kHz | 15kHz |
40kHz | 20kHz |
人は約20kHzまでの音しか聞こえないと言われている。そのため、サンプリング周波数はだいたい40kHzあれば良いと言われている。
フーリエ変換後の周波数領域でのヘルツ(Hz)
では、音声ファイルをフーリエ変換した場合、周波数領域の単位がどのようになるか考える。まずは、wavファイルの条件を明確にする。今回はサンプリング周波数20kHzで時間軸の点数40000点(2秒)のwavファイルで考える。
サンプリング周波数 | 音の最大の周波数 | 1秒あたりの点数 | 時間軸の点数 |
---|---|---|---|
20kHz | 10kHz | 20000点 | 40000点(2秒) |
このwavファイルをフーリエ変換する。フーリエ変換は時間領域全体に対して適用される。そのため、フーリエ変換後の周波数は40000点(2秒)を単位時間とした値
となる。ここで、1秒を単位時間とするには20000(サンプリング周波数)/40000(横軸の点数)
をかければ良い。すなわち、今回の場合は周波数領域の周波数軸を1/2
することで、単位をヘルツ(Hz)に変換することができる。これで、周波数領域でも音の高さを知ることができる。
短時間フーリエ変換後の周波数領域でのヘルツ(Hz)
では、音声ファイルを短時間フーリエ変換した場合、周波数領域の単位がどのようになるか考える。wavファイルと短時間フーリエ変換の条件は以下のようにする。
サンプリング周波数 | 音の最大の周波数 | 1秒あたりの点数 | 時間軸の点数 | 短時間フーリエ変換の窓幅の点数 |
---|---|---|---|---|
20kHz | 10kHz | 20000点 | 40000点(2秒) | 2000点(0.1秒) |
このwavファイルを短時間フーリエ変換する。短時間フーリエ変換は時間軸に対して窓幅ごとに適用される。そのため、フーリエ変換後の周波数は2000点(0.1秒)を単位時間とした値
となる。ここで、1秒を単位時間とするには20000(サンプリング周波数)/2000(窓幅の点数)
をかければ良い。すなわち、今回の場合は周波数領域の周波数軸を10倍
することで、単位をヘルツ(Hz)に変換することができる。これで、周波数領域でも音の高さを知ることができる。
ヘルツ(Hz)でスペクトログラムを見る
縦軸を周波数(Hz)、横軸を時間(秒)でスペクトログラムを作成した。どちらの声が高いか、スペクトログラムからも読み取れる。