前節のプログラムを拡張して、移動平均の効果を見るものを作りました。
サンプリング間隔を整数にするため、横幅がスルスルと伸びますので、画面が大きくなってしまいました。
元の波形をサンプリングしたものを、配列x[]に格納し、以下の演算を行います。
平均するデータ数がN個だとすると
時系列で見ると、
x[n]は、現在入力されたデータ、x[n-1]は、ひとつ前のデータ、x[n-2]は、その又一つ前のデータ
を、表しています。
これは何か? と、言いますと
コンボリューションの一般形
の特殊な場合を、示しています。
つまり、
で、
y[n]を、N個のデータの平均で表す訳です。
プログラム的には
xn[]が、サンプリングされたデータを格納したもので、yn[]が移動平均の結果を格納するもの。
void __fastcall TForm1::MovingAV(float* xn,float* yn,int N)
{
int j,m;
for(j=0;j<2000;j++)
{
for(m=0;m<=N-1;m++)
if( (j-m>=0) && (xn[j-m]!=0) ) yn[j]+=xn[j-m];
yn[j]=yn[j]/(float)N;
}
}
こんな風です。(うまいプログラムでは、ないと思うけど..)
今、入力は3つのsin波
で、表現されたとし、この入力について、考えます。
これを見ると、移動平均数が10と、固定の時、
サンプリング周波数を増やすと、高周波が目だって来ることが解ります。
いずれの場合も、元の波形の高周波成分が減っています。
これより、移動平均する事は、ローパスフィルターの働きをする事がわかります。
移動平均の結果は、
移動平均数が10の時、
最も振幅が大きいが、高い周波数の除去が十分でない。
移動平均数が大きくなるにつれて、高周波の除去の効果が大きくなるが
振幅は、順次小さくなる。
従いまして、
移動平均数を、幾らに設定するかは、入力周波数、サンプリング周波数が関係して来るので
一概には言えないようです。
実測により決定するのが、最もよさそうですね.....
シミュレーションも、効果あるかも...
次回は、フィルターの続きで、Z変換にチャレンジするか、
それとも、DFT入門にするか
未定です。
いずれにしても、難敵ですが...( 「敵とチャウ(違う)!」ちゅうのに..(^_^;; )
H.15.6.4
.
.
This document created by Scientific Notebook 4.1. この文書は次の製品で作成しました Scientific Notebook 4.1.