プログラミング練習2(移動平均)

前節のプログラムを拡張して、移動平均の効果を見るものを作りました。

MATH

サンプリング間隔を整数にするため、横幅がスルスルと伸びますので、画面が大きくなってしまいました。

1.移動平均とは?

元の波形をサンプリングしたものを、配列x[]に格納し、以下の演算を行います。

平均するデータ数がN個だとすると

MATH

MATH

時系列で見ると、

x[n]は、現在入力されたデータ、x[n-1]は、ひとつ前のデータ、x[n-2]は、その又一つ前のデータ

を、表しています。

これは何か? と、言いますと

コンボリューションの一般形

MATH

の特殊な場合を、示しています。

つまり、

MATH

で、

y[n]を、N個のデータの平均で表す訳です。

MATH

MATH

プログラム的には

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;

}

}

こんな風です。(うまいプログラムでは、ないと思うけど..)

2.どんな事が解るか?

今、入力は3つのsin波

MATH

で、表現されたとし、この入力について、考えます。

2-1.移動平均数は10で固定し、サンプリング周波数を変化させた時

MATH

MATH

これを見ると、移動平均数が10と、固定の時、

サンプリング周波数を増やすと、高周波が目だって来ることが解ります。

いずれの場合も、元の波形の高周波成分が減っています。

これより、移動平均する事は、ローパスフィルターの働きをする事がわかります。

2-2.サンプリング周波数は固定し、移動平均数を変化させた時

MATH

移動平均の結果は、

移動平均数が10の時、

最も振幅が大きいが、高い周波数の除去が十分でない。

移動平均数が大きくなるにつれて、高周波の除去の効果が大きくなるが

振幅は、順次小さくなる。

$\quad $

従いまして、

移動平均数を、幾らに設定するかは、入力周波数、サンプリング周波数が関係して来るので

一概には言えないようです。

実測により決定するのが、最もよさそうですね.....

シミュレーションも、効果あるかも...

次回は、フィルターの続きで、Z変換にチャレンジするか、

それとも、DFT入門にするか

未定です。

いずれにしても、難敵ですが...( 「敵とチャウ(違う)!」ちゅうのに..(^_^;;

H.15.6.4

.

.

This document created by Scientific Notebook 4.1. この文書は次の製品で作成しました Scientific Notebook 4.1.