FFT関数の使い方


 マイクロチップ社が提供しているC30コンパイラのDSPライブラリ関数の中には
FFTを求める関数も含まれています。
この高速フーリエ変換を行えば信号に含まれている周波数成分を簡単に分析
することができます。

【dsPIC Language Tools Libraries】

まずCコンパイラのライブラリに内蔵されているFFT関連の関数は下表のように
なっています。

変換関数 BitReverseComplex 配列の要素をビット逆列順に並べ替える
FFTComplex FFT変換を適用し、結果を指定配列へ
FFTComplexIP FFT変換を適用し、結果を上書き
TwidFactorInit FFT用に半分の回転因子を求める



【FFT関数のプログラム例】

実際にDSPライブラリのFFT関数を使ってプログラムを作成してみましょう。
例題の機能は下記のようになっています。

(1) アナログ入力ポートに入力された信号をSigIn配列に取り込む
  取り込み周期を10kHzの一定サンプリング周期とする
  タイマ3でこの周期を生成し、A/D変換を自動起動に設定している。
(2) 窓関数を適用して有限個数の影響を無くす
  128個のサンプリングデータで扱うので、端のデータの影響を無くす
  結果を同じSIgIn配列に上書き格納する
(3) 配列データを複素数に変換する
  虚数部は0として配列を構成しなおし、FFT_result配列に格納する
(4) FFT演算を実行する
  結果がFFT_result配列に格納される
(5) ビットリバースで並べ直す
  ビット逆順に並んでいるので並べ直して再度結果をFFT_resultに格納する



まず最初のデータの宣言定義の部分です。下記リストのようになっていて
FFT関数用にいくつかのデータが必要になりますが、中味はクリアするだけで
初期化部分で行います。
配列サイズはRAM容量で制限されますので、PICデバイスに合わせて用意します。





次に、タイマ3の割り込み処理関数部とメイン関数の初期化部分です。
割り込み処理ではA/Dコンバータからのデータを入力して順次配列データとして
格納しているだけです。必要数入力したら終了します。




次がメインループの部分です。まず最初のwhile文で入力が128サンプリング完了するのを
待っています。それが完了したら入力データに窓関数を適用して末端の影響を無くします。
その後、さらに複素数配列データに変換します。虚数部は0ということで単純に変換します。
その結果をFFT関数でFFT処理を実行します。結果をビット逆順に整理し直せばFFT処理
が完了です。







【FFT実行結果の確認方法】

上記プログラムでFFT関数が実行されますが、このFFT分析結果を実際に確認する
方法を説明します。
この確認には、MPLAB ICD2のデバッグ機能と、dsPICworksのグラフ表示機能を
活用します。
まず、上記プログラムのメイン内のPORTAのLED制御部分で、ICD2のブレークポイントを
かけてからプログラムを実行します。
その前に適当なアナログ信号をAN0に入力するようにしておきます。今回の例では
500Hzと1kHzの正弦波の連続信号を入力としました。

さらにMPLABのWatch窓にSigInとFFT_resultを登録しておきます。プログラム実行後、
この配列データの内容をファイルとしてExportします。

次に保存したファイルをdsPICwroksでグラフ化します。ファイルの読み込み方は簡単で、
メインメニューから File → Inport とすると下記ダイアログが開きますので、ここで下記
のようにサンプリング周期とデータ形式を指定します。
ただし、FFT_resultは横軸が周波数になりますので、数のように設定して読み込みます。




これで500Hzの正弦波入力の場合のオリジナルのSigInと窓関数適用後のSigInを
表示させると下図のようになります。
この図をみると、きれいな500Hzの正弦波が入力で、窓関数を適用すると両端の
振幅が0になるように順次振幅制限されていることがわかります。
この場合の窓関数はハニング窓関数を適用しています。




次にこのFFT実行後の波形であるFFT_resultを表示すると下図のようになります。
明らかに500Hz付近に大きなピークがあり、その上の周波数には整数倍の周波数
の部分に小さなピークがあることがわかります。そしてその振幅差が40dB以上あり
ますから、結構純度の高い500Hzの正弦波であることがわかります。
DC付近にピークがあるのは、有限個のサンプリングでFFTを実行しているためです。





同じように1kHzの正弦波で実行させたときの波形は下図のようになります。




ピークが確かに1kHz付近にあり、ほとんど同じレベルの純度の正弦波である
ことがわかります。




     目次ページへ