はじめまして、ZMSのいっちです。
ZMSでは開発チームの「何でも屋」ですが、特にAI・ML開発、ハードウェア開発を餌に生息しています。
技術ブログを執筆するにあたり、最初は基礎数学のおさらいをみなさんでやっていこうと思います。 センサーやカメラを扱うエンジニアにとって数学的素養は必須であると思いますので、脱落せず頑張ってついてきてください。内容は大学2・3年生程度です。
はじめに
ZMSでは、カメラを含む様々なデバイスから取得されるデータを一元的に管理し、分析し、活用できるクラウドプラットフォーム「Wisbrain®」を提供しています。
ここで言う「デバイスから取得されるデータ」とは主にセンサーデータを指していますが、赤外線遮断センサーのように1・0で判定するタイプ、濃度センサーや温度計のようなアナログ値を電圧変換するタイプ、センサー内部で演算処理を行い、演算結果をI2C,SPIのようなプロトコルでデジタルデータを伝送するタイプなど、多くの種類のデバイスがあります。
これらデバイス内部では大抵アナログのセンサー素子が使われています。センサー素子から得られる信号は単発的な離散信号、値が刻々変化する連続信号、ノイズに埋もれた微弱信号などがあり、常に綺麗なデータを測定できる保証はありません。またノイズはセンサー素子以外の途中経路からでも容易に重畳してきます。したがってセンサー素子を扱う際には、何かしらの信号処理は常にセットで考えないといけません。
これから数回にわたりアナログ信号およびデジタル信号の数学的解釈を通じて、この信号処理を深く学んでいきたいと思います。
サンプリング定理
ボクたちがアナログセンサーを使って何かしらの事象を観測したい時、例えば温度湿度や電気伝導度などを計測する場合、センサーの出力がアナログの電圧であることが多いです。これらのセンサーの出力電圧を計測する場合、大抵はA/Dコンバータでアナログ値をデジタル値に直して取得します。
そこで問題です。あるA/Dコンバータで未知の電気信号の信号波形を知りたいとします。どのような間隔で測定すればよいでしょうか?
まず、サンプリング周波数9Hzで測定した波形が次の図ですが、これを見ると1Hzの信号のようにも見えます。
次に、サンプリング周波数10Hzで測定した波形を次に示します。
なんと、波形がなくなってしまいました。正解は結局どのような波形だったのでしょうか?
正解は10Hzの信号でした。
未知の信号は連続的に変化するアナログ信号ですが、その波形を一定の時間間隔で測定(標本化ともいいます。)するため、その測定周期の差で観測データが大きく異なってしまうことがあります。この測定周期と元の信号の関係性について下記のような標本化定理があり、これを「シャノン・染谷のサンプリング定理」と呼んでいます。
連続時間信号x(t)の帯域がΩcに制限されている場合、サンプリング周波数Ωs=2π/TsがΩs > 2Ωcを満たすとき、サンプリング後の離散時間信号xd[n]=x(t)|t=nTsから元の信号x(t)を完全に復元可能である
つまり未知の信号の2倍以上の周波数で観測すればよいので、サンプリング周波数20Hzで測定した波形を示します。
元の信号と同じ波形が得られました。 このサンプリング定理は、信号処理を行う上で基礎となる最も重要な定理です。覚えておきましょう。次回の後半で出てきます(笑)
もちろん未知の信号の周波数がわからない段階でサンプリング周波数を決定することは無理です。実験段階であれば測定器の最大周波数から観測するでしょうし、運用段階であれば未知とは言っても周波数のアタリはつくはずなので、問題になることは少ないでしょう。
ただし、サンプリング周波数を超えた周波数成分が未知の信号に含まれていた場合には、その信号はノイズとなって復元した信号に重畳します。これをエイリアシング(折り返し雑音)といいます。これも重要な項目ですので覚えておきましょう。 (波形を観測するような測定器にはアナログフィルタ等のアンチエイリアシング機能があるので測定結果がノイズに埋もれることはありません。)
時間領域と周波数領域
電気信号、音声、電波など刻々と変化する信号は時間領域で変化する信号ですので横軸を時間、縦軸を信号の強度(振幅)でプロットすることができます。 また、これらの信号を周波数領域で変化する信号として横軸を周波数にしてプロットすることも可能です。周波数毎にどれだけの信号強度を持っているかのグラフです。これをスペクトラムと呼びます。
この2つのグラフ(時間領域で変化する信号と周波数領域で変化する信号)は相互に変換することができます。 後述するフーリエ変換により、時間領域から周波数領域に変換できます。また逆フーリエ変換により周波数領域から時間領域に戻すことも可能です。
ちなみに、80年代のミニアンプには上記のようなイコライザが搭載されていました。見たことある人、あーこんなの持ってたって言う人いるかも知れません。これがまさに横軸周波数、縦軸振幅を表現した周波数領域でのスペクトルそのものです。
この相互変換は、画像処理にも使用されています。画像データをフーリエ変換により周波数領域のデータに変換し、不要な周波数成分をフィルターによりカットし、逆フーリエ変換により時間領域の画像に戻すことで画像の鮮明化等の処理が簡単にできます。
フーリエ級数展開
ここで、周期的に同じ波形が出現する「周期関数」を考えます。 あらゆる周期関数は、ディリクレ境界条件を満たす場合に、その周期の整数倍のsin,cos波の合成波で近似できます。 この周期的な信号f(t)の周期をT0とします。この信号f(t)はsin(x)とcos(y)の三角関数の和なので下記の式が成り立ちます(導出過程は省略します)
ここでΩ0=2π/T0とすれば、
と書き直せます。このΩ0を基本角周波数といい、a0、ak、bkをフーリエ係数といいます。
オイラーの公式による複素数でのフーリエ級数
前章で周期関数を三角関数の無限和で表すことを示しましたが、そもそも三角関数使いにくいですよね。 ここでオイラーの式で書き直してみます。
オイラーの式は以下のような恒等式です。
下記の複素平面の極座標において、偏角θで原点からの距離1にある点を示す複素数ejθは、cosθ+j sinθに等しくなります。
このオイラーの式を変形しフーリエ級数の式に代入すると、最終的にフーリエ級数は次の式で表すことができます。
ここで、Fkは複素数におけるフーリエ係数です。 左の時間領域の連続信号が、右の周波数領域のスペクトル信号に変換されています。
- 連続時間での信号波形に含まれる周波数成分を、その周波数ごとのスペクトルに分解する
- スペクトルの角周波数は、基本角周波数Ω0の整数倍
- スペクトルの高さ=フーリエ係数の絶対値|Fk| (これをパワースペクトルと呼びます)
- 複素数におけるフーリエ係数Fkには振幅と位相情報が含まれます(フーリエ級数では、振幅情報はa0、位相情報はak、bkで表していました。)
フーリエ変換
これまで扱ってきた信号は「周期的」であり、フーリエ級数は周期的関数が前提となっています。 しかし現実にある信号はほとんどが非周期的ですので、フーリエ級数の考え方を現実の信号にあわせて拡張しなくてはいけません。
まず、従前の周期的関数からフーリエ級数を求めた図を再掲します。この左側の周期的関数を1周期分間引きして無信号とした「周期的信号」を考えます。間引いても周期的関数ではあるので、同様にフーリエ級数を求めるとスペクトル間隔が半分になった信号が得られます。
同様に間引きする間隔を増やし、最終的に1周期の信号のみからフーリエ級数を求めていきます。どんどんスペクトル信号の間隔が狭くなり、極限的にはスペクトルの集合が富士山のような1つの山状の連続信号になると考えられます。
つまり「周期的な信号からフーリエ級数を求める問題」を、非周期的な信号から求める問題に拡張することは、フーリエ級数の周期T0→∞の極限を取る問題に帰着します。時間の関数 f(t)を、角周波数Ωの関数F(Ω)に変換することをフーリエ変換といいます。 逆に、角周波数Ωの関数F(Ω)から元の関数 f(t)を導くことを逆フーリエ変換といいます。導出過程は省略しますが、最終的にフーリエ変換は次式で求められます。
逆フーリエ変換は次式で求められます。
まとめ
一般的に周期的な信号は、基本周波数の整数倍の正弦波を無限に加えることで近似できます。(フーリエ級数展開) そして周期的・非周期的に関わらず時間領域で変化する信号は周波数領域で変化する信号と相互変換可能です。その変換手法としてフーリエ変換・逆変換を導出しました。
次回以降は、離散信号も同様にフーリエ変換・逆変換することが可能であり、サンプリング定理を満足した場合に離散的なサンプリングデータから元の連続信号を完全に復元できることを示したいと思います。