WaveSpectraを用いた周波数特性の測定について


WaveSpectra(以下WS)、および姉妹ソフトWaveGene(以下WG)を組み合わせて周波数特性を測定する場合の注意点などについてまとめてみました。

WS+WGで周波数特性を測定する方法は次のような方法があります。
(1)WG(V1.40)のユーザー波形で周期スイープを用いる方法。
(2)直接WGのスイープ信号を用いる方法。(WSのピークホールド機能を用いる方法)

普通は、簡単に短時間(多くて数秒)で正確な周波数特性が得られるので、(1)の方法を強くお勧めします

この方法は、サウンドデバイス自体のループ接続時の特性、サウンドデバイスに接続したアンプ等の外部回路、あるいはアンプ/マイク経由でスピーカーの簡易測定等、ほとんどの場合に用いることができます。(リアルタイムに直接応答が得られる場合)

詳しい方法は、WG側の説明 "周期スイープを用いた周波数特性の測定について" を参照してください。


(1)が使えない場合、たとえば録音機の録音/再生特性など、リアルタイムに応答が帰らない場合には、(2)の一般的なスイープ信号+WSのピークホールド機能による以下の方法を用いることになります。

ただし、この場合、WG側の設定など注意する点があります。


(1) WGのスイープ信号の設定

WG と組合わせてスイープ信号で周波数特性をWSのピークホールド機能を用いて測定する際には、スイープ速度に充分に注意してください。

本来、FFTで正しい値を得るためには、サンプルデータ数に相当する時間の間、信号が一定で変化しないことが必要です。変化している場合は本当の値は得られていないということです。

Logスイープの場合は、周波数が高くなるほど変化速度が大きくなるので、高域に行くに従って低下した特性で測定されます。
(Webや雑誌などに掲載された測定データでも時々見かけます(^^;)

この高域の低下を無くすには、

注1: Logスイープではなくリニアスイープを用いてください。

低下はしますが全周波数範囲で一定の低下にすることができます。

Logスイープを使っても、窓関数の影響によって、サンプルデータ数を小さくするか、スイープ時間を充分長くすると、高域の低下がほとんど無くなるようになる場合がありますが、本来は正しい測定ではありません。

測定対象を通す前に、先に元のスイープ信号のWaveファイルを直接再生するなどして、低下の程度を把握しておくことをお勧めします。


次にスイープ速度ですが、正確な測定の為には充分にゆっくりした速度で変化させる必要があります。

ではどれぐらいの速度でスイープさせれば良いのか、ざっと目安を求めてみます。

FFTの本来の分解能で描画する、ということにすると、例えば、
サンプリング周波数 Fs=48000Hz、FFTサンプルデータ数 N=4096 の時、周波数分解能は 48000/4096=11.72Hz。
この分解能で 20〜20000Hzまで分析するとした時、FFTの分析時間は周波数分解能の逆数 00853秒、
よって、0.0853秒毎に11.72Hz間隔で移動して行けばほぼ良い、という見当にすると、
(20000-20) / 11.72 * 0.0853 = 145秒

式をまとめると、
注2: スイープ時間 = スイープ周波数幅*N*N/Fs/Fs

この場合、20kHzまで約2分半ほど必要、となります。
FFTサンプルデータ数 8096 の場合なら、4倍の 10分ほど 必要、となります。
FFTサンプルデータ数 16384 の場合なら、さらに4倍の 40分ほど 必要、となります。
以下省略します。

実際は窓関数の分解能がFFT分解能の数倍あるため、さらにその分広がった幅でしかプロットできないので、せっかく時間を掛けても上の分解能で分析できるわけでもありません。

かなり多くの時間が必要なことになりますが如何でしょうか。

(なお、それほどの分解能を必要としない場合は、本来の分解能は得られないことを承知でもっと短くすることもできます)


以下、スイープ速度による分解能の変化について、実際の例を示します。


(2) WGのスイープ信号の速度の違いによるWSのピークホールド時の分解能

サウンドデバイスの出入力間に、Twin-Tノッチフィルタ回路を入れ、そのディップをどの程度正しく検出できるか調べてみました。
WG リニアスイープ --> サウンド出力 --> ノッチフィルタ --> サウンド入力 --> WS ピークホールド

フィルタの本来の周波数特性を示します。(周期スイープによる)
-30dB程度のディップになっています。


[FFTサンプルデータ数 およびスイープ時間を変えた場合]

スイープ時間は、(1)の式によって、最適時間?としてあります。
(青線が比較のための正しい特性。 あえて約1kHzで一時停止してあります)

サンプルデータ数 4096、Hanning窓、スイープ時間は 10〜2000Hzまで 15秒 (44fps)

サンプルデータ数 8192、Hanning窓、スイープ時間は 10〜2000Hzまで 58秒 (38fps)

サンプルデータ数 16384、Hanning窓、スイープ時間は 10〜2000Hzまで 230秒 (30fps)


やはり、サンプルデータ数(とスイープ時間)が大きいほど結果は良いようです。


[ディップ近辺を拡大して見やすくしたもの]


スイープ速度の他に、さらに窓関数の特性によっても分解能が低下してしまいます。
その違いを示します。

サンプルデータ数 4096、Hanning窓、スイープ時間は 10〜2000Hzまで 15秒 (44fps)

↑緑線はスイープ途中でディップ位置に合わせて一時停止した場合のスペクトル。
レベルから見てほぼ正しいディップが検出されているようです。

しかし、両側の上がり下がりの部分で窓関数の裾野の広がりによってディップが塗り潰されて消失していることがわかります。

同じく、
サンプルデータ数 8192、Hanning窓、スイープ時間は 10〜2000Hzまで 58秒 (38fps)

↑緑線はスイープ途中でディップ位置に合わせて一時停止した場合のスペクトル。

同じく、両側の部分でディップが塗り潰されて消失していることがわかります。

[窓関数による違い]

窓関数の種類によるディップの塗り潰しの程度の違いです。 参照

窓関数 サンプルデータ数 4096、スイープ時間は 10〜2000Hzまで 15秒 メインローブの幅
Hanning 矩形窓の2倍
Blackman 矩形窓の3倍
Blackman
-Harris
矩形窓の4倍


塗り潰しによる
ディップ消失が
大きい
無し(矩形) この程度のディップ
の検出だけでは、
分解能の高い
矩形窓が優秀

しかしサイドローブ
が大きく広がるので
普通は使わない

同じく、サンプルデータ数 8192 の場合
窓関数 サンプルデータ数 8192、スイープ時間は 10〜2000Hzまで 58秒
Hanning
Blackman
Blackman
-Harris
無し(矩形)

とりあえずHanning窓が最適なようです。