FFTによる周波数解析と補間
(2015.10.6作成)
前の記事で、”FFT計算による結果の凸凹...”と書きましたが、誤解されるとまずいので少し補足しておきます。
FFT(DFTも)の計算そのものが特に問題あるわけではありません。演算精度が結果に影響するだけだと思います。
では何が凸凹をもたらしたのか?一言でいうなら、離散数値の補間の手法が原因です。
ここから先は、数学素人の話になりますので、内容の判断にご注意下さい。
自作の測定では48KHzで32768個のデータを取り込み、窓関数(ハン関数)を適用してからFFT計算をして結果(32768個の離散データ)を解析します。
≪ハン関数: 0.5 - 0.5 * cos(2nπ/N)、 (n=0,1, ... 32768: N=32768)≫
計算結果としては約1.465Hz毎の信号強度が得られることになります。歪率測定や周波数特性でプロットするための周波数は、殆どがそれの整数倍ではありませんので、得られたデータをどう利用するかが肝心になります。
前の記事で、”FFT計算による結果の凸凹...”と書きましたが、誤解されるとまずいので少し補足しておきます。
FFT(DFTも)の計算そのものが特に問題あるわけではありません。演算精度が結果に影響するだけだと思います。
では何が凸凹をもたらしたのか?一言でいうなら、離散数値の補間の手法が原因です。
ここから先は、数学素人の話になりますので、内容の判断にご注意下さい。
自作の測定では48KHzで32768個のデータを取り込み、窓関数(ハン関数)を適用してからFFT計算をして結果(32768個の離散データ)を解析します。
≪ハン関数: 0.5 - 0.5 * cos(2nπ/N)、 (n=0,1, ... 32768: N=32768)≫
計算結果としては約1.465Hz毎の信号強度が得られることになります。歪率測定や周波数特性でプロットするための周波数は、殆どがそれの整数倍ではありませんので、得られたデータをどう利用するかが肝心になります。
(注)データを補間(何らかの補正手法を適用)しないでFFTの計算値をそのまま使用する、あるいは市販やフリーで入手できるFFTツールの結果を利用すると、大体は切りの良い周波数毎のデータではないので、正確な結果(歪率特性など)は得られません。
窓関数を施してるので、整数倍の周波数の信号でも一定の分布を持った数値結果になります。
≪FFT計算結果例≫
左側の信号はおおよそ整数倍の周波数信号で、右側は13.7倍位の周波数に真のピークがありそうな信号という感じです(当然14での値をそのまま使うと真値とは異なっています)。十進BASICでサンプル数を小さくしたDFTを作り、整数倍のズレとの関係でいくつかのパターンを見比べて、それぞれのピークの形状が窓関数と概ね相似形でデータ間隔が窓関数の1/4cyc分と思ってもいいんじゃないかと適当に結論付けました。そうであれば右のようにピーク位置が半端な信号でも、最大値を挟んだ2個の値(13と15の値)の和が真のピーク値と推定できる訳です((注)このグラフは相似形を計算して作ってあります)。真のピーク値が判明すれば、実際の最大値(14の約0.9)との比率で1.465Hzの倍数からのズレが計算できるので、検出信号の周波数は1.465Hz刻みより大分正確に求められます。
~これにより低周波の周波数値でも短時間(同一のサンプリング時間: 32768/48K≒0.7sec)で正確に計測することができます。また略同一振幅で2波以上の近接周波数が合成された波形など一般的な周波数カウンターでは測定不能な信号も容易に周波数計測を行う事が出来ます。~
しかしこのインチキ(否、自己流)方式で、計算(プログラムだけのループバック:正弦波の数値=>窓関数適用=>FFT=>上記補完)だけの結果を求めると、全然フラットにはなりません(下図-赤のグラフ)。PCオーディオのループバック特性(下図-青のグラフ:赤グラフ分を補正済み)と重ねると結構凸凹が大きいです。それでプログラムのループバック特性(赤グラフ)で測定結果を補正することで、PCオーディオ(青グラフ)のような滑らかな特性曲線(高精度の結果)が得られます(よってチェビシェフフィルタ特有のf特が計測できました)。
余談ですが、近年のディジタルオーディオの出力には概ね高次チェビシェフLPフィルタが入っている(サンプリングノイズをカットするため)ので、高域はこの青グラフの様な特性になります(凸凹の数はチェビシェフフィルタの次数に比例します)。ループバック等の周波数特性でこの様なカーブが計測出来ない場合は精度が足りないか測定方法(データ補完の有無や方法など含めて)の信頼性が無いと言えます。
≪プログラム計算と、PC(HP)オーディオそれぞれのループバック特性≫
ここで前の記事の話に戻ります。
左側の信号はおおよそ整数倍の周波数信号で、右側は13.7倍位の周波数に真のピークがありそうな信号という感じです(当然14での値をそのまま使うと真値とは異なっています)。十進BASICでサンプル数を小さくしたDFTを作り、整数倍のズレとの関係でいくつかのパターンを見比べて、それぞれのピークの形状が窓関数と概ね相似形でデータ間隔が窓関数の1/4cyc分と思ってもいいんじゃないかと適当に結論付けました。そうであれば右のようにピーク位置が半端な信号でも、最大値を挟んだ2個の値(13と15の値)の和が真のピーク値と推定できる訳です((注)このグラフは相似形を計算して作ってあります)。真のピーク値が判明すれば、実際の最大値(14の約0.9)との比率で1.465Hzの倍数からのズレが計算できるので、検出信号の周波数は1.465Hz刻みより大分正確に求められます。
~これにより低周波の周波数値でも短時間(同一のサンプリング時間: 32768/48K≒0.7sec)で正確に計測することができます。また略同一振幅で2波以上の近接周波数が合成された波形など一般的な周波数カウンターでは測定不能な信号も容易に周波数計測を行う事が出来ます。~
しかしこのインチキ(否、自己流)方式で、計算(プログラムだけのループバック:正弦波の数値=>窓関数適用=>FFT=>上記補完)だけの結果を求めると、全然フラットにはなりません(下図-赤のグラフ)。PCオーディオのループバック特性(下図-青のグラフ:赤グラフ分を補正済み)と重ねると結構凸凹が大きいです。それでプログラムのループバック特性(赤グラフ)で測定結果を補正することで、PCオーディオ(青グラフ)のような滑らかな特性曲線(高精度の結果)が得られます(よってチェビシェフフィルタ特有のf特が計測できました)。
余談ですが、近年のディジタルオーディオの出力には概ね高次チェビシェフLPフィルタが入っている(サンプリングノイズをカットするため)ので、高域はこの青グラフの様な特性になります(凸凹の数はチェビシェフフィルタの次数に比例します)。ループバック等の周波数特性でこの様なカーブが計測出来ない場合は精度が足りないか測定方法(データ補完の有無や方法など含めて)の信頼性が無いと言えます。
≪プログラム計算と、PC(HP)オーディオそれぞれのループバック特性≫
ここで前の記事の話に戻ります。


