l1 unit main; sysutils, windows, messages, classes...

66
L1 unit Main; interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Menus; type TMainForm = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Panel1: TPanel; Label1: TLabel; Label2: TLabel; Timer1: TTimer; time: TLabel; Label3: TLabel; procedure Timer1Timer(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Label3Click(Sender: TObject); end; var MainForm: TMainForm; implementation uses sound1,database1,editordb,absen; {$r *.dfm} procedure TMainForm.Timer1Timer(Sender: TObject); begin time.Caption:=FormatDateTime('DD-MMM-YY HH:nn:SS',Now); end; procedure TMainForm.Button4Click(Sender: TObject); begin Application.Terminate; end;

Upload: trinhphuc

Post on 08-Mar-2019

224 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L1

unit Main; interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Menus; type TMainForm = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Panel1: TPanel; Label1: TLabel; Label2: TLabel; Timer1: TTimer; time: TLabel; Label3: TLabel; procedure Timer1Timer(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Label3Click(Sender: TObject); end; var MainForm: TMainForm; implementation uses sound1,database1,editordb,absen; {$r *.dfm} procedure TMainForm.Timer1Timer(Sender: TObject); begin time.Caption:=FormatDateTime('DD-MMM-YY HH:nn:SS',Now); end; procedure TMainForm.Button4Click(Sender: TObject); begin Application.Terminate; end;

Page 2: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L2

procedure TMainForm.Button2Click(Sender: TObject); begin soundform.ShowModal; end; procedure TMainForm.Button1Click(Sender: TObject); begin databas.ShowModal; end; procedure TMainForm.Button3Click(Sender: TObject); begin absensi.ShowModal; end; procedure TMainForm.Label3Click(Sender: TObject); begin ShowMessage('Program Aplikasi Absensi Pengenalan suara'#13#13+ ' Ashadi Salim D4028'#13+ ' Djunaidy Santoso D0533'#13+ ' Genbit Yasbil 0500602895'#13#13+ ' copyright(C)MR 2006' ); end; end. ------------------------------------------------------------------------------------------------------- unit database1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Buttons, DB, Grids, DBGrids, ADODB; type Tdatabas = class(TForm) Panel1: TPanel; Label1: TLabel; Button4: TButton; DBGrid1: TDBGrid; Button5: TButton; Label2: TLabel; ADOTable1: TADOTable; DataSource1: TDataSource; ADOTable1ID: TWideStringField;

Page 3: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L3

ADOTable1Nama: TStringField; ADOTable1Alamat: TStringField; ADOTable1Tgl_lahir: TDateTimeField; Button1: TButton; procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var databas: Tdatabas; implementation {$R *.dfm} uses editordb,vewab; procedure Tdatabas.Button4Click(Sender: TObject); begin Close; end; procedure Tdatabas.Button5Click(Sender: TObject); begin Close; dbeditor.showmodal; end; procedure Tdatabas.Button1Click(Sender: TObject); begin viewabs.ShowModal; end; end. ------------------------------------------------------------------------------------------------------- unit vewab; interface uses

Page 4: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L4

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls; type Tviewabs = class(TForm) Button1: TButton; DataSource1: TDataSource; DBGrid1: TDBGrid; ADOTable1: TADOTable; ADOTable1Tgl: TDateTimeField; ADOTable1ID: TWideStringField; ADOTable1masuk: TWideStringField; ADOTable1keluar: TWideStringField; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var viewabs: Tviewabs; implementation {$R *.dfm} procedure Tviewabs.Button1Click(Sender: TObject); begin Close; end; end. ------------------------------------------------------------------------------------------------------- unit editordb; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, DBCtrls, StdCtrls, Mask, DB, ADODB, ComCtrls; type Tdbeditor = class(TForm) Button1: TButton;

Page 5: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L5

DBNavigator1: TDBNavigator; Panel1: TPanel; DataSource1: TDataSource; ADOTable1: TADOTable; ADOTable1ID: TWideStringField; ADOTable1Nama: TStringField; ADOTable1Alamat: TStringField; ADOTable1Tgl_lahir: TDateTimeField; Panel2: TPanel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label4: TLabel; DBEdit1: TDBEdit; DBEdit2: TDBEdit; DBEdit3: TDBEdit; DateTimePicker1: TDateTimePicker; procedure Button1Click(Sender: TObject); procedure ADOTable1AfterScroll(DataSet: TDataSet); private { Private declarations } public { Public declarations } end; var dbeditor: Tdbeditor; implementation {$R *.dfm} procedure Tdbeditor.Button1Click(Sender: TObject); begin Close; //databas.ShowModal; end; procedure Tdbeditor.ADOTable1AfterScroll(DataSet: TDataSet); begin DateTimePicker1.DateTime:=ADOTable1Tgl_lahir.Value; end; end. ------------------------------------------------------------------------------------------------------- unit sound1;

Page 6: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L6

interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Buttons, DB, ADODB, Mask, DBCtrls,wave; type Tsoundform = class(TForm) SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; addbutton: TButton; delButton: TButton; playButton: TButton; Button4: TButton; Panel1: TPanel; Label1: TLabel; Label2: TLabel; DataSource1: TDataSource; ADOTable1: TADOTable; ADOTable1ID: TWideStringField; ADOTable1rec1: TBooleanField; ADOTable1rec2: TBooleanField; ADOTable1rec3: TBooleanField; ComboBox1: TComboBox; Wave1: TWave; Label3: TLabel; Edit1: TEdit; konek: TADOConnection; ADOCommand1: TADOCommand; ADOTable2: TADOTable; ADOTable2ID: TWideStringField; ADOTable2Nama: TStringField; DataSource2: TDataSource; ADODataSet1: TADODataSet; procedure Button4Click(Sender: TObject); procedure addbuttonClick(Sender: TObject); procedure delButtonClick(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); procedure playButtonClick(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); procedure SpeedButton3Click(Sender: TObject); procedure ComboBox1Select(Sender: TObject); procedure konekAfterConnect(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormActivate(Sender: TObject);

Page 7: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L7

private { Private declarations } public { Public declarations } end; var soundform: Tsoundform; count,nb,posw,conf : Integer; nf:String; CommandText: WideString; implementation {$R *.dfm} uses tambahw; procedure Tsoundform.Button4Click(Sender: TObject); begin Close; end; procedure Tsoundform.addbuttonClick(Sender: TObject); var posisi:String; begin if count=3 then begin ShowMessage('File Wave Penuh'); end else begin if(ADOTable1rec1.Value=false) then posw:=1 else if(ADOTable1rec2.Value=false) then posw:=2 else if(ADOTable1rec3.Value=false) then posw:=3; addwave.ShowModal; conf:=1; if (conf=1) then begin posisi:=ADOTable1.Bookmark; nf:=ADOTable1['Id']; ADOCommand1.CommandText:='update sound set rec'+inttostr(posw)+'=1 '+' WHERE id='+quotedStr(nf); ADOCommand1.Execute; ADOTable1.Active:=false; ADOTable1.Active:=true;

Page 8: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L8

try ADOTable1.Bookmark:=posisi; except ADOTable1.MoveBy(ADOTable1.RecordCount); end;

wave.mono('c:\bahan\project\wave\'+ ADOTable1ID.Value +inttostr(posw)+'.wav');

ShowMessage('file suara '+ADOTable1ID.Value+' ke '+inttostr(posw)+' sudah direkam' ); count:=0; if ADOTable1rec1.Value=true then begin SpeedButton1.Enabled:=true; count:=count+1; end else SpeedButton1.Enabled:=false; if ADOTable1rec2.Value=true then begin SpeedButton2.Enabled:=true; count:=count+1; end else SpeedButton2.Enabled:=false; if ADOTable1rec3.Value=true then begin SpeedButton3.Enabled:=true; count:=count+1; end else SpeedButton3.Enabled:=false; end; end; end; procedure Tsoundform.delButtonClick(Sender: TObject); var posisi:String; begin If (SpeedButton1.flat=false) and (SpeedButton2.flat=false) and (SpeedButton3.flat=false) then begin ShowMessage('Tidak ada wave yang dipilih'); end else begin posisi:=ADOTable1.Bookmark; nf:=ADOTable1['Id'];

Page 9: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L9

ADOCommand1.CommandText:='update sound set rec'+inttostr(nb)+'=0 '+' WHERE id='+quotedStr(nf); ADOCommand1.Execute; ADOTable1.Active:=false; ADOTable1.Active:=true; DeleteFile('c:\bahan\project\wave\'+nf+inttostr(nb)+'.wav'); try ADOTable1.Bookmark:=posisi; except ADOTable1.MoveBy(ADOTable1.RecordCount); end; ShowMessage('file suara '+ADOTable1ID.Value+' ke '+inttostr(nb)+' sudah didelete' ); count:=0; SpeedButton1.Flat:=True; SpeedButton2.Flat:=True; SpeedButton3.Flat:=True; if ADOTable1rec1.Value=true then begin SpeedButton1.Enabled:=true; count:=count+1; end else SpeedButton1.Enabled:=false; if ADOTable1rec2.Value=true then begin SpeedButton2.Enabled:=true; count:=count+1; end else SpeedButton2.Enabled:=false; if ADOTable1rec3.Value=true then begin SpeedButton3.Enabled:=true; count:=count+1; end else SpeedButton3.Enabled:=false; end; end; procedure Tsoundform.playButtonClick(Sender: TObject); var posisi:String; begin If (SpeedButton1.flat=true) and (SpeedButton2.flat=true) and (SpeedButton3.flat=true) then begin ShowMessage('Tidak ada wave yang dipilih');

Page 10: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L10

end else begin if(FileExists('c:\bahan\project\wave\'+ADOTable1ID.Value+inttostr(nb)+'.wav')) then begin wave1.FileName:=('c:\bahan\project\wave\'+ADOTable1ID.Value+inttostr(nb)+'.wav'); Wave1.PlayWave; end else begin nf:=ADOTable1['Id']; posisi:=ADOTable1.Bookmark; ShowMessage('File wave tidak ditemukan, record dihapus'); ADOCommand1.CommandText:='update sound set rec'+inttostr(nb)+'=0 '+' WHERE id='+quotedStr(nf); ADOCommand1.Execute; ADOTable1.Active:=false; ADOTable1.Active:=true; ADOTable1.Bookmark:=posisi; SpeedButton1.Flat:=True; SpeedButton2.Flat:=True; SpeedButton3.Flat:=True; if ADOTable1rec1.Value=true then begin SpeedButton1.Enabled:=true; count:=count+1; end else SpeedButton1.Enabled:=false; if ADOTable1rec2.Value=true then begin SpeedButton2.Enabled:=true; count:=count+1; end else SpeedButton2.Enabled:=false; if ADOTable1rec3.Value=true then begin SpeedButton3.Enabled:=true; count:=count+1; end else SpeedButton3.Enabled:=false; end; end; end; procedure Tsoundform.SpeedButton1Click(Sender: TObject);

Page 11: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L11

begin if SpeedButton1.flat=true then begin SpeedButton1.Flat:=false;nb:=1; SpeedButton2.Flat:=true; SpeedButton3.Flat:=true; end else begin SpeedButton1.flat:=true; end end; procedure Tsoundform.SpeedButton2Click(Sender: TObject); begin if SpeedButton2.flat=true then begin SpeedButton2.Flat:=false;nb:=2; SpeedButton1.Flat:=true; SpeedButton3.Flat:=true; end else begin SpeedButton2.flat:=true; end end; procedure Tsoundform.SpeedButton3Click(Sender: TObject); begin if SpeedButton3.flat=true then begin SpeedButton3.Flat:=false;nb:=3; SpeedButton2.Flat:=true; SpeedButton1.Flat:=true; end else begin SpeedButton3.flat:=true; end end; procedure Tsoundform.ComboBox1Select(Sender: TObject); begin count:=0; Edit1.Text:=''; ADOTable1.Locate('ID',Trim(ComboBox1.Text),[]); ADOTable2.Locate('ID',Trim(ComboBox1.Text),[]);

Page 12: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L12

SpeedButton1.Flat:=True; SpeedButton2.Flat:=True; SpeedButton3.Flat:=True; nf:=ADOTable1['Id']; Edit1.Text:=ADOTable2nama.Value; if ADOTable1rec1.Value=true then begin SpeedButton1.Enabled:=true; count:=count+1; end else SpeedButton1.Enabled:=false; if ADOTable1rec2.Value=true then begin SpeedButton2.Enabled:=true; count:=count+1; end else SpeedButton2.Enabled:=false; if ADOTable1rec3.Value=true then begin SpeedButton3.Enabled:=true; count:=count+1; end else SpeedButton3.Enabled:=false; end; procedure Tsoundform.konekAfterConnect(Sender: TObject); begin ADOTable1.Active:=True; comboBox1.Items.Clear; ADOTable1.First; while not (ADOTable1.Eof) do begin ComboBox1.Items.add(ADOTable1ID.value); ADOTable1.Next; end; end; procedure Tsoundform.FormClose(Sender: TObject; var Action: TCloseAction); begin Refresh; ComboBox1.Clear; konek.Connected:=false; SpeedButton1.Flat:=True; SpeedButton2.Flat:=True; SpeedButton3.Flat:=True; SpeedButton1.Enabled:=false;

Page 13: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L13

SpeedButton2.Enabled:=false; SpeedButton3.Enabled:=false; Edit1.Text:=''; end; procedure Tsoundform.FormActivate(Sender: TObject); begin konek.Connected:=true; end; end. ------------------------------------------------------------------------------------------------------- unit tambahw; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, MPlayer, ComCtrls, StdCtrls, ExtCtrls,mmsystem,DB, ADODB, Mask, DBCtrls; type Taddwave = class(TForm) Button1: TButton; Button2: TButton; TrackBar1: TTrackBar; Panel1: TPanel; Timer1: TTimer; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; var addwave: Taddwave; t1 : integer; implementation

Page 14: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L14

uses sound1; {$R *.dfm} procedure Taddwave.Button1Click(Sender: TObject); begin TrackBar1.Position:=0; t1:=0; Close; end; procedure Taddwave.Button3Click(Sender: TObject); begin t1:=0; Timer1.Enabled:=true;

mciSendString('OPEN NEW TYPE WAVEAUDIO ALIAS MicSound', nil, 0, Handle);

mciSendString('SET MicSound TIME FORMAT MS '+'BITSPERSAMPLE 16 '+ 'CHANNELS 2 '+'SAMPLESPERSEC 44100 '+'BYTESPERSEC 16000',nil, 0, Handle); mciSendString('RECORD MicSound', nil, 0, Handle); end; procedure Taddwave.Timer1Timer(Sender: TObject); begin t1:=t1+1; TrackBar1.Position:=(t1*2); if t1=6 then begin Timer1.Enabled:=false; Button2.Enabled:=true; Button3.Enabled:=false; mciSendString('STOP MicSound', nil, 0, Handle); end; end; procedure Taddwave.Button2Click(Sender: TObject); begin

mciSendString(PChar('SAVE MicSound ' + 'c:\bahan\project\wave\'+sound1.nf+inttostr(sound1.posw)+'.wav'), nil, 0, Handle);

mciSendString('CLOSE MicSound', nil, 0, Handle); TrackBar1.Position:=0; Close;

Page 15: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L15

end; procedure Taddwave.FormActivate(Sender: TObject); begin Button2.Enabled:=False; Button3.Enabled:=True; end; end. ------------------------------------------------------------------------------------------------------- unit absen; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls,mmsystem,ComObj, DB, ADODB; type Tabsensi = class(TForm) TrackBar1: TTrackBar; Button1: TButton; Button2: TButton; Memo1: TMemo; Panel1: TPanel; Timer1: TTimer; ADOConnection1: TADOConnection; ADOCommand1: TADOCommand; ADOTable1: TADOTable; ADOTable1Nama: TStringField; ADOTable2: TADOTable; waltu: TTimer; Label1: TLabel; ADOTable2Tgl: TDateTimeField; ADOTable2ID: TWideStringField; ADOTable2masuk: TWideStringField; ADOTable2keluar: TWideStringField; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormActivate(Sender: TObject); procedure waltuTimer(Sender: TObject); private { Private declarations }

Page 16: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L16

public { Public declarations } end; var absensi: Tabsensi; t1:Integer; recoq:Boolean; MATLAB : variant; implementation {$R *.dfm} procedure Tabsensi.Button2Click(Sender: TObject); begin Close; end; procedure Tabsensi.Button1Click(Sender: TObject); begin Button1.Enabled:=false; recoq:=False; Memo1.Text:=''; t1:=0; Timer1.Enabled:=true; mciSendString('OPEN NEW TYPE WAVEAUDIO ALIAS MicSound', nil, 0, Handle); mciSendString('SET MicSound TIME FORMAT MS '+'BITSPERSAMPLE 16 '+ 'CHANNELS 1 '+'SAMPLESPERSEC 44100 '+'BYTESPERSEC 16000',nil, 0, Handle); mciSendString('RECORD MicSound', nil, 0, Handle); end; procedure Tabsensi.Timer1Timer(Sender: TObject); var idh,ratio:Double; jam,menit,posw:Integer; ML_B, ML_idx : OleVariant; stringh,nama,tanggal,valid,nf:String; begin t1:=t1+1; TrackBar1.Position:=(t1*2); if t1=6 then begin

Page 17: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L17

Timer1.Enabled:=false; mciSendString('STOP MicSound', nil, 0, Handle); mciSendString(PChar('SAVE MicSound ' + 'c:\bahan\project\wave\temp.wav'), nil, 0, Handle); mciSendString('CLOSE MicSound', nil, 0, Handle); MATLAB.execute('absensi'); ML_B := VarArrayCreate([0, 1], varDouble); ML_idx := VarArrayCreate([0, 1], varDouble); MatLab.GetFullMatrix('hasil','base',VarArrayRef(ML_B),VarArrayRef(ML_idx)); ratio:=ML_B[0]; if(ratio>0) then recoq:=true else recoq:=false; if(recoq) then begin idh:=ML_B[1]; stringh:='10000'+FloatToStr(idh); ADOCommand1.CommandText:='Select * from karyawan WHERE id='+quotedStr(stringh); ADOCommand1.Execute; ADOTable1.Active:=false; ADOTable1.Active:=true; nama:=ADOTable1Nama.Value; jam:=strtoint(FormatDateTime('hh',Now)); menit:=strtoint(FormatDateTime('nn',Now)); tanggal:=FormatDateTime('d/m/yyyy',Now); if((jam<=10) and (jam>=8)) then begin Memo1.Text:='==Suara Dikenali=='; Memo1.Lines.Add(nama); Memo1.Lines.Add('Selamat Bekerja'); ADOCommand1.CommandText:='Select * from absen WHERE id='+quotedStr(stringh)+' and tgl ='+tanggal;; ADOCommand1.Execute; ADOTable1.Active:=false; ADOTable1.Active:=true; valid:=ADOTable1Nama.Value; if (valid=' ') then begin ADOCommand1.CommandText:='insert into absen set rec'+inttostr(posw)+'=1 '+' WHERE id='+quotedStr(nf); ADOCommand1.Execute; ADOTable2.Active:=false; ADOTable2.Active:=true; end; end else if((jam<=20) and (jam>=16)) then begin Memo1.Text:='==Suara Dikenali=='; Memo1.Lines.Add(nama); Memo1.Lines.Add('Selamat Pulang');

Page 18: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L18

ADOCommand1.CommandText:='update absen set keluar = '+inttostr(jam)+':'+inttostr(menit)+' WHERE id='+quotedStr(stringh)+' and tgl='+tanggal; ADOCommand1.Execute; ADOTable2.Active:=false; ADOTable2.Active:=true; end; end else begin Memo1.Text:='==Suara Tidak Dikenali=='; Memo1.Lines.Add('Harap Mencoba Kembali'); Memo1.Lines.Add('Absensi Pengenalan Suara'); end; Button1.Enabled:=true; t1:=0; TrackBar1.Position:=0; end; end; procedure Tabsensi.FormActivate(Sender: TObject); begin MATLAB:= CreateOleObject('Matlab.Application'); Memo1.Text:='==Selamat Datang=='; Memo1.Lines.Add('Mentari Rajut'); Memo1.Lines.Add('Absensi Pengenalan Suara'); end; procedure Tabsensi.waltuTimer(Sender: TObject); begin label1.Caption:=FormatDateTime('DD-MMM-YY HH:nn:SS',Now); end; end. ------------------------------------------------------------------------------------------------------- { TWave by Daniel Backström 2002, release 3.1 PSEUDO SOLUTIONS: http://home.bip.net/baxtrom Copyright (C) 2002 Daniel Backström This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful,

Page 19: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L19

but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. } unit Wave; interface uses Windows, Messages, SysUtils, Classes, MMSystem; // Header size in bytes const HeaderSize = 44; type TWaveHeader = record ChunkID: array[1..4] of char; ChunkSize: LongWord; Format: array[1..4] of char; Subchunk1ID: array[1..4] of char; Subchunk1Size: LongWord; AudioFormat: Word; NumChannels: Word; SampleRate: LongWord; ByteRate: LongWord; BlockAlign: Word; BitsPerSample: Word; Subchunk2ID: array[1..4] of Char; Subchunk2Size: LongWord; end; type TSelectedChannel = (LeftChannel, RightChannel); type TInvert = (Invert, DoNotInvert); type TProgressEvent = procedure(Sender: TObject; Progress: Shortint) of object; type TWave = class(TComponent) private { Private declarations } FFileName: TFileName; FWaveHeader: TWaveHeader; FWaveStream: TMemoryStream;

Page 20: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L20

FTempWaveHeader: TWaveHeader; FTempWaveStream: TMemoryStream; FProgress: TProgressEvent; procedure LoadHeader; procedure FSetFileName(FileName: TFileName); function FGetBitsPerSample: Word; function FGetNumChannels: Word; function FGetSampleRate: Longword; procedure FSetSampleRate(SampleRate: Longword); function FGetSize: Longword; function FGetLength: Double; protected { Protected declarations } public { Public declarations } property FileName: TFileName read FFileName write FSetFileName; function PlayWave: Boolean; function StopWave: Boolean; property BitsPerSample: Word read FGetBitsPerSample; property NumChannels: Word read FGetNumChannels; property SampleRate: Longword read FGetSampleRate write FSetSampleRate; property Size: Longword read FGetSize; property Length: Double read FGetLength; function GetValue(Position: Longword; SelectedChannel: TSelectedChannel): Double; procedure SetValue(Position: Longword; SelectedChannel: TSelectedChannel; Value: Double); procedure ConvertToMono; procedure ConvertToStereo(Arg: TInvert = Invert); procedure ConvertTo8Bits; procedure ConvertTo16Bits; procedure DoubleSampleRate; procedure HalveSampleRate; procedure SaveWave(FileName: TFileName); published { Published declarations } property OnProgress: TProgressEvent read FProgress write FProgress; end; procedure Register; implementation //------------------------------------------------------------------------------ procedure TWave.LoadHeader; // Reads the wave header into the FWaveHeader field

Page 21: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L21

var F: file of TWaveHeader; begin AssignFile(F, FFileName); Reset(F); Read(F, FWaveHeader); Close(F); end; procedure TWave.FSetFileName(FileName: TFileName); // Sets the filename, updates the header information and creates a stream begin FFileName := FileName; LoadHeader; FWaveStream.Free; FWaveStream := TMemoryStream.Create; FWaveStream.LoadFromFile(FFileName); end; function TWave.PlayWave: Boolean; // Plays the wave stream begin PlayWave := PlaySound(FWaveStream.Memory, 0, SND_MEMORY + SND_ASYNC); end; function TWave.StopWave: Boolean; // Stops playing the wave stream begin StopWave := PlaySound(nil, 0, SND_MEMORY); end; procedure TWave.SaveWave(FileName: TFileName); // Saves the wave stream to file begin

Page 22: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L22

FWaveStream.SaveToFile(FileName); end; function TWave.FGetBitsPerSample: Word; // Returns the bits per sample resolution (supported: 8 and 16) begin FGetBitsPerSample := FWaveHeader.BitsPerSample; end; function TWave.FGetNumChannels: Word; // Returns the number of channels (supported: 1 and 2) begin FGetNumChannels := FWaveHeader.NumChannels; end; function TWave.FGetSampleRate: Longword; // Returns the sample rate begin FGetSampleRate := FWaveHeader.SampleRate; end; procedure Twave.FSetSampleRate(SampleRate: Longword); // Sets samplerate begin FwaveHeader.ByteRate := round( SampleRate/FWaveHeader.SampleRate* FwaveHeader.ByteRate ); FWaveHeader.SampleRate := SampleRate; FWaveStream.Seek(0, 0); FWaveStream.Write(FWaveHeader, HeaderSize); end;

Page 23: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L23

function TWave.FGetSize: Longword; // Returns the total number of samples in the channels begin FGetSize := FWaveHeader.Subchunk2Size * 8 div FWaveHeader.BitsPerSample div FWaveHeader.NumChannels; end; function TWave.FGetLength: Double; // Returns the total length in seconds of the wave begin FGetLength := FGetSize / FGetSampleRate; end; function TWave.GetValue(Position: Longword; SelectedChannel: TSelectedChannel): Double; { Reads the wave at the given position and channel and returns a value between -1 and 1 } var b: Byte; w: Smallint; begin if Position + 1 > FGetSize then begin GetValue := 0; Exit; end; if FWaveHeader.NumChannels = 1 then if FWaveHeader.BitsPerSample = 8 then begin FWaveStream.Seek(HeaderSize + Position, 0); FWaveStream.Read(b, 1); GetValue := 2/255*b - 1; end else begin FWaveStream.Seek(HeaderSize + 2*Position, 0); FWaveStream.Read(w, 2); GetValue := 2/65535*w + 1 - 65534/65535; end

Page 24: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L24

else begin if FWaveHeader.BitsPerSample = 8 then begin if SelectedChannel = LeftChannel then begin FWaveStream.Seek(HeaderSize + 2*Position, 0); FWaveStream.Read(b, 1); GetValue := 2/255*b - 1; end else begin FWaveStream.Seek(HeaderSize + 2*Position + 1, 0); FWaveStream.Read(b, 1); GetValue := 2/255*b - 1; end; end else begin if SelectedChannel = LeftChannel then begin FWaveStream.Seek(HeaderSize + 4*Position, 0); FWaveStream.Read(w, 2); GetValue := 2/65535*w + 1 - 65534/65535; end else begin FWaveStream.Seek(HeaderSize + 4*Position + 2, 0); FWaveStream.Read(w, 2); GetValue := 2/65535*w + 1 - 65534/65535; end; end; end; end; procedure TWave.SetValue(Position: Longword; SelectedChannel: TSelectedChannel; Value: Double); // Sets the value (-1..1) at the given sample position and channel var b: Byte; w: Smallint; begin if Position + 1 > FGetSize then Exit;

Page 25: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L25

if FWaveHeader.NumChannels = 1 then if FWaveHeader.BitsPerSample = 8 then begin b := round( (Value + 1)*255/2 ); FWaveStream.Seek(HeaderSize + Position, 0); FWaveStream.Write(b, 1); end else begin w := round( (Value - 1 + 65534/65535)*65535/2 ); FWaveStream.Seek(HeaderSize + 2*Position, 0); FWaveStream.Write(w, 2); end else begin if FWaveHeader.BitsPerSample = 8 then begin if SelectedChannel = LeftChannel then begin b := round( (Value + 1)*255/2 ); FWaveStream.Seek(HeaderSize + 2*Position, 0); FWaveStream.Write(b, 1); end else begin b := round( (Value + 1)*255/2 ); FWaveStream.Seek(HeaderSize + 2*Position + 1, 0); FWaveStream.Write(b, 1); end; end else begin if SelectedChannel = LeftChannel then begin w := round( (Value - 1 + 65534/65535)*65535/2 ); FWaveStream.Seek(HeaderSize + 4*Position, 0); FWaveStream.Write(w, 2); end else begin w := round( (Value - 1 + 65534/65535)*65535/2 ); FWaveStream.Seek(HeaderSize + 4*Position + 2, 0); FWaveStream.Write(w, 2); end; end; end;

Page 26: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L26

end; procedure TWave.ConvertToMono; // Converts a stereo recording to mono recording var i: Longword; b1, b2: Byte; w1, w2: Smallint; begin if FWaveHeader.NumChannels = 1 then Exit; FTempWaveHeader := FWaveHeader; FTempWaveHeader.NumChannels := 1; FTempWaveHeader.ByteRate := FWaveHeader.ByteRate div 2; FTempWaveHeader.Subchunk2Size := FWaveheader.Subchunk2Size div 2; FTempWaveStream := TMemoryStream.Create; FTempWaveStream.SetSize( HeaderSize + FTempWaveHeader.Subchunk2Size ); FTempWaveStream.Seek(0, 0); FTempWaveStream.Write(FTempWaveHeader, HeaderSize); for i := 0 to Size - 1 do begin // For the OnProgress event if ( (Assigned(FProgress) ) and (i mod 100 = 0) ) then FProgress(Self, round( 100*i/(Size - 1) ) ); if FWaveHeader.BitsPerSample = 8 then begin FWaveStream.Seek(HeaderSize + 2*i, 0); FWaveStream.Read(b1, 1); FWaveStream.Seek(HeaderSize + 2*i + 1, 0); FWaveStream.Read(b2, 1); // Computing channel average b1 := (b1 + b2) div 2; FTempWaveStream.Seek(HeaderSize + i, 0); FTempWaveStream.Write(b1, 1); end else begin FWaveStream.Seek(HeaderSize + 4*i, 0); FWaveStream.Read(w1, 2);

Page 27: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L27

FWaveStream.Seek(HeaderSize + 4*i + 2, 0); FWaveStream.Read(w2, 2); // Computing channel average w1 := (w1 + w2) div 2; FTempWaveStream.Seek(HeaderSize + 2*i, 0); FTempWaveStream.Write(w1, 2); end; end; if Assigned(FProgress) then FProgress(Self, -1); // Updates the wave FWaveStream.LoadFromStream(FTempWaveStream); FWaveHeader := FTempWaveHeader; FTempWaveStream.Free; end; procedure TWave.ConvertToStereo(Arg: TInvert); { Converts a mono recording to a stereo recording, if Arg = Invert then the right channel will be an inverted copy of the original channel, if Arg = DoNotInvert then both channels are identical.} var i: Longword; b: Byte; w: Smallint; begin if FWaveHeader.NumChannels = 2 then Exit; FTempWaveHeader := FWaveHeader; FTempWaveHeader.NumChannels := 2; FTempWaveHeader.ByteRate := 2*FWaveHeader.ByteRate; FTempWaveHeader.Subchunk2Size := 2*FWaveheader.Subchunk2Size; FTempWaveStream := TMemoryStream.Create; FTempWaveStream.SetSize( HeaderSize + FTempWaveHeader.Subchunk2Size); FTempWaveStream.Seek(0, 0); FTempWaveStream.Write(FTempWaveHeader, HeaderSize); for i := 0 to Size - 1 do begin // For the OnProgress event if ( (Assigned(FProgress)) and (i mod 100 = 0) ) then FProgress(Self, round( 100*i/(Size - 1) ) );

Page 28: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L28

if FWaveHeader.BitsPerSample = 8 then begin FWaveStream.Seek(HeaderSize + i, 0); FTempWaveStream.Seek(HeaderSize + 2*i, 0); FWaveStream.Read(b, 1); FTempWaveStream.Write(b, 1); // Writes to right channel (inverses if Arg = Invert) FTempWaveStream.Seek(HeaderSize + 2*i + 1, 0); if Arg = Invert then begin b := 255 - b; FTempWaveStream.Write(b, 1); end else FTempWaveStream.Write(b, 1); end else begin FWaveStream.Seek(HeaderSize + 2*i, 0); FTempWaveStream.Seek(HeaderSize + 4*i, 0); FWaveStream.Read(w, 2); FTempWaveStream.Write(w, 2); // Writes to right channel (inverses if Arg = Invert) FTempWaveStream.Seek(HeaderSize + 4*i + 2, 0); if Arg = Invert then begin { 16 bit inverting needs special care bacause of the range } if ((w <> -32768) and (w <> 32767)) then w := -w else if w = -32768 then w := 32767 else if w = 32767 then w := -32768; FTempWaveStream.Write(w, 2); end else FTempWaveStream.Write(w, 2); end end; if Assigned(FProgress) then FProgress(Self, -1); // Updates the wave

Page 29: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L29

FWaveStream.LoadFromStream(FTempWaveStream); FWaveHeader := FTempWaveHeader; FTempWaveStream.Free; end; procedure TWave.ConvertTo8Bits; // converts the wave to 8 bit resolution var i: Longword; k, b: byte; w: Smallint; c1, c2: Double; begin if FWaveHeader.BitsPerSample = 8 then Exit; FTempWaveHeader := FWaveHeader; FTempWaveHeader.BitsPerSample := 8; FTempWaveHeader.ByteRate := FWaveHeader.ByteRate div 2; FTempWaveHeader.Subchunk2Size := FWaveheader.Subchunk2Size div 2; FTempWaveStream := TMemoryStream.Create; FTempWaveStream.SetSize( HeaderSize + FTempWaveHeader.Subchunk2Size); FTempWaveStream.Seek(0, 0); FTempWaveStream.Write(FTempWaveHeader, HeaderSize); if FWaveHeader.NumChannels = 1 then k := 1 else k := 2; // Linear mapping: 8bit = c1*16bit + c2 c1 := 255/65535; c2 := 32768*c1; for i := 0 to k*(Size - 1) do begin // For the OnProgress event if ( (Assigned(FProgress)) and (i mod 100 = 0) ) then FProgress(Self, round( 100*i/(k*(Size - 1)) ) ); FWaveStream.Seek(HeaderSize + 2*i, 0); FWaveStream.Read(w, 2); b := round( c1*w + c2 );

Page 30: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L30

FTempWaveStream.Seek(HeaderSize + i, 0); FTempWaveStream.Write(b, 1); end; if Assigned(FProgress) then FProgress(Self, -1); // Updates the wave FWaveStream.LoadFromStream(FTempWaveStream); FWaveHeader := FTempWaveHeader; FTempWaveStream.Free; end; procedure TWave.ConvertTo16Bits; // converts the wave to 16 bit resolution var i: Longword; b, k: byte; w: Smallint; c1, c2: Double; begin if FWaveHeader.BitsPerSample = 16 then Exit; FTempWaveHeader := FWaveHeader; FTempWaveHeader.BitsPerSample := 16; FTempWaveHeader.ByteRate := 2*FWaveHeader.ByteRate; FTempWaveHeader.Subchunk2Size := 2*FWaveheader.Subchunk2Size; FTempWaveStream := TMemoryStream.Create; FTempWaveStream.SetSize( HeaderSize + FTempWaveHeader.Subchunk2Size ); FTempWaveStream.Seek(0, 0); FTempWaveStream.Write(FTempWaveHeader, HeaderSize); if FWaveHeader.NumChannels = 1 then k := 1 else k := 2; // Linear mapping: 16bit = c1*8bit + c2 c1 := 65535/255; c2 := -32768; for i := 0 to k*(Size - 1) do begin // For the OnProgress event if ( (Assigned(FProgress)) and (i mod 100 = 0) ) then

Page 31: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L31

FProgress(Self, round( 100*i/(k*(Size - 1)) ) ); FWaveStream.Seek(HeaderSize + i, 0); FWaveStream.Read(b, 1); w := round( c1*b + c2 ); FTempWaveStream.Seek(HeaderSize + 2*i, 0); FTempWaveStream.Write(w, 2); end; if Assigned(FProgress) then FProgress(Self, -1); // Updates the wave FWaveStream.LoadFromStream(FTempWaveStream); FWaveHeader := FTempWaveHeader; FTempWaveStream.Free; end; procedure TWave.DoubleSampleRate; // Doubles the sample rate without changing the pitch of the wave var i: Longword; b, b1, b2: byte; w, w1, w2: Smallint; begin FTempWaveHeader := FWaveHeader; FTempWaveHeader.SampleRate := 2*FWaveHeader.SampleRate; FTempWaveHeader.ByteRate := 2*FWaveHeader.ByteRate; FTempWaveHeader.Subchunk2Size := 2*FWaveheader.Subchunk2Size; FTempWaveStream := TMemoryStream.Create; FTempWaveStream.SetSize( HeaderSize + FTempWaveHeader.Subchunk2Size ); FTempWaveStream.Seek(0, 0); FTempWaveStream.Write(FTempWaveHeader, HeaderSize); if FWaveHeader.NumChannels = 1 then begin // mono if FWaveHeader.BitsPerSample = 8 then for i := 0 to FWaveHeader.Subchunk2Size - 2 do //OK begin // For the OnProgress event if ( (Assigned(FProgress)) and (i mod 100 = 0) ) then FProgress(Self, round(100*i/(FWaveHeader.Subchunk2Size - 2)) );

Page 32: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L32

FWaveStream.Seek(HeaderSize + i, 0); FWaveStream.Read(b1, 1); FWaveStream.Seek(HeaderSize + i + 1, 0); FWaveStream.Read(b2, 1); b := (b1 + b2) div 2; FTempWaveStream.Seek(HeaderSize + 2*i, 0); FTempWaveStream.Write(b1, 1); FTempWaveStream.Seek(HeaderSize + 2*i + 1, 0); FTempWaveStream.Write(b, 1); end else for i := 0 to (FWaveHeader.Subchunk2Size - 4) div 2 do //OK! begin // For the OnProgress event if ( (Assigned(FProgress)) and (i mod 100 = 0) ) then FProgress(Self, round(200*i/(FWaveHeader.Subchunk2Size - 4)) ); FWaveStream.Seek(HeaderSize + 2*i, 0); FWaveStream.Read(w1, 2); FWaveStream.Seek(HeaderSize + 2*i + 2, 0); FWaveStream.Read(w2, 2); w := (w1 + w2) div 2; FTempWaveStream.Seek(HeaderSize + 4*i, 0); FTempWaveStream.Write(w1, 2); FTempWaveStream.Seek(HeaderSize + 4*i + 2, 0); FTempWaveStream.Write(w, 2); end; end else // stereo begin if FWaveHeader.BitsPerSample = 8 then for i := 0 to (FWaveHeader.Subchunk2Size - 4) div 2 do //OK! begin // For the OnProgress event if ( (Assigned(FProgress)) and (i mod 100 = 0) ) then FProgress(Self, round(200*i/(FWaveHeader.Subchunk2Size - 4)) ); // Left channel FWaveStream.Seek(HeaderSize + 2*i, 0); //0,2,6 FWaveStream.Read(b1, 1); FWaveStream.Seek(HeaderSize + 2*i + 2, 0); //2,4,8 FWaveStream.Read(b2, 1);

Page 33: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L33

b := (b1 + b2) div 2; FTempWaveStream.Seek(HeaderSize + 4*i, 0); FTempWaveStream.Write(b1, 1); FTempWaveStream.Seek(HeaderSize + 4*i + 2, 0); FTempWaveStream.Write(b, 1); // Right channel FWaveStream.Seek(HeaderSize + 2*i + 1, 0); //1,3,7 FWaveStream.Read(b1, 1); FWaveStream.Seek(HeaderSize + 2*i + 3, 0); //3,5,9 FWaveStream.Read(b2, 1); b := (b1 + b2) div 2; FTempWaveStream.Seek(HeaderSize + 4*i + 1, 0); FTempWaveStream.Write(b1, 1); FTempWaveStream.Seek(HeaderSize + 4*i + 3, 0); FTempWaveStream.Write(b, 1); end else for i := 0 to (FWaveHeader.Subchunk2Size - 8) div 4 do //OK! begin // For the OnProgress event if ( (Assigned(FProgress)) and (i mod 100 = 0) ) then FProgress(Self, round(400*i/(FWaveHeader.Subchunk2Size - 8)) ); // Left channel FWaveStream.Seek(HeaderSize + 4*i, 0); FWaveStream.Read(w1, 2); FWaveStream.Seek(HeaderSize + 4*i + 4, 0); FWaveStream.Read(w2, 2); w := (w1 + w2) div 2; FTempWaveStream.Seek(HeaderSize + 8*i, 0); FTempWaveStream.Write(w1, 2); FTempWaveStream.Seek(HeaderSize + 8*i + 4, 0); FTempWaveStream.Write(w, 2); // Right channel FWaveStream.Seek(HeaderSize + 4*i + 2, 0); FWaveStream.Read(w1, 2); FWaveStream.Seek(HeaderSize + 4*i + 6, 0); FWaveStream.Read(w2, 2); w := (w1 + w2) div 2; FTempWaveStream.Seek(HeaderSize + 8*i + 2, 0); FTempWaveStream.Write(w1, 2);

Page 34: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L34

FTempWaveStream.Seek(HeaderSize + 8*i + 6, 0); FTempWaveStream.Write(w, 2); end; end; if Assigned(FProgress) then FProgress(Self, -1); // Updates the wave FWaveStream.LoadFromStream(FTempWaveStream); FWaveHeader := FTempWaveHeader; FTempWaveStream.Free; end; procedure TWave.HalveSampleRate; // Halves the sample rate without changing the pitch of the wave var i: Longword; b, b1, b2: byte; w, w1, w2: Smallint; begin FTempWaveHeader := FWaveHeader; FTempWaveHeader.SampleRate := FWaveHeader.SampleRate div 2; FTempWaveHeader.ByteRate := FWaveHeader.ByteRate div 2; FTempWaveHeader.Subchunk2Size := FWaveheader.Subchunk2Size div 2; FTempWaveStream := TMemoryStream.Create; FTempWaveStream.SetSize( HeaderSize + FTempWaveHeader.Subchunk2Size ); FTempWaveStream.Seek(0, 0); FTempWaveStream.Write(FTempWaveHeader, HeaderSize); if FWaveHeader.NumChannels = 1 then begin // mono if FWaveHeader.BitsPerSample = 8 then for i := 0 to (FWaveHeader.Subchunk2Size - 2) div 2 do //OK! begin // For the OnProgress event if ( (Assigned(FProgress)) and (i mod 100 = 0) ) then FProgress(Self, round(200*i/(FWaveHeader.Subchunk2Size - 2)) ); FWaveStream.Seek(HeaderSize + 2*i, 0); FWaveStream.Read(b1, 1); FWaveStream.Seek(HeaderSize + 2*i + 1, 0); FWaveStream.Read(b2, 1);

Page 35: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L35

b := (b1 + b2) div 2; FTempWaveStream.Seek(HeaderSize + i, 0); FTempWaveStream.Write(b, 1); end else for i := 0 to (FWaveHeader.Subchunk2Size - 4) div 4 do //OK! begin // For the OnProgress event if ( (Assigned(FProgress)) and (i mod 100 = 0) ) then FProgress(Self, round(400*i/(FWaveHeader.Subchunk2Size - 4)) ); FWaveStream.Seek(HeaderSize + 4*i, 0); FWaveStream.Read(w1, 2); FWaveStream.Seek(HeaderSize + 4*i + 2, 0); FWaveStream.Read(w2, 2); w := (w1 + w2) div 2; FTempWaveStream.Seek(HeaderSize + 2*i, 0); FTempWaveStream.Write(w, 2); end; end else // stereo begin if FWaveHeader.BitsPerSample = 8 then for i := 0 to (FWaveHeader.Subchunk2Size - 4) div 2 do //OK! begin // For the OnProgress event if ( (Assigned(FProgress)) and (i mod 100 = 0) ) then FProgress(Self, round(200*i/(FWaveHeader.Subchunk2Size - 4)) ); // Left channel FWaveStream.Seek(HeaderSize + 4*i, 0); FWaveStream.Read(b1, 1); FWaveStream.Seek(HeaderSize + 4*i + 2, 0); FWaveStream.Read(b2, 1); b := (b1 + b2) div 2; FTempWaveStream.Seek(HeaderSize + 2*i, 0); FTempWaveStream.Write(b, 1); // Right channel FWaveStream.Seek(HeaderSize + 4*i + 1, 0); FWaveStream.Read(b1, 1); FWaveStream.Seek(HeaderSize + 4*i + 3, 0);

Page 36: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L36

FWaveStream.Read(b2, 1); b := (b1 + b2) div 2; FTempWaveStream.Seek(HeaderSize + 2*i + 1, 0); FTempWaveStream.Write(b, 1); end else for i := 0 to (FWaveHeader.Subchunk2Size - 8) div 4 do //OK! begin // For the OnProgress event if ( (Assigned(FProgress)) and (i mod 100 = 0) ) then FProgress(Self, round(400*i/(FWaveHeader.Subchunk2Size - 8)) ); // Left channel FWaveStream.Seek(HeaderSize + 8*i, 0); FWaveStream.Read(w1, 2); FWaveStream.Seek(HeaderSize + 8*i + 4, 0); FWaveStream.Read(w2, 2); w := (w1 + w2) div 2; FTempWaveStream.Seek(HeaderSize + 4*i, 0); FTempWaveStream.Write(w, 2); // Right channel FWaveStream.Seek(HeaderSize + 8*i + 2, 0); FWaveStream.Read(w1, 2); FWaveStream.Seek(HeaderSize + 8*i + 6, 0); FWaveStream.Read(w2, 2); w := (w1 + w2) div 2; FTempWaveStream.Seek(HeaderSize + 4*i + 2, 0); FTempWaveStream.Write(w, 2); end; end; if Assigned(FProgress) then FProgress(Self, -1); // Updates the wave FWaveStream.LoadFromStream(FTempWaveStream); FWaveHeader := FTempWaveHeader; FTempWaveStream.Free; end; //------------------------------------------------------------------------------ procedure Register;

Page 37: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L37

begin RegisterComponents('Wave', [TWave]); end; end. ------------------------------------------------------------------------------------------------------- function [] = absen(); alldata = ('c:\bahan\project\temp'); alltype=absenget(); [Ptrain Ttrain Ptest Ttest] = subset(alldata, alltype, round(size(alltype, 1)*0.70)); %set Parameter for FJ FJ_params = { 'Cmax', 25, 'thr', 1e-9 }; %Create GMM and training bayesS = gmmb_create(Ptrain, Ttrain, 'FJ', FJ_params{:}); % This is the Bayesian case. pdfmat = gmmb_pdf(Ptest, bayesS); postprob = gmmb_normalize( gmmb_weightprior(pdfmat, bayesS) ); result = gmmb_decide(postprob); %disp('Done classifying. We used the Bayesian classifier.'); rat = sum(result == Ttest) / length(Ttest); histS = gmmb_generatehist(bayesS, 1000); outlier_mask = gmmb_fracthresh(pdfmat, histS, 0.9); postprob(outlier_mask) = 0; result = gmmb_decide(postprob); ------------------------------------------------------------------------------------------------------ function [tdata, ttype, left_data, left_type] = subset(data, type, n); tdata = zeros(n, size(data,2)); ttype = zeros(n, 1); left_data = []; left_type = []; N = size(data,1); if n>N tdata = data; ttype = type; return; end left_data = zeros(N-n, size(data,2));

Page 38: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L38

left_type = zeros(N-n, 1); done=0; over=0; e=0; unkst = unique(type)'; for k = unkst cdata = data(type==k, :); cN = size(cdata,1); sn = min(round(n*cN/N), n-done); e = e + sn - n*cN/N; if e >= 1 e = e-1; sn = sn -1; end if e <= -1 e = e+1; sn = sn +1; end perm = randperm(cN); tdata((done+1):(done+sn), :) = cdata(perm(1:sn), :); left_data((over+1):(over+cN-sn), :) = cdata(perm((sn+1):cN), :); ttype((done+1):(done+sn), 1) = k; left_type((over+1):(over+cN-sn), :) = k; done = done + sn; over = over + cN - sn; end ------------------------------------------------------------------------------------------------------ function[]=absensi; train(); tabsen=soundSig('c:\bahan\project\wave\temp'); train(); tabsen=soundSig('c:\bahan\project\wave\temp'); hasil=[0 0]; if (dat1==1) sum11=sum(t11.*tabsen); sum12=sum(t12.*tabsen); sum13=sum(t13.*tabsen); if (sum1-sum11)<=sum1a && (sum1-sum11)>=sum1b hasil=[1 1];end; end; if (dat2==1) sum21=sum(t21.*tabsen); sum22=sum(t22.*tabsen); sum23=sum(t23.*tabsen); if (sum2-sum21)<=sum2a && (sum2-sum21)>=sum2b hasil=[1 2];end; end; if (dat3==1) sum31=sum(t31.*tabsen);

Page 39: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L39

sum32=sum(t32.*tabsen); sum33=sum(t33.*tabsen); if (sum3-sum31)<=sum3a && (sum3-sum31)>=sum3b hasil=[1 3];end; end; if (dat4==1) sum41=sum(t41.*tabsen); sum42=sum(t42.*tabsen); sum43=sum(t43.*tabsen); if (sum4-sum41)<=sum1a && (sum4-sum41)>=sum4b hasil=[1 4]; end;end; if (dat5==1) sum51=sum(t51.*tabsen); sum52=sum(t52.*tabsen); sum53=sum(t53.*tabsen); if (sum5-sum51)<=sum5a && (sum5-sum51)>=sum5b hasil=[1 5];end; end; if (dat6==1) sum61=sum(t61.*tabsen); sum62=sum(t62.*tabsen); sum63=sum(t63.*tabsen); if (sum6-sum61)<=sum6a && (sum6-sum61)>=sum6b hasil=[1 6];end; end; if (dat7==1) sum71=sum(t71.*tabsen); sum72=sum(t72.*tabsen); sum73=sum(t73.*tabsen); if (sum7-sum71)<=sum7a && (sum7-sum71)>=sum7b hasil=[1 7];end; end; if (dat8==1) sum81=sum(t81.*tabsen); sum82=sum(t82.*tabsen); sum83=sum(t83.*tabsen); if (sum8-sum81)<=sum8a && (sum8-sum81)>=sum8b hasil=[1 8];end; end; if (dat9==1) sum91=sum(t91.*tabsen); sum92=sum(t92.*tabsen); sum93=sum(t93.*tabsen); if (sum9-sum91)<=sum9a && (sum9-sum91)>=sum9b hasil=[1 9];end; end; if (dat0==1)

Page 40: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L40

sum01=sum(t01.*tabsen); sum02=sum(t02.*tabsen); sum03=sum(t03.*tabsen); if (sum0-sum01)<=sum0a && (sum0-sum01)>=sum0b hasil=[1 0];end; end; if hasil=[0 0] absensi();end; ------------------------------------------------------------------------------------------------------ function [p]=soundSig(filename) in=wavread(filename); f=fft(in,100000); q=f.*conj(f); q=abs(q(1:10000)); for i=1:100 t=(i-1)*100+1; p(i)=sum(q(t:t+99)); end p=p/sum(p); ------------------------------------------------------------------------------------------------------ function[]=train; dat1=0;dat2=0;dat3=0;dat4=0;dat5=0;dat6=0;dat7=0;dat8=0;dat9=0;dat0=0; if exist('c:\bahan\project\wave\1000011.wav') t11=soundsig('c:\bahan\project\wave\1000011.wav'); t12=soundsig('c:\bahan\project\wave\1000012.wav'); t13=soundsig('c:\bahan\project\wave\1000013.wav'); dat1=1; sum1=sum(t11.*t12);sum1a=sum1*0.08;sum1b=0-sum1a;end; if exist('c:\bahan\project\wave\1000021.wav') t21=soundsig('c:\bahan\project\wave\1000021.wav'); t22=soundsig('c:\bahan\project\wave\1000022.wav'); t23=soundsig('c:\bahan\project\wave\1000023.wav'); dat2=1; sum2=sum(t21.*t22);sum2a=sum2*0.08;sum2b=0-sum2a;end; if exist('c:\bahan\project\wave\1000031.wav') t31=soundsig('c:\bahan\project\wave\1000031.wav'); t32=soundsig('c:\bahan\project\wave\1000032.wav'); t33=soundsig('c:\bahan\project\wave\1000033.wav'); dat3=1; sum3=sum(t31.*t32);sum3a=sum3*0.08;sum3b=0-sum3a;end; if exist('c:\bahan\project\wave\1000041.wav') t41=soundsig('c:\bahan\project\wave\1000041.wav'); t42=soundsig('c:\bahan\project\wave\1000042.wav'); t43=soundsig('c:\bahan\project\wave\1000043.wav'); dat4=1; sum4=sum(t41.*t42);sum4a=sum4*0.08;sum4b=0-sum4a;end; if exist('c:\bahan\project\wave\1000051.wav') t51=soundsig('c:\bahan\project\wave\1000051.wav');

Page 41: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L41

t52=soundsig('c:\bahan\project\wave\1000052.wav'); t53=soundsig('c:\bahan\project\wave\1000053.wav'); dat5=1; sum5=sum(t51.*t52);sum5a=sum5*0.08;sum5b=0-sum5a;end; if exist('c:\bahan\project\wave\1000061.wav') t61=soundsig('c:\bahan\project\wave\1000061.wav'); t62=soundsig('c:\bahan\project\wave\1000062.wav'); t63=soundsig('c:\bahan\project\wave\1000063.wav'); dat6=1; sum6=sum(t61.*t62);sum6a=sum6*0.08;sum6b=0-sum6a;end; if exist('c:\bahan\project\wave\1000071.wav') t71=soundsig('c:\bahan\project\wave\1000071.wav'); t72=soundsig('c:\bahan\project\wave\1000072.wav'); t73=soundsig('c:\bahan\project\wave\1000073.wav'); dat7=1; sum7=sum(t71.*t72);sum7a=sum7*0.08;sum7b=0-sum7a;end; if exist('c:\bahan\project\wave\1000081.wav') t81=soundsig('c:\bahan\project\wave\1000081.wav'); t82=soundsig('c:\bahan\project\wave\1000082.wav'); t83=soundsig('c:\bahan\project\wave\1000083.wav'); dat8=1; sum8=sum(t81.*t82);sum8a=sum8*0.08;sum8b=0-sum8a;end; if exist('c:\bahan\project\wave\1000091.wav') t91=soundsig('c:\bahan\project\wave\1000091.wav'); t92=soundsig('c:\bahan\project\wave\1000092.wav'); t93=soundsig('c:\bahan\project\wave\1000093.wav'); dat9=1; sum9=sum(t91.*t92);sum9a=sum9*0.08;sum9b=0-sum9a;end; if exist('c:\bahan\project\wave\1000001.wav') t01=soundsig('c:\bahan\project\wave\1000001.wav'); t02=soundsig('c:\bahan\project\wave\1000002.wav'); t03=soundsig('c:\bahan\project\wave\1000003.wav'); dat0=1; sum0=sum(t01.*t02);sum0a=sum0*0.08;sum0b=0-sum0a;end; ------------------------------------------------------------------------------------------------------ function []=absen; in=wavread('c:\bahan\project\wave\temp'); alldata =fft(in,10000); alltype= [ ... 1*ones(2000,1); ... 1*ones(2000,1); ... 2*ones(1500,1); ... 3*ones(1500,1); ... 3*ones(1500,1); ... 1*ones(1500,1); ... ]; [Ptrain Ttrain Ptest Ttest] = subset(alldata, alltype, round(size(alltype, 1)*0.70)); %set Parameter for FJ FJ_params = { 'Cmax', 25, 'thr', 1e-3,'animate', 1 }; %Create GMM and training bayesS = gmmb_create(Ptrain, Ttrain, 'FJ', FJ_params{:});

Page 42: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L42

% This is the Bayesian case. pdfmat = gmmb_pdf(Ptest, bayesS); postprob = gmmb_normalize( gmmb_weightprior(pdfmat, bayesS) ); result = gmmb_decide(postprob); %disp('Done classifying. We used the Bayesian classifier.'); rat = sum(result == Ttest) / length(Ttest); histS = gmmb_generatehist(bayesS, 1000); outlier_mask = gmmb_fracthresh(pdfmat, histS, 0.9); postprob(outlier_mask) = 0; result = gmmb_decide(postprob); function [tdata, ttype, left_data, left_type] = subset(data, type, n); tdata = zeros(n, size(data,2)); ttype = zeros(n, 1); left_data = []; left_type = []; N = size(data,1); if n>N tdata = data; ttype = type; return; end left_data = zeros(N-n, size(data,2)); left_type = zeros(N-n, 1); done=0; over=0; e=0; unkst = unique(type)'; for k = unkst cdata = data(type==k, :); cN = size(cdata,1); sn = min(round(n*cN/N), n-done); e = e + sn - n*cN/N; if e >= 1 e = e-1; sn = sn -1; end if e <= -1 e = e+1; sn = sn +1; end perm = randperm(cN); tdata((done+1):(done+sn), :) = cdata(perm(1:sn), :); left_data((over+1):(over+cN-sn), :) = cdata(perm((sn+1):cN), :); ttype((done+1):(done+sn), 1) = k; left_type((over+1):(over+cN-sn), :) = k;

Page 43: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L43

done = done + sn; over = over + cN - sn; end function C = covrot(x, y, th); O = [x 0; 0 y]; R = [cos(th) -sin(th); sin(th) cos(th)]; M = R * O; C = M * M'; %%result hasil=[result,posisi]; ---------------------------------------------------------------------------------------------------- %GMMB_CREATE - Construct new Bayesian classifier with Gaussian mixture model pdf % % S = GMMB_CREATE(data, class, method [, parameters]) Generates a % Bayesian classifier for one or several classes having GMM % distribution with estimated mean values, variances and % apriories. Classifier is returned in bayesS struct S. % % method can be 'EM', 'FJ' or 'GEM'. % EM and FJ can work with complex numbers. % % See also readme.txt, GMMB_HIST, GMMB_GENERATEHIST. % % Parameters are delegated directly to underlaying GMM estimation % function (gmmb_em, gmmb_fj, gmmb_gem). See also them. % % Examples: % bayesS = gmmb_create(data, class, 'EM', 'components', 5, 'thr', 1e-8); % bayesS = gmmb_create(data, class, 'FJ', 'Cmax', 50, 'thr', 1e-9); % bayesS = gmmb_create(data, class, 'GEM', 'Cmax', 10, 'verbose', true); % % The bayesS struct is documented in readme.txt. % % References: % [1] Duda, R.O., Hart, P.E, Stork, D.G, Pattern Classification, % 2nd ed., John Wiley & Sons, Inc., 2001. % % Author(s): % Joni Kamarainen <[email protected]> % Pekka Paalanen <[email protected]> % % Copyright: % % Bayesian Classifier with Gaussian Mixture Model Pdf is % Copyright (C) 2003, 2004 by Pekka Paalanen and Joni-Kristian % Kamarainen. % % $Name: $ $Revision: 1.1 $ $Date: 2004/11/02 08:32:22 $ %

Page 44: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L44

function [bayesS, varargout] = gmmb_create(data, cl, method, varargin); K = max(cl); mu ={}; sigma = {}; weight = {}; prior = {}; stats = {}; for k = 1:K cvals = data(cl == k, :); N = size(cvals,1); % points switch method case 'EM' [estim stat] = gmmb_em(cvals, varargin{:}); case 'FJ' [estim stat] = gmmb_fj(cvals, varargin{:}); case 'GEM' [estim stat] = gmmb_gem(cvals, varargin{:}); otherwise error('Unknown method'); end mu{k} = estim.mu; sigma{k} = estim.sigma; weight{k} = estim.weight; prior{k} = N/size(data,1); stats{k} = stat; end bayesS = struct('mu', mu,... 'sigma', sigma,... 'apriories', prior,... 'weight', weight); if nargout > 1 varargout{1} = stats; end ------------------------------------------------------------------------------------------------------ %GMMB_FJ - Figueiredo-Jain estimated GMM parameters % Produces a bayesS struct without 'apriories'. % % Works with complex numbers directly. % % estimate = GMMB_FJ(data[, parameters]) % [estimate, stats] = GMMB_FJ(...) % % Parameters (default): % maxloops maximum number of loops per a CEM run (500)

Page 45: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L45

% Cmax the maximum number of GMM components % set to -1 to use all data points as component means % Cmin the minimum number of GMM components tried (1) % verbose print some progress numbers (false) % thr CEM2 threshold, relative loglikelihood change (1e-6) % animate plot data and ellipses as the algorithm runs (false) % covtype Covariance matrix structure: 1=diagonal, other=free (0) % broken With complex data, calculate no. of component parameters % as with real data (true). % At least Cmax should be set explicitly. % Example: % estS = gmmb_fj(data, 'Cmax', 50, 'thr', 1e-9) % % References: % [1] Duda, R.O., Hart, P.E, Stork, D.G, Pattern Classification, % 2nd ed., John Wiley & Sons, Inc., 2001. % [2] Bilmes, J.A., A Gentle Tutorial of the EM Algorithm and its % Application to Parameter Estimation for Gaussian Mixture and Hidden % Markov Models % International Computer Science Institute, 1998 % [3] Figueiredo, M.A.T., Jain, A.K., Unsupervised Learning on % Finite Mixture Models, IEEE transactions of pattern analysis and % machine intelligence, vol.24, no3, March 2002 % % This code is directly based on [3] and code published on % Figueiredo homepage: http://www.lx.it.pt/~mtf/ % % Author(s): % Pekka Paalanen <[email protected]> % % Copyright: % % Bayesian Classifier with Gaussian Mixture Model Pdf % functionality is Copyright (C) 2003 by Pekka Paalanen and % Joni-Kristian Kamarainen. % % $Name: $ $Revision: 1.2 $ $Date: 2004/11/02 09:00:18 $ % % % Logging % parameters % % logging What kind of logging to do: % 0 - no logging % 1 - normal logging % 2 - extra logging: store all intermediate mixtures % If the 'stats' output parameter is defined, then 'logging' % defaults to 1, otherwise it is forced to 0. % % the 'stats' struct: % iterations: CEM (full) iteration count % costs: iterations long vector of the cost value % annihilations: component annihilation log [annih, deletion]*iters % covfixer2: iterations-by-C matrix of gmmb_covfixer fix round counts % loglikes: iterations long vector of the log-likelihood % extra logging:

Page 46: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L46

% initialmix: parameters for the initial mixture % mixtures: parameters for all intermediate mixtures % function [estimate, varargout] = gmmb_fj(data, varargin); [N, D] = size(data); % number of points (n), dimensions (d) % defaults conf = struct(... 'maxloops', 500, ... 'Cmax', ceil(min(50, N/(D*D)/3)), ... 'Cmin', 1, ... 'verbose', 0, ... 'thr', 1e-6, ... 'animate', 0, ... 'covtype', 0, ... 'broken', 1, ... 'logging', 0 ... ); if nargout>1 conf.logging = 1; varargout{1} = []; end conf = getargs(conf, varargin); C = conf.Cmax; if nargout<2 conf.logging=0; end % for logging log_covfixer2 = {}; log_loglikes = {}; log_costs = {}; log_annih = {}; log_initialmix = {}; log_mixtures = {}; if (C<1) | (C>N) C = N; mu = data.'; else % initialize mu as random points from data permi = randperm(N); mu = data(permi(1:C),:).'; % D x C end % initialize sigma

Page 47: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L47

s2 = max(diag(gmmb_covfixer(cov(data,1))/10)); sigma = repmat(s2*eye(D), [1 1 C]); % weights initialization alpha = ones(1,C) * (1/C); log_initialmix = struct(... 'weight', alpha, ... 'mu', mu, ... 'sigma', sigma); % the number of free parameters in a Gaussian if isreal(data) | (conf.broken ~= 0) if conf.covtype == 1 Nparc = D+D; % (N) else Nparc = D+D*(D+1)/2; % (N) end else % data is complex valued if conf.covtype == 1 Nparc = 2*D + D; % (N) else Nparc = 2*D + D*D; % (N) end end Nparc2 = Nparc/2; N_limit = (Nparc+1)*3*conf.Cmin; if N < N_limit warning_wrap('gmmb_fj:data_amount', ... ['Training data may be insufficient for selected ' ... 'minimum number of components. ' ... 'Have: ' num2str(N) ', recommended: >' num2str(N_limit) ... ' points.']); end if conf.animate ~= 0 aniH = my_plot_init; my_plot_ellipses(aniH, data, mu, sigma, alpha); end t = 0; Cnz = C; % (k_nz) k = kmax Lmin = NaN; u = zeros(N,C); % semi_indic.' for c = 1:C u(:,c) = gmmb_cmvnpdf(data, mu(:,c).', sigma(:,:,c)); end

Page 48: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L48

indic = u .* repmat(alpha, N,1); old_loglike = sum(log(sum(realmin+indic, 2))); old_L = Nparc2*sum(log(alpha)) + (Nparc2+0.5)*Cnz*log(N) - old_loglike; while Cnz >= conf.Cmin repeating = 1; fixing_cycles = 0; loops = 0; while repeating t = t+1; loops = loops +1; fixed_on_this_round = 0; log_covfixer2{t,1} = 0; c = 1; while c <= C indic = u .* repmat(alpha, N,1); normindic = indic ./ (realmin + repmat(sum(indic,2), 1,C)); normf = 1/sum(normindic(:,c)); aux = repmat(normindic(:,c), 1,D) .* data; nmu = normf * sum(aux,1); mu(:,c) = nmu.'; if conf.covtype == 1 nsigma = normf*diag(sum(aux .* conj(data), 1)) - diag(nmu.*conj(nmu)); else nsigma = normf*(aux' * data) - nmu'*nmu; end [sigma(:,:,c) log_fixcount] = gmmb_covfixer(nsigma); % covfixer may change the matrix so that log-likelihood % decreases. So, if covfixer changes something, % disable the stop condition. If going into infinite % fix/estimate -loop, quit. if conf.logging>0 % the component indexes are not constants, % cannot record component-wise fix counts log_covfixer2{t,1} = ... log_covfixer2{t,1} + log_fixcount; end alpha(c) = max(0, sum(normindic(:,c))-Nparc2) / N; alpha = alpha / sum(alpha); if ~all( isfinite(alpha(:)) ) % something went wrong % probably there is not enough data to %support estimation

Page 49: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L49

warning_wrap('gmmb_fj:weight_finity', 'Mixture weights are no longer finite, aborting estimation.'); alpha(:) = 0; Cnz = 0; repeating = 0; end if alpha(c) == 0 Cnz = Cnz -1; else if log_fixcount ~= 0 % mark the covariance fix only, % if the component is not annihilated fixed_on_this_round = 1; end try u(:,c) = gmmb_cmvnpdf( data, ... mu(:,c).', sigma(:,:,c) ); catch disp('covariance went bzrk !!!'); sigma(:,:,c) %keyboard Cnz = 0; end end c=c+1; if Cnz <= 0 % number of components fell to zero % nothing can be done error('Estimation failed, number of components fell to zero. Not enough training data?'); end end % while c <= C % purge alpha == 0 if necessary annihilated_count = length(find(alpha==0)); if annihilated_count > 0 nz = find(alpha>0); alpha = alpha(nz); mu = mu(:,nz); sigma = sigma(:,:,nz); u = u(:,nz); C = length(nz); end if conf.animate ~= 0 my_plot_ellipses(aniH, data, mu, sigma, alpha); end u = zeros(N,C); % semi_indic.' for c = 1:C u(:,c) = gmmb_cmvnpdf(data, mu(:,c).', sigma(:,:,c)); end indic = u .* repmat(alpha, N,1);

Page 50: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L50

loglike = sum(log(realmin+sum(indic, 2))); L = Nparc2*sum(log(alpha)) + (Nparc2+0.5)*Cnz*log(N) - loglike; if conf.verbose ~= 0 disp(['Cnz=' num2str(Cnz) ' t=' num2str(t) ' '... num2str(abs(loglike - old_loglike)) ... ' <? ' num2str(conf.thr*abs(old_loglike))]); disp(['t=' num2str(t) ' L= ' num2str(L)]); end if conf.logging>0 log_loglikes{t} = loglike; log_costs{t} = L; log_annih{t} = [annihilated_count, 0]; end if conf.logging>1 log_mixtures{t} = struct(... 'weight', alpha, ... 'mu', mu, ... 'sigma', sigma); end if fixed_on_this_round ~= 0 % if any cov's were fixed, increase count and % do not evaluate stopping threshold. fixing_cycles = fixing_cycles +1; if conf.verbose ~= 0 disp(['fix cycle ' num2str(fixing_cycles)]); end else % no cov's were fixed this round, reset the counter % and evaluate threshold. fixing_cycles = 0; if (abs(loglike/old_loglike -1) < conf.thr) repeating = 0; end end old_L = L; old_loglike = loglike; if fixing_cycles > 20 repeating = 0; end if loops > conf.maxloops repeating = 0; end end % while repeating if isnan(Lmin) | (L <= Lmin) Lmin = L; estimate = struct('mu', mu,...

Page 51: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L51

'sigma', sigma,... 'weight', alpha.'); end if conf.verbose ~= 0 disp(['Cnz = ' num2str(Cnz)]); end % annihilate the least probable component m = find(alpha == min(alpha(alpha>0))); alpha(m(1)) = 0; Cnz = Cnz -1; % alpha doesn't need to be normalized here, even if it would seem logical to do so. if conf.logging > 0 log_annih{t}(2) = 1; end if Cnz > 0 alpha = alpha / sum(alpha); % purge alpha == 0 if necessary if length(find(alpha==0)) > 0 nz = find(alpha>0); alpha = alpha(nz); mu = mu(:,nz); sigma = sigma(:,:,nz); u = u(:,nz); C = length(nz); end u = zeros(N,C); % semi_indic.' for c = 1:C u(:,c) = gmmb_cmvnpdf(data, mu(:,c).', sigma(:,:,c)); end indic = u .* repmat(alpha, N,1); old_loglike = sum(log(realmin+sum(indic, 2))); old_L = Nparc2*sum(log(alpha)) + (Nparc2+0.5)*Cnz*log(N) - old_loglike; end end if conf.logging>1 varargout{1} = struct(... 'iterations', {t}, ... 'costs', {cat(1,log_costs{:})}, ... 'annihilations', {sparse(cat(1,log_annih{:}))}, ... 'covfixer2', {cat(1,log_covfixer2{:})}, ... 'loglikes', {cat(1,log_loglikes{:})}, ... 'initialmix', {log_initialmix}, ... 'mixtures', {log_mixtures}); end if conf.logging == 1

Page 52: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L52

varargout{1} = struct(... 'iterations', {t}, ... 'costs', {cat(1,log_costs{:})}, ... 'annihilations', {sparse(cat(1,log_annih{:}))}, ... 'covfixer2', {cat(1,log_covfixer2{:})}, ... 'loglikes', {cat(1,log_loglikes{:})} ... ); end % purge alpha==0 e = estimate; inds = find(e.weight>0); estimate.mu = e.mu(:,inds); estimate.sigma = e.sigma(:,:,inds); estimate.weight = e.weight(inds); if conf.animate ~= 0 my_plot_ellipses(aniH, data, estimate.mu, estimate.sigma, estimate.weight); end %disp(['Cfinal = ' num2str(length(inds))]); % ----------------------------------------------------------- function h = my_plot_init; h = figure; figure(h); title('Distribution of x_1 and x_2 values','FontSize',14); xlabel('x_1 value','FontSize',14); ylabel('x_2 value','FontSize',14); zlabel('weight','FontSize',14); view(2) tic; function my_plot_ellipses(h, data, mu, sigma, weight); dtime = 0.3; D = size(mu, 1); if D ~= 2 error('Can plot only 2D objects.'); end [x,y,z] = cylinder([2 2], 40); xy = [ x(1,:) ; y(1,:) ]; figure(h); plot(data(:,1), data(:,2), 'rx'); hold on C = size(mu, 2);

Page 53: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L53

for c = 1:C mxy = chol(sigma(:,:,c))' * xy; x = mxy(1,:) + mu(1,c); y = mxy(2,:) + mu(2,c); z = ones(size(x))*weight(c); plot3(x,y,z, 'k-'); end drawnow; hold off t = toc; if t+0.01<dtime pause(dtime-t); end tic ------------------------------------------------------------------------------------------------------ %GMMB_GENERATEHIST Create histS structure for PDF-value - density quantile mapping. % % histS = GMMB_GENERATEHIST(bayesS, N) % % bayesS parameters for the distributions to be used % N number of approximation points per class % % This function creates ordered lists of PDF-values of % random points generated by given distributions (bayesS). % These lists can be used to evaluate distribution density quantiles. % % See gmmb_hist, gmmb_lhood2frac, gmmb_frac2lhood, gmmb_fracthresh % % References: % [1] Paalanen, P., Kamarainen, J.-K., Ilonen, J., Kälviäinen, H., % Feature Representation and Discrimination Based on Gaussian Mixture Model % Probability Densities - Practices and Algorithms, Research Report 95, % Lappeenranta University of Technology, Department of Information % Technology, 2005. % % Author(s): % Pekka Paalanen <[email protected]> % Jarmo Ilonen <[email protected]> % Joni Kamarainen <[email protected]> % % Copyright: % % Bayesian Classifier with Gaussian Mixture Model Pdf % functionality is Copyright (C) 2004 by Pekka Paalanen and % Joni-Kristian Kamarainen. % % $Name: $ $Revision: 1.2 $ $Date: 2005/04/14 10:33:34 $ % function histS = gmmb_generatehist(bayesS, N); K = size(bayesS,2);

Page 54: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L54

histS = {}; for k = 1:K samples = []; Mu = bayesS(k).mu; for c = 1:size(Mu, 2) n = ceil(N*bayesS(k).weight(c)); if ~isreal(Mu) samples = [ samples; ... gmmb_mkcplx(Mu(:,c).', bayesS(k).sigma(:,:,c), n) ]; else samples = [ samples; ... mvnrnd(Mu(:,c).', bayesS(k).sigma(:,:,c), n) ]; end end dens = gmmb_pdf( samples, bayesS(k) ); histS(k) = {sort(dens)}; end ------------------------------------------------------------------------------------------------------ %GMMB_HIST Create histS structure from data for PDF-value - density quantile mapping % % histS = GMMB_HIST(data, type, bayesS) % % data, type are the training data used to create the bayesS. % % This function creates ordered lists of training sample % PDF-values for PDF-value - density quantile mapping. % % See gmmb_generatehist, gmmb_lhood2frac, gmmb_frac2lhood, gmmb_fracthresh % % References: % [1] Paalanen, P., Kamarainen, J.-K., Ilonen, J., Kälviäinen, H., % Feature Representation and Discrimination Based on Gaussian Mixture Model % Probability Densities - Practices and Algorithms, Research Report 95, % Lappeenranta University of Technology, Department of Information % Technology, 2005. % % Author(s): % Pekka Paalanen <[email protected]> % Jarmo Ilonen <[email protected]> % Joni Kamarainen <[email protected]> % % Copyright: % % Bayesian Classifier with Gaussian Mixture Model Pdf % functionality is Copyright (C) 2004 by Pekka Paalanen and % Joni-Kristian Kamarainen. % % $Name: $ $Revision: 1.2 $ $Date: 2005/04/14 10:33:34 $ %

Page 55: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L55

function histS = gmmb_hist(data_, type_, bayesS); K = size(bayesS,2); histS = {}; for k = 1:K samples = data_(type_==k, :); dens = gmmb_pdf( samples, bayesS(k) ); histS(k) = {sort(dens)}; end ------------------------------------------------------------------------------------------------------ %GMMB_NORMALIZE Normalize a matrix so that row sums are one. % % p_out = GMMB_NORMALIZE(p_in) % % p_in = N x K matrix % p_out = N x K matrix % % If an unnormalized row sum would be zero, % the row is left untouched. % % Author(s): % Pekka Paalanen <[email protected]> % % Copyright: % % Bayesian Classifier with Gaussian Mixture Model Pdf % functionality is Copyright (C) 2003, 2004 by Pekka Paalanen and % Joni-Kristian Kamarainen. % % $Name: $ $Revision: 1.1 $ $Date: 2004/11/02 08:32:22 $ % function p_out = gmmb_normalize(p_in); K = size(p_in, 2); divi = sum(p_in, 2); divi(divi==0) = 1; p_out = p_in ./ repmat(divi, 1, K); ------------------------------------------------------------------------------------------------------ %GMMB_PDF - (Complex range) multivariate Gaussian mixture model pdf % % p = gmmb_pdf(data, bayesS) % % data = N x D matrix % bayesS = 1 x K struct array, the bayesS struct, % fields used: % mu = D x C matrix

Page 56: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L56

% sigma = D x D x C matrix array % weight = C x 1 vector % % p = N x K matrix % % D dimensions, N points, C components, K classes % % The result is a matrix of PDF values computed for % each data point and class. % see: GMMB_CMVNPDF % Author: Pekka Paalanen <[email protected]> % % $Name: $ % $Id: gmmb_pdf.m,v 1.2 2004/11/02 09:00:18 paalanen Exp $ function [pdf] = gmmb_pdf(data_, bayesS_); N = size(data_,1); K = size(bayesS_, 2); pdf = zeros(N,K); for k = 1:K weight = bayesS_(k).weight; mu = bayesS_(k).mu; sigma = bayesS_(k).sigma; p = zeros(N,1); for c = 1:size(weight,1); p = p + weight(c) * ... gmmb_cmvnpdf(data_, mu(:,c).', sigma(:,:,c)); end pdf(:,k) = p; end ------------------------------------------------------------------------------------------------------ function [W,M,R,varargout] = gmmbvl_em(X,kmax,nr_of_cand,plo,dia, logging) % gmmbvl_em - EM algorithm for adaptive multivariate Gaussian mixtures % %[W,M,R,stats] = gmmbvl_em(X,kmax,nr_of_cand,plo,dia, logging) % X - (n x d) d-dimensional zero-mean unit-variance data % kmax - maximum number of components allowed % nr_of_cand - number of candidates per component, zero gives non-greedy EM % plo - if 1 then plot ellipses for 2-d data % dia - if 1 then print diagnostics % logging - logging level, see gmmb_gem.m %returns % W - (k x 1) vector of mixing weights % M - (k x d) matrix of components means % R - (k x d^2) matrix of Cholesky submatrices of components covariances % in vector reshaped format. To get the covariance of component k: % Rk = reshape(R(k,:),d,d); S = Rk'*Rk;

Page 57: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L57

% stats - (optional) the log, see gmmb_gem.m % % Nikos Vlassis & Sjaak Verbeek, oct 2002 % see greedy-EM paper at http://www.science.uva.nl/~vlassis/publications % % $Name: $ THRESHOLD = 1e-5; [n,d] = size(X); n1=ones(n,1); d1=ones(1,d); if d > 2 plo = 0; end if plo figure(1); set(1,'Double','on'); end if nr_of_cand k = 1; if dia fprintf('Greedy '); end else k = kmax; if dia fprintf('Non-greedy '); end end if dia fprintf('EM initialization\n'); end % logging if nargout == 4 varargout{1} = []; end log_loglikes = {}; full_em_loops = 0; part_em_loops = 0; [W,M,R,P,sigma] = gmmbvl_em_init_km(X,k,0); sigma=sigma^2; oldlogl = -realmax;

Page 58: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L58

while 1 % apply EM steps to the complete mixture until convergence if dia fprintf('EM steps'); end while 1 [W,M,R] = gmmbvl_em_step(X,W,M,R,P,plo); full_em_loops = full_em_loops+1; if dia fprintf('.'); end % likelihoods L (n x k) for all inputs and all components L = gmmbvl_em_gauss(X,M,R); % mixture F (n x 1) and average log-likelihood F = L * W; F(find(F < realmin)) = realmin; logl = mean(log(F)); % posteriors P (n x k) and their sums P = L .* (ones(n,1)*W') ./ (F*ones(1,k)); if logging > 0 log_loglikes{full_em_loops+part_em_loops} = ... sum(log(F)); end if abs(logl/oldlogl-1) < THRESHOLD if dia fprintf('\n'); fprintf('Logl = %g\n', logl); end break; end oldlogl = logl; end if k == kmax; break; end if dia fprintf('Trying component allocation'); end [Mnew,Rnew,alpha] = gmmbvl_rand_split(P,X,M,R,sigma,F,W,nr_of_cand); if alpha==0 break; end

Page 59: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L59

K = gmmbvl_em_gauss(X,Mnew,Rnew); PP = F*(1-alpha)+K*alpha; LOGL = mean(log(PP)); % optimize new mixture with partial EM steps updating only Mnew,Rnew veryoldlogl = logl; oldlogl = LOGL; done_here=0; Pnew = (K.*(ones(n,1)*alpha))./PP; while ~done_here if dia fprintf('*'); end [alpha,Mnew,Rnew] = gmmbvl_em_step(X,alpha,Mnew,Rnew,Pnew,0); part_em_loops = part_em_loops+1; K = gmmbvl_em_gauss(X,Mnew,Rnew); Fnew = F*(1-alpha)+K*alpha; Pnew = K*alpha./Fnew; logl = mean(log(Fnew)); if logging > 0 log_loglikes{full_em_loops+part_em_loops} = ... sum(log(Fnew)); end if abs(logl/oldlogl-1)<THRESHOLD done_here=1; end oldlogl=logl; end % check if log-likelihood increases with insertion if logl <= veryoldlogl if dia fprintf('Mixture uses only %d components\n', k); end break; end % allocate new component M = [M; Mnew]; R = [R; Rnew]; W = [(1-alpha)*W; alpha]; k = k + 1; if dia fprintf(' k = %d\n', k); fprintf('LogL = %g\n', logl);

Page 60: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L60

end % prepare next EM step L = gmmbvl_em_gauss(X,M,R); F = L * W; F(find(F<realmin))=realmin; P = L .* (ones(n,1)*W') ./ (F*ones(1,k)); end if logging > 1 varargout{1} = struct( ... 'iterations', {full_em_loops + part_em_loops}, ... 'loglikes', {cat(1,log_loglikes{:})} ... ); end if logging == 1 varargout{1} = struct( ... 'iterations', {full_em_loops + part_em_loops}, ... 'loglikes', {cat(1,log_loglikes{:})} ... ); end function [X,T,L1,L2] = gmmbvl_mixgen(n,m,k,d,c,e) %gmmbvl_mixgen - Gaussian mixture generator % %[X,T] = gmmbvl_mixgen(n,m,k,d,c,e) % n - size of training set % m - size of test set % k - number of components % d - dimension % c - separation degree % e - maximum eccentricity %returns % X - training set (n x d) % T - test set (m x d) % Nikos Vlassis, 2000 % for definitions see (Dasgupta, 1999) % % $Name: $ R=zeros(k,d^2); % mixing weights while 1 W = rand(k,1); W = W / sum(W); if all(W > 1/(4*k)) break; end end

Page 61: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L61

% create c-separated Gaussian clusters of maximum eccentricity e trials = 1; while 1 X = []; T = []; M = randn(k,d)*sqrt(k)*sqrt(c)*trials/10; Trace = zeros(k,1); for j = 1:k U = rand(d,d)-0.5; U = sqrtm(inv(U*U')) * U; L = diag(rand(d,1)*(e-1)+1).^2/100; msg = 1; while msg [C,msg] = chol(U*L*U'); end R(j,:)=C(:)'; nj = ceil(n*W(j)); Xj = randn(nj,d) * C; X = [X; repmat(M(j,:),nj,1) + Xj]; Trace(j) = trace(cov(Xj)); mj = ceil(m*W(j)); Tj = randn(mj,d) * C; T = [T; repmat(M(j,:),mj,1) + Tj]; end % check degree of separation error = 0; for i = 1:k-1 for j = i+1:k if norm(M(i,:)-M(j,:)) < c * sqrt(max(Trace(i),Trace(j))) error = 1; end end end if ~error break; end trials = trials + 1; end L = gmmbvl_em_gauss(X,M,R); F = L*W; F(find(F < eps)) = eps; L1 = mean(log(F)); if ~isempty(T) L = gmmbvl_em_gauss(T,M,R); F = L*W; F(find(F < eps)) = eps; L2 = mean(log(F)); End function [woh,woo,es] = nntrain(i,N,o,lr,its,wih,wio,bu) % [woh,woo,es] = nntrain(i,N,o,lr,its,wih,wio,b) Train neur net with 1 hid lyr

Page 62: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L62

% i is a matrix of input pattern rows; % N is normalization [means; stds] for data in i (empty: calc from i) % o are corresponding output pattern rows. % wih is the initial set of input-to-hidden weights % if wih is a scalar, it is the initialized hidden layer size. % wio is the initial set of hidden-to-output weights % lr is the learning rate (default 0.1) % its is the number of iterations to perform (default 10) % b is the bunch size - patterns calculated before weight update (dflt 16) % Perform online backprop of mean-square error for sigmoid units. % weight matrices have one extra row for biases. % es returns the mse/pat for each iteration % 2001-02-08 [email protected] % $Header: $ isize = size(i, 2); osize = size(o, 2); npat = size(i, 1); % Random presentation order ord = randperm(npat); if nargin < 4 lr = 0.01; end if nargin < 5 its = 10; end if nargin < 6 wih = 10; end if length(wih) == 1 wih = rand(wih, isize + 1); end nhid = size(wih,1); if nargin < 7 | length(wio) == 0 wio = rand(osize, nhid + 1); end if nargin < 8 bu = 16; end if length(N) == 0 % N = ones(2, isize); N = [mean(i);std(i)]; end woh = wih; woo = wio; es = zeros(1,its); % How many patterns to train at once (before updating weights)

Page 63: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L63

% (faster because can use matrix ops to accelerate fwd pass) bunchsize = bu; for it = 1:its sumE2 = 0; for n = 1:bunchsize:npat ipx = n:min(n+bunchsize-1,npat); nbun = length(ipx); ip = (i(ord(ipx),:) - ones(nbun,1)*N(1,:))./(ones(nbun,1)*N(2,:)); op = o(ord(ipx),:); % Calculate forward hidsum = woh*[ip,ones(nbun,1)]'; hidact = 1./(1+exp(-hidsum)); outsum = woo*[hidact;ones(1,nbun)]; outact = 1./(1+exp(-outsum)); % Calculate error E2 = sum((outact - op').^2); sumE2 = sumE2 + sum(E2); % Backpropogate Do = outact - op'; Dh = Do' * woo(:,[1:nhid]); dEdxo = 2 * Do .* (outact .* (1 - outact)); dEdwo = dEdxo * [hidact;ones(1,nbun)]'; woo = woo - lr*dEdwo; dEdxh = 2 * Dh' .* (hidact .* (1 - hidact)); dEdwh = dEdxh * [ip';ones(1,nbun)]'; woh = woh - lr*dEdwh; end % loop over patterns es(it) = sqrt(sumE2/npat); if rem(it,20)==0 disp(['Iteration=', num2str(it), ' LR=',num2str(lr),' MSError =', num2str(es(it))]); end end % iteration loop function [mo,vo,co,jx] = gmmest(x,mi,vi,ci,its,viz) % [mo,vo,co] = gmmest(x,mi,vi,ci,its,viz) Estimate Gaussian mixture models % Model the distribution of data x with Gaussians. % mi and vi specify initial means and variances for the models; % scalar <mi> just uses that many mixture components (default 5). % ci is initial mixture weights % its is the number of iterations to perform (default 20)

Page 64: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L64

% If viz is 1, plot first 2 dims at each iteration/ -1, just at end % mo is a matrix of means (one row per Gaussian) and % vo is a matrix of (unravelled) covariance matrices. % co is the vector of mixture priors % jx is the 'fuzzy membership' (posterior mix weights) for each x % 2001-02-11 [email protected] % $Header: $ if nargin < 2 mi = 5; end % Global data properties [ndat,ndim] = size(x); meanx = mean(x); covx = cov(x); % Total number of points in cov (to unravel) ncov = prod(size(covx)); % Eigen analysis of inverse covariance [u,s,v] = svd(inv(covx)); if prod(size(mi)) == 1 nmix = mi; % Random initial means around global mean, distributed like data mi = (ones(nmix,1) * meanx) + (v*inv(sqrt(s))*randn(ndim, nmix))'; end if nargin < 3 vi = []; end if prod(size(vi)) == 0 % Uniform covariances from global (each unraveled on a row) vi = ones(nmix,1)*covx(1:ncov); end if nargin < 4 ci = []; end if prod(size(ci)) == 0 ci = ones(1,nmix)/nmix; end if nargin < 5 its = 20; end if nargin < 6 viz = 0; end mo = mi; vo = vi;

Page 65: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L65

co = ci; lik = -9999; pistuff = (2*pi) ^ -(ndim/2); jx = zeros(ndat, nmix); if viz ~= 0 & ndim == 1 % precompute histogram [histn, histx] = hist(x(:,1),100); vscale = max(histn); end for it = 1:its xlik = zeros(ndat,nmix); if viz == 1 if ndim == 1 bar(histx, histn); gmmplot(mo,vo,co,[1],vscale*min(sqrt(vo)./co'),'r'); else plot(x(:,1),x(:,2),'.b'); gmmplot(mo,vo,co,[1 2],1,'r'); end pause end % Calculate posterior data memberships for each component for c = 1:nmix % Reconstruct covar mx cv = reshape(vo(c,:),ndim,ndim); mu = ones(ndat,1)*mo(c,:); xmm = x - mu; % Evaluate Gaussians if ndim == 1 % Matlab syntax bites us px = exp(-0.5* (xmm'.*(inv(cv)*xmm')))/sqrt(det(cv)); else px = exp(-0.5*sum(xmm'.*(inv(cv)*xmm')))/sqrt(det(cv)); end jx(:,c) = co(c)*px'; % Save l/hood for each pt under each mix xlik(:,c) = pistuff*co(c)*px'; end % Report data likelihood before this iteration olik = lik; lik = sum(log(sum(xlik'))); if viz ~= 0 & rem(it,10) == 1 disp(['Iteration=', num2str(it),' Log data likelihood = ', num2str(lik), ' delta=',num2str(lik-olik)]); end % Normalize rows of p(j|x) to be true posteriors

Page 66: L1 unit Main; SysUtils, Windows, Messages, Classes ...thesis.binus.ac.id/asli/lampiran/2007-1-00332-mtif-lampiran.pdfL1 unit Main; interface uses SysUtils, Windows, Messages, Classes,

L66

jx = jx ./ (ones(nmix,1)*sum(jx'))'; % Re-estimate model parameters one mixture component at a time for c = 1:nmix jxc = jx(:,c); sjxc = sum(jxc); co(c) = sjxc/ndat; mo(c,:) = (jxc'*x)/sjxc; mu = ones(ndat,1)*mo(c,:); xmm = x - mu; % Weighted expectation is scaled xT * x cvj = (((jxc*ones(1,ndim)) .* xmm)' * xmm) / sjxc; % Store in raveled form vo(c,:) = cvj(1:ncov); end end if viz == -1 if ndim == 1 bar(histx, histn); gmmplot(mo,vo,co,[1],vscale*min(sqrt(vo)./co'),'r'); else plot(x(:,1),x(:,2),'.b'); gmmplot(mo,vo,co,[1 2],1,'r'); end end