サイトのタイトル

OSD

アナログ入力をFFT解析してグラフ表示する手順 (2/5)

サンプリング

ここでは5kHzまで観測できるようにサンプリング周波数を10kHzにします
サンプル数は4096個としておよそ0.5秒間のサンプリングすることにします
また、必要に応じてアナログ入力にフィルタをかけますが、ここではハイパスフィルタを使って1kHz以下の周波数をカットしてからFFTの計算をしてみます

手順1:高速アナログユニットの設定

  • 1-1. ユニット追加

    画像クリックで大きくなります

  • CPUラックに高速アナログユニット(NX-HAD401)を追加します

  • 1-2. サンプリング数の設定

  • ユニットに設定を開いて「サンプリング数設定」を20個に変更します

  • 1-3. I/O割付設定の編集

  • [I/O割付設定の編集]を開いて、タスク周期がデフォルトの2msのまま使うとして
    サンプリング数=20
    サンプリング周期=100us
    サンプリング周波数=10kHz
    確認して[I/Oエントリを更新]ボタンを押して、[適用]を押してから[OK]ボタンを押します

  • 1-4. I/Oマップの編集

  • I/Oマップを開いて「Ch1 Analog1 Input Value 1-10」と「Ch1 Analog1 Input Value 11-20」を右クリックしてデバイス変数生成を実行します

手順2:アナログの値にフィルタをかけて配列に入れる

  • 2-1. アナログの値の取り込み

  • 内部変数 AnalogInputData[20] を作成して
    N1_Ch1_Analog_Input_Value_1_10とN1_Ch1_Analog_Input_Value_11_20をAnalogInputDataにREAL型にキャスト(型変換)しながら格納していきます

  • 2-2. ハイパスフィルタをかける

  • ファンクションにHPFファンクションをアナログフィルタのサンプルからコピーしておきます
    次に、内部変数に下記の変数を作成します
    cnt UINT
    buf REAL[4]
    AnalogFileteInput LREAL[20]

    2-1で配列に入れたアナログ入力データを先頭からハイパスフィルタを通してAanalogFilterInputの配列に格納します
    サンプリング周波数は10kHz、カットオフ周波数は100Hzとします

手順3:FFT演算処理

  • 3-1. アナログ値をFFT用の配列へ保存

  • グローバル変数 FFTData[4096] を作成して、ここへFFT演算用データを保存することにします
    FFTStartフラグがONで自己保持してデータ保存中はFFTRunフラグをONにします
    FFTRun中は1スキャンで取得できるアナログデータ20個をFFTDataの配列に順番に入れていきます
    FFTDataCntが4096になったらデータの準備が整ったのでFFTDataSetFlgをONにしてFOR文を抜けます

  • 3-2. プログラム追加

  • ファンクションにFFTファンクションをFFTのサンプルからコピーしておきます
    FFTは演算に時間がかかるのでイベントタスク用のプログラムを追加してFFT演算をするようにします(ここではProgram1)
    プライマリタスクや定周期タスクの空き時間を利用してイベントタスクは実行されるので、FFTの演算が完了したことを知らせるためにグローバル変数CalcFinをONにします

  • 3-3. イベントタスクの追加

  • タスク設定で[+]ボタンでタスクを追加してタスクタイプをイベントタスク(優先度8)または(優先度48)を選択します

  • 3-4. プログラムの割付設定

  • プログラムの割付設定でEventTask0の[+]を押して追加したプログラム(Program1)を設定します

  • 3-5. イベントタスクの起動

  • メインのプログラム(Program1)でFFTDataSetFlgがONになったらデータが揃ったということでイベントタスクをActEventTaskで起動します
    イベントタスクが実行中は自己保持回路が保持している状態なのでFFTRunはONしています
    イベントタスクのFFT演算が終わったらCalcFinがONするのでFFTEndをONして自己保持を切ります
    CalcFinフラグをOFFすることを忘れないでください
    PowerSpectrumDataの配列は8192個ありますが、FFTの入力データが4096個なのでその半分の2048個にFFT演算結果が入っています
    2048以降のデータは無視してください

  • 3-6. 動作確認

  • プログラムが完成したので動作確認します
    Program0のFFTStartをONにするとFFT演算を開始し、演算中はFFTRunがONして完了するとFFTEndがONしてFFTRunがOFFします

    これでFFTの演算データが獲得できました
    10kHzで4096個のデータを取ったので、0~5kHzの2048個のデータが出来たので、5kHz/2048=2.44Hzの分解能のデータが配列に入っていることになります

  • 3-6. 実行時間の確認

  • プライマリタスクのタスク実行時間はFFTの演算の影響を受けていないことを確認します
    ちなみに、サンプルではFFTの演算をしているEventTask0の実行時間は11.649msとなっています

次のページは

FFTの演算結果はPowerSpectrumDataの配列に入りました
次のページでは、このデータを分かりやすいように表示器でグラフ表示します