があらんどう

伽藍洞です。

フーリエ変換を利用したローパスフィルタ@Labview

取得した信号にフィルタをかけてノイズを除去したい場面はしばしば登場する。

電気信号だとローパスフィルタやハイパスフィルタを回路で組むわけだが、信号を取得してしまえば電気・電子回路では考えないられないくらい急峻な特性をもつフィルタを作成することが可能となる。

 

信号取得の速度(AD変換レート)とかで取得できる信号に限界はあるだろうが、ある特定のノイズ(ACノイズとか)があるときは強力な方法になると思う。

例えば10Hz以下の周波数の電気信号をみたいときにACノイズが邪魔になると電気的なローパスフィルタで除くのは結構骨が折れるのではないかと思う。しかし、以下の手法では比較的簡単かつ効果的だ。

 

方法の概略としては

信号取得

  ↓

フーリエ変換

  ↓ 

フィルタリング

  ↓ 

フーリエ変換

となる。

 

上のようなプログラムをLabviewで作製してみた。

 

以下がプログラムの全体像。

備忘録的に以下内容解説。

 

 

ココからは下図のようにA~Dのブロックに区切って説明していく。

f:id:calciummm:20210628182251p:plain

 

A.信号生成

今回、信号は適当にテスト用の波形を作る形にした。実際使用するときはアナログ信号の取得に置き換わるだろう。あるいはテキストやcsvデータの読み込みでもいい。

今回作成したテストデータは50Hzと200Hzに対応する正弦波を重ねただけの単純なもの。

 作成した波形を見るとこんな感じ。f:id:calciummm:20210630111511p:plain

二つの周波数が重ね合わせられているのが見てとれる。 

 

B.フーリエ変換

Aで作成した1D配列をフーリエ変換FFT)に入力。これでFFTされる、簡単。変換後のデータを見るために振幅と位相を計算する。FFTから出力された複素数z=z_r + z_iとすると

振幅  \sqrt{z_r^2+z_i^2}

位相 \arctan{\left(\frac{z_i}{z_r}\right)}

として計算できる。

これはブロックダイアグラムでいいうところの右上部分に該当する。

出力は以下のようになった。

f:id:calciummm:20210630112813p:plain

 振幅のグラフの50Hzと200Hzのところにピークがたっていることから問題なく変換できているのだろうと思われる。

 

C:ローパスフィルタ

このプログラムの心臓部とも言えるところ。

色々やり方はあるだろうが、今回はFFTの出力の複素1D配列の要素数と同じ要素数の複素1D配列を準備する。

その配列の中身を

カットオフ周波数以下の場合 1+0i

カットオフ周波数以上の場合 0+0i

とする。

この配列をFFTの出力に掛け算することでローパスフィルタとした。

カットオフを145Hzにして動作させたときの振幅と位相は

f:id:calciummm:20210630113915p:plain

こんな感じ。200Hzの信号がカットされているのが見て取れる。

 

D.逆フーリエ変換

 これも逆FFTに配線するだけのお手軽仕様。入力する配列の形式を選ぶところがあるが、これは今回は1D複素数を選択。

カットオフ145Hzでの出力は以下。

f:id:calciummm:20210630114252p:plain

きれいに200Hzの信号がカットできてることがわかる。

 

 

こんな感じですごくお手軽にローパスフィルタを組むことができる。

光や電気信号では考えられないほどシャープな特性を簡単に作成できちゃうのはうれしい。

Cの部分の配線を入れ替えるだけでハイパスフィルタにできるし、変更を加えればバンドパスやノッチフィルターも可能。

もっと作りこめばそれら複数を組み合わせることもできる。