Filtering Data Digital Menggunakan Metode MOVING AVERAGE

Moving average adalah teknik  analisa data sehingga menghasilkan serangkaian nilai rata – rata dari bagian data dari seluruh data yang ada.  Ehmm pasti bingung sebenarnya sih simple kalau lihat penjelasan nantinya.

Nama lain dari metode ini adalah Moving Means atau Rolling Means, tapi efek dari perhitungan ini yang menarik ,langsung aja lihat penjelasan di bawah :

Misal kita memiliki 12 data yang mau kita buat moving averagenya 

3 3 6 5 5 6 6 7 7 9 8 8

dan kita akan memakai 3 nilai yang akan di rata2  catatan : bisa lebih dari 3 tergantung kebutuhan dan kecepatan sampling data jangan terlalu besar nanti akan merusak data aslinya dan jangan terlalu sedikit nanti tidak terlihat dampaknya

 

 

A = (3+3+6)/3

B = (3+6+5)/3

C = (6+5+5)/3

D = (5+5+6)/3

E = (5+6+6)/3

F = (6+6+7)/3

G = (6+7+7)/3

H = (7+7+9)/3

I = (7+9+8)/3

J = (9+8+8)/3

K = (8+8)/2

L = 8/1

 

Jadi data baru akan terdiri dari 12 nilai baru hasil hitungan di atas

A,B,C,D,E,F,G,H,I,J,K,L

Nah itu baru 12 data saja bayangkan jika ada ribuan data di perlakuakn sama seperti itu efeknya akan terlihat seperti gambar di bawah ini :



Itulah efeknya jika dengan data yang sangat banyak

Berikut adalah listing yang saya buat di delphi :

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart;

type

  TForm1 = class(TForm)

    Chart1: TChart;

    Series1: TLineSeries;

    Button1: TButton;

    Button2: TButton;

    Chart2: TChart;

    Series2: TLineSeries;

    OpenDialog1: TOpenDialog;

    Button3: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure Button3Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

  l: double;

  bool,bool1: boolean;

  F,F1: TextFile;

  s: string;

  bw,rg: real;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

var

   d: byte;

   e: real;

begin

l:=0;

if opendialog1.Execute then

begin

if bool = true then

begin

CloseFile(F);

AssignFile(F, opendialog1.FileName);

reset(F);

readln(F,s);

bw:= strtofloat(s);

readln(F,s);

rg:= strtofloat(s);

 

    while not eof(F) do

      begin

        readln(F,s);

        d:= strtoint(s);

        e:=((rg/255)*d)+bw;

        l:= l + 1;

        series1.AddXY(l,e);

      end;

end;

 

if bool = false then

begin

AssignFile(F, opendialog1.FileName);

reset(F);

readln(F,s);

readln(F,s);

bw:= strtofloat(s);

readln(F,s);

rg:= strtofloat(s);

bool:= true;

 

    while not eof(F) do

      begin

        l:= l + 1;

        readln(F,s);

        d:= strtoint(s);

        e:=((rg/255)*d)+bw;

        series1.AddXY(l,e);

      end;

end;

chart1.LeftAxis.Maximum:= bw+rg;

chart1.LeftAxis.Minimum:= bw;

end;

end;

 

procedure TForm1.Button2Click(Sender: TObject);

var

   d: byte;

   e,d1: real;

   tik,tik1 : Integer;

   olah : array of integer;

begin

l:=0;

SetLength(olah, 5);

 

if opendialog1.Execute then

begin

if bool1 = true then

begin

CloseFile(F1);

AssignFile(F1, opendialog1.FileName);

reset(F1);

readln(F1,s);

bw:= strtofloat(s);

readln(F1,s);

rg:= strtofloat(s);

tik := 1;

    while not eof(F1) do

      begin

        readln(F1,s);

        //d:= strtoint(s);

        //e:=((rg/255)*d)+bw;

        l:= l + 1;

        inc (tik);

        //series2.AddXY(l,e);

      end;

reset(F1);

readln(F1,s);

readln(F1,s);

//mulai di hitung

for tik1 := 1 to (tik + 5) do

  begin

    if tik1 < 6 then  //sampai 5 saja

      begin

        readln(F1,s);

        d:= strtoint(s);

        olah[tik1-1] := d;

      end;

    if tik1 = 5 then  //sampai 5

      begin

        d1 := (olah[0] + olah[1] + olah[2] + olah[3] + olah[4])/5;

        e:=((rg/255)*d1)+bw;

        series2.AddXY(tik1-4,e);

      end;

    if (tik1 > 5) and (tik1 <= tik) then

      begin

        readln(F1,s);

        d:= strtoint(s);

        olah[0] := olah[1];

        olah[1] := olah[2];

        olah[2] := olah[3];

        olah[3] := olah[4];

        olah[4] := d;

        d1 := (olah[0] + olah[1] + olah[2] + olah[3] + olah[4])/5;

        e:=((rg/255)*d1)+bw;

        series2.AddXY(tik1-4,e);

      end;

    if tik1 > tik then

      begin

        olah[0] := olah[1];

        olah[1] := olah[2];

        olah[2] := olah[3];

        olah[3] := olah[4];

        d1 := (olah[0] + olah[1] + olah[2] + olah[3] + olah[4])/(tik1-tik);

        e:=((rg/255)*d)+bw;

        series2.AddXY(tik1-4,e);

      end;

  end;

 

end;

 

if bool1 = false then

begin

AssignFile(F1, opendialog1.FileName);

reset(F1);

readln(F1,s);

readln(F1,s);

bw:= strtofloat(s);

readln(F1,s);

rg:= strtofloat(s);

bool:= true;

tik := 1;

    while not eof(F1) do

      begin

        readln(F1,s);

        //d:= strtoint(s);

        //e:=((rg/255)*d)+bw;

        l:= l + 1;

        inc (tik);

        //series2.AddXY(l,e);

      end;

reset(F1);

readln(F1,s);

readln(F1,s);

//mulai di hitung

for tik1 := 1 to (tik + 5) do

  begin

    if tik1 < 6 then  //sampai 5 saja

      begin

        readln(F1,s);

        d:= strtoint(s);

        olah[tik1-1] := d;

      end;

    if tik1 = 5 then  //sampai 5

      begin

        d1 := (olah[0] + olah[1] + olah[2] + olah[3] + olah[4])/5;

        e:=((rg/255)*d1)+bw;

        series2.AddXY(tik1-4,e);

      end;

    if (tik1 > 5) and (tik1 <= tik) then

      begin

        readln(F1,s);

        d:= strtoint(s);

        olah[0] := olah[1];

        olah[1] := olah[2];

        olah[2] := olah[3];

        olah[3] := olah[4];

        olah[4] := d;

        d1 := (olah[0] + olah[1] + olah[2] + olah[3] + olah[4])/5;

        e:=((rg/255)*d1)+bw;

        series2.AddXY(tik1-4,e);

      end;

    if tik1 > tik then

      begin

        olah[0] := olah[1];

        olah[1] := olah[2];

        olah[2] := olah[3];

        olah[3] := olah[4];

        d1 := (olah[0] + olah[1] + olah[2] + olah[3] + olah[4])/(tik1-tik);

        e:=((rg/255)*d)+bw;

        series2.AddXY(tik1-4,e);

      end;

  end;

end;

chart2.LeftAxis.Maximum:= bw+rg;

chart2.LeftAxis.Minimum:= bw;

end;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

bool := False;  bool1 := False;

end;

 

procedure TForm1.Button3Click(Sender: TObject);

begin

series1.Clear;

series2.Clear;

l:= 0;

if bool = true then

begin

CloseFile(F);

bool:= false;

end;

if bool1 = true then

begin

CloseFile(F1);

bool1:= false;

end;

end;

 

end.

 

Bagian moving averagenya adalah ini :

for tik1 := 1 to (tik + 5) do

  begin

    if tik1 < 6 then  //sampai 5 saja

      begin

        readln(F1,s);

        d:= strtoint(s);

        olah[tik1-1] := d;

      end;

    if tik1 = 5 then  //sampai 5

      begin

        d1 := (olah[0] + olah[1] + olah[2] + olah[3] + olah[4])/5;

        e:=((rg/255)*d1)+bw;

        series2.AddXY(tik1-4,e);

      end;

    if (tik1 > 5) and (tik1 <= tik) then

      begin

        readln(F1,s);

        d:= strtoint(s);

        olah[0] := olah[1];

        olah[1] := olah[2];

        olah[2] := olah[3];

        olah[3] := olah[4];

        olah[4] := d;

        d1 := (olah[0] + olah[1] + olah[2] + olah[3] + olah[4])/5;

        e:=((rg/255)*d1)+bw;

        series2.AddXY(tik1-4,e);

      end;

    if tik1 > tik then

      begin

        olah[0] := olah[1];

        olah[1] := olah[2];

        olah[2] := olah[3];

        olah[3] := olah[4];

        d1 := (olah[0] + olah[1] + olah[2] + olah[3] + olah[4])/(tik1-tik);

        e:=((rg/255)*d)+bw;

        series2.AddXY(tik1-4,e);

      end;

  end;

 

end;

 

saya menggunakan 5 nilai yang di rata2 dan menghasilkan seperti gambar  tadi , bagus kan hanya dengan cara yang sederhana bisa menghasilkan efek seperti itu dan hebatnya hal ini bisa di terapkan pada mikrokontroller agar bisa memfilter data sebelum di kirim berikut adalah project delphi yang bisa di download berserta sourcecodenya, disini

 

selamat ber-innovasi  semoga mikrodb.com selalu bisa menyediakan ide-ide segar

 

Comments   

0 #1 service. 2016-03-13 18:32
EasySMS world-wide-web API means that you can develop software which could send out
TEXT MESSAGE. Worrk with common internmet languages too
buuld purposes which convgerse with worldwide TXT carriers.
You don't need too bother about difficult SMPP hosting space or hosting TXT
servers. Merely send out us your currednt communication utilizing each of our thoroughly
clean apparent API phone calls and we will deliver the idea for yyou rapidly in addition to mail people returning confirmations
as well as replies.

EasySMS is usually a boss operating textig alternatives. Their particular reputation is
built upon complex experience, industry knowledge,
quality assist and also program reliability. From large TEXT MESSAGE
and also comnputer SMS to be able to SMS API gateways.
Quote

Add comment


Security code
Refresh