![]() | |
Tampilan Projectnya. |
Sabtu, 30 Juni 2012
MultiMedia Player
Kamis, 28 Juni 2012
Game Snack Dengan Delphi
![]() |
Project aplikasi Snack dengan menggunakan delphi 7 |
of delphi dynamic array can be used for snake.
language: delphi 1 (code chould work with any version of delphi)
author: Joakim Skoglund
email: mmiskim@hotmail.com
freeware with open source code - please do whatever you want with this code
disclaimer: use on your own risk!
i can not be held responsible for any damage in software and/or
hardware or any other kind of problem caused by the use of this source code
and/or exe file. }
unit Unit1;
interface
uses
SysUtils, WinTypes, graphics, Controls, Forms, Dialogs, Classes, ExtCtrls;
type
TForm1 = class(TForm)
snakeTimer: TTimer;
procedure snakeTimerTimer(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1 : TForm1;
score : integer;
Procedure ResetGame; {// Resets the snake and score}
Function HitWall : Boolean; {// returns true if snake hits the wall}
Function HitFood : boolean; {// Returns true if snake hits food}
function HitSelf : boolean; {// Returns true if the snake hits itself}
procedure DrawSnake; {// Draws the snake, increase points if
// snake hit food,
// ends game if snake hit a wall or itself.}
Procedure PlaceFood;
procedure DrawPlayfield; {// Draws the playfield
// (the area which the snake navigates on)}
implementation
{$R *.DFM}
const
snakewidth = 10; {// specify how wide the snake is}
snakegrow : integer = 2; {// specify how fast snake grows}
snakecolor : tcolor = clBlack;
foodcolor : tcolor = clRed;
pfcolor : tcolor = clWhite; {// playfield color }
pfdimention : tpoint = (x:200; y:200); {// playfield width and hight }
pfposition : tpoint = (x:5; y:5); {// playfield position on form}
dup = 0;
ddown = 1;
dleft = 2;
dright = 3;
dnone = 4;
speed : integer = 100; { // snake speed higher value}
{ // equals slower snake }
var
snake : array[0..9099] of tpoint;{ // array holding snake}
{ // coordinates }
snakelength : integer; { // length of snake}
food : tpoint; { // food position }
direction : dup..dnone;
olddirection : dup..dnone;
{// HitWall: returns true if snake hits the wall}
Function HitWall : Boolean;
var
i : integer;
Begin
For i := 0 to snakelength - 1 do
begin
if (snake[i].x < pfposition.X) or
(snake[i].x + snakewidth > pfposition.X + pfdimention.X) or
(snake[i].y < pfposition.y) or
(snake[i].y + snakewidth > pfposition.y + pfdimention.y) then
begin
hitwall := true;
exit;
end;
end;
hitwall := false;
End;
{// HitFood: Returns true if snake hits food}
Function HitFood : boolean;
var
i : integer;
Begin
for i := 0 to snakelength - 1 do
begin
if (snake[i].x = food.x) and (snake[i].y = food.y) then
begin
hitfood := true;
exit;
end;
end;
hitfood := false;
End;
{ PlaceFood: Draws the food on the playfield on a random location}
Procedure PlaceFood;
Begin
food.x := random(pfdimention.x - snakewidth - pfposition.x) + pfposition.x;
food.y := random(pfdimention.y - snakewidth - pfposition.y) + pfposition.y;
while (pfdimention.x - (food.x - pfposition.x)) mod snakewidth <> 0 do
inc(food.x);
while (pfdimention.y - (food.y - pfposition.y)) mod snakewidth <> 0 do
inc(food.y);
if HitFood then
PlaceFood;
Form1.Canvas.Brush.Color := foodcolor;
Form1.Canvas.Pen.Color := snakecolor;
Form1.Canvas.Ellipse(food.x + 1, food.y + 1,
food.x + snakewidth - 2, food.y + snakewidth - 2);
End;
{// HitSelf: Returns true if the snake hits itself}
function HitSelf : boolean;
var
i : integer;
begin
for i := 1 to snakelength - 1 do
if (snake[0].x = snake[i].x) and (snake[0].y = snake[i].y) then
begin
hitself := true;
exit;
end;
hitself := false;
end;
{// DrawSnake: Draws the snake, increase points if snake hit food,
// ends game if snake hit a wall or itself.}
procedure DrawSnake;
var
i : integer;
Begin
if direction = dnone then
exit;
Form1.Canvas.Brush.Color := pfcolor;
Form1.Canvas.Pen.Color := pfcolor;
Form1.Canvas.Rectangle(snake[snakelength - 1].X, snake[snakelength - 1].Y,
snake[snakelength - 1].X + snakewidth, snake[snakelength - 1].Y + snakewidth);
For i := snakelength - 1 downto 1 do
snake[i] := snake[i - 1];
snake[0]:= snake[1];
case direction of
dup : dec(snake[0].y, snakewidth);
ddown : inc(snake[0].y, snakewidth);
dleft : dec(snake[0].x, snakewidth);
dright : inc(snake[0].x, snakewidth);
end;
if HitFood then
begin
inc(score, 5);
inc(snakelength, snakegrow);
for i := 1 to snakegrow do
snake[snakelength - i] := snake[(snakelength - snakegrow) - 1];
PlaceFood;
end;
if HitWall or HitSelf then
begin
form1.snaketimer.enabled := false;
showmessage(#10 + ' simple snake game version 1.0 beta ' + #10#10 +
' Stear the snake with the arrow keys or w,a,d,s,' + #10 +
' pause game with space.' + #10 +
' Collect points eating food.' + #10 +
' Avoid hitting the walls and yourself.' + #10#10 +
' OK to start, end by Alt-F4x2.' + #10#10 +
' Score: ' + inttostr(score));
ResetGame;
end;
Form1.Canvas.Brush.Color := snakecolor;
Form1.Canvas.Pen.Color := snakecolor;
case direction of
dup : Form1.Canvas.Rectangle(snake[0].X+1, snake[0].Y+1,
snake[0].X + snakewidth-1, snake[0].Y + snakewidth+1);
ddown : Form1.Canvas.Rectangle(snake[0].X+1, snake[0].Y-1,
snake[0].X + snakewidth-1, snake[0].Y + snakewidth-1);
dleft : Form1.Canvas.Rectangle(snake[0].X+1, snake[0].Y+1,
snake[0].X + snakewidth+1, snake[0].Y + snakewidth-1);
dright : Form1.Canvas.Rectangle(snake[0].X-1, snake[0].Y+1,
snake[0].X + snakewidth-1, snake[0].Y + snakewidth-1);
end;
End;
{// DrawPlayField: Draws the playfield (the area where the snake navigates on)}
procedure DrawPlayfield;
begin
Form1.Canvas.Brush.Color := pfcolor;
Form1.Canvas.Pen.Color := pfcolor;
Form1.Canvas.Rectangle(pfposition.x, pfposition.y,
pfdimention.x + pfposition.x, pfdimention.y + pfposition.y);
end;
{// ResetGame: Resets the game; resets the snake and score}
Procedure ResetGame;
var
i : integer;
Begin
form1.snaketimer.enabled := false;
randomize;
snakelength := 10;
snake[0].x := pfposition.x + (pfdimention.x div 2) - (snakewidth div 2);
snake[0].y := pfposition.y + (pfdimention.y div 2) - (snakewidth div 2);
while ((pfdimention.x-(snake[0].x-pfposition.x)) mod snakewidth <> 0) do
inc(snake[0].x);
while ((pfdimention.y-(snake[0].y-pfposition.y)) mod snakewidth <> 0) do
inc(snake[0].y);
for i := 1 to snakelength - 1 do
snake[i] := snake[0];
score := 0;
food.x := 0;
food.y := 0;
direction := dright;
olddirection := direction;
DrawPlayfield;
DrawSnake;
PlaceFood;
form1.snaketimer.Interval := speed;
form1.snaketimer.enabled := true;
End;
procedure TForm1.snakeTimerTimer(Sender: TObject);
begin
olddirection := direction;
DrawSnake;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
form1.ClientWidth := pfdimention.x + (pfposition.x * 2);
form1.ClientHeight := pfdimention.y + (pfposition.y * 2);
form1.Color := clBlack;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case chr(key) of
chr(38),'w', 'W': if olddirection <> ddown then direction := dup;
chr(40),'s', 'S': if olddirection <> dup then direction := ddown;
chr(37),'a', 'A': if olddirection <> dright then direction := dleft;
chr(39),'d', 'D': if olddirection <> dleft then direction := dright;
#32: direction := dnone;
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
ResetGame;
end;
end.
Download Snack
Sejarah dan Perkembangan Bahasa Pemrograman Delphi
Seharusnya ini menjadi postingan pertama
dalam kategori Delphi. Tapi tak apalah. Bagi anda yang sedang dan ingin
belajar atau sekedar ingin mengetahui tentang sejarah delphi, semoga
tulisan ini bisa memberikan informasi yang berguna bagi anda.
Borland
Delphi adalah bahasa tingkat tinggi dan terkompilasi yang mendukung
bahasa terstruktur serta Perancangan Berorientasi Object (OOD). Delphi
menggunakan bahasa Pascal, sebuah bahasa terstruktur generasi ketiga.
Delphi menawarkan gaya pemrograman yang bersih dan konsisten dan yang
terpenting menghasilkan aplikasi yang lebih dapat diandalkan.
Pascal dan Sejarahnya
Asal usul Pascal bermula dari rancangan
Algol, bahasa tingkat tinggi pertama yang mudah dibaca, terstruktur dan
mendefinisikan sintax secara sistematis. Pada akhir tahun 1960-an
(196x), beberapa usulan evolusi penerus algol dikembangkan. Salah satu
yang paling sukses adalah Pascal, ditemukan oleh Prof Niklaus Wirth.
Wirth mempublikasikan temuan asli Pascal pada tahun 1971. Mulai
diimplementasikan di tahun 1973 dengan beberapa modifikasi. Banyak
fitur pascal yang berasal dari bahasa sebelumnya. Pernyataan Case dan parameter value-result
berasal dari Algol, dan catatan struktur yang mirip dengan Cobol dan PL
1. Pascal menambahkan kemampuan untuk mendefinsikan tipe data baru
secara lebih sederhana dari yang pernah ada. Pascal juga mendukung
struktur data dinamis, contohnya : struktur data yang dapat tumbuh dan
menyusut saat program berjalan. Bahasa ini dirancang untuk menjadi alat
pembelajaran bagi siswa pada kelas pemrograman.
Pada tahun 1975, Wirth dan Jensen
memproduksi buku referensi Pascal terakhir “Pascal User Manual and
Report”. Wirth berhenti bekerja pada Pascal pada tahun 1977 untuk
menciptakan sebuah bahasa baru, Modula – penerus Pascal.
Borland Pascal
Dengan dirilisnya Turbo Pascal 1.0 pada
November 1983, Borland mulai perjalanannya dengan lingkungan
pengembangan dan perangkatnya. Untuk menciptakan Turbo Pascal 1.0
Borland melisensikan kompilator inti pascal yang cepat dan murah, yang
ditulis oleh Anders Hejlsberg. Turbo Pascal memperkenalkan suatu
Lingkungan pengembangan terintegrasi / Integrated Development
Environment (IDE) dimana anda dapat mengedit code, menjalankan compiler,
melihat kesalahan dan melompat kembali ke baris yang mengalami
kesalahan. Kompiler turbo pascal telah menjadi salah satu compiler
terlaris sepanjang waktu, dan membuat bahasa ini sangat popular pada
platform PC
Pada tahun 1995 Pascal kembali dengan
memperkenalkan lingkungan aplikasi bernama Delphi – mengubah pascal
menjadi sebuah bahasa pemrograman visual. Keputusan yang strategis
dengan membuat perangkat database dan konektivitas sentral dari produk
pascal.
Permulaan Delphi
Setelah merilis Turbo Pascal 1, Anders
bergabung dengan perusahaan sebagai seorang karyawan dan arsitek untuk
semua versi dari kompiler Turbo Pascal dan tiga versi pertama dari
Delphi. Sebagai kepala arsitek di Borland, Hejlsberg diam-diam merubah
Turbo Pascal menjadi bahasa pengembangan aplikasi berorientasi obyek,
lengkap dengan lingkungan yang benar-benar visual dan fitur akses
database yang luar biasa
Mengapa diberi nama “Delphi”
Seperti yang dijelaskan dalam Museum
artikel Borland, proyek dengan codename Delphi muncul pada pertengahan
1993. Mengapa Delphi? Sangat sederhana: “Jika Anda ingin berbicara
dengan Oracle, pergilah ke Delphi”. Ketika tiba saatnya untuk memilih
nama produknya, setelah sebuah artikel di ‘Windows Tech Journal’ tentang
sebuah produk yang akan mengubah hidup programmer, nama terakhir yang
diusulkan adalah AppBuilder. Sejak Novell merilis Visual AppBuilder,
orang-orang Borland perlu mengambil nama lain, tetapi menjadi semacam
komedi: semakin keras orang-orang berusaha untuk mengabaikan “Delphi”
sebagai nama produk, semakin banyak nama tersebut
mendapat dukungan. Setelah disebut-sebut sebagai “pembunuh VB” Delphi
tetap menjadi produk landasan untuk Borland.
Selasa, 26 Juni 2012
Input Nilai Rapor
![]() |
Project aplikasi Input Nilai Rapor Menggunakan Delphi 7 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, XPMan;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label12: TLabel;
Label18: TLabel;
Shape2: TShape;
edit1: TEdit;
edit2: TEdit;
edit3: TEdit;
edit4: TEdit;
edit5: TEdit;
edit6: TEdit;
edit7: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
ComboBox1: TComboBox;
Timer1: TTimer;
Label13: TLabel;
Panel1: TPanel;
Label11: TLabel;
XPManifest1: TXPManifest;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
tugas, quiz, hadir, uts, uas : real;
hasil : real;
nilai : string;
begin
tugas:=(((strtofloat(edit1.Text)+strtofloat(edit2.Text)+strtofloat(edit3.Text))/3)*0.1);
quiz:=(((strtofloat(edit4.Text)+strtofloat(edit5.Text))/2)*0.1);
hadir:=(((strtofloat(ComboBox1.Text))/14)*10);
uts:=((strtofloat(edit6.Text))*0.3);
uas:=((strtofloat(edit7.Text))*0.4);
hasil:=(tugas+quiz+hadir+uts+uas);
str(hasil:0:2,nilai);
label12.caption:=(nilai);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
edit1.Clear;
edit2.Clear;
edit3.Clear;
edit4.Clear;
edit5.Clear;
ComboBox1.Clear;
edit6.Clear;
edit7.Clear;
Label12.Caption:='';
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
label11.Left := label11.Left - 5;
if label11.Left <= -100 then
label11.Left := 550;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if MessageDlg('Apakah anda yakin untuk'+#13+'keluar dari program ini ?',
mtConfirmation,[mbYes,mbNo],0)=mrNo then
CanClose:=False;
end;
end.
Download Input Nilai Rapor
Senin, 25 Juni 2012
Jaringan Syaraf Tiruan
![]() |
Project Jaringan Syaraf Tiruan dengan menggunakan delphi 7 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, Menus, ExtCtrls, TeeProcs, Chart, ComCtrls,
StdCtrls, ALBasicAudioOut, ALAudioOut, LPComponent, ALCommonPlayer,
ALWavePlayer, math, ImgList, acAlphaImageList, sSkinProvider,
sSkinManager, Buttons, sButton;
type
Twindow=(blackman,hanning,hamming,bartlett);
T1dimensi=array of double;
Tdatabobot=array of T1dimensi;
T3dimensi=array of Tdatabobot;
TForm1 = class(TForm)
MainMenu1: TMainMenu;
OpenDialog1: TOpenDialog;
Memo1: TMemo;
ALWavePlayer1: TALWavePlayer;
ALAudioOut1: TALAudioOut;
RichEdit1: TRichEdit;
RichEdit2: TRichEdit;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
StatusBar1: TStatusBar;
Chart1: TChart;
File1: TMenuItem;
BukaFile1: TMenuItem;
AutoProcess1: TMenuItem;
Series1: TLineSeries;
sSkinManager1: TsSkinManager;
Exit1: TMenuItem;
Panel1: TPanel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Label8: TLabel;
Timer1: TTimer;
BitBtn4: TBitBtn;
componen1: TMenuItem;
Hapus1: TMenuItem;
SinyalSuara1: TMenuItem;
HeaderFile1: TMenuItem;
ProcessingSpeech1: TMenuItem;
FileSpeech1: TMenuItem;
otalSuara1: TMenuItem;
JumlahHiddenLayer1: TMenuItem;
HapusSemua1: TMenuItem;
Help1: TMenuItem;
About1: TMenuItem;
BitBtn5: TBitBtn;
Help2: TMenuItem;
Aboutme1: TMenuItem;
BitBtn6: TBitBtn;
SaveDialog1: TSaveDialog;
Exit2: TMenuItem;
rainingnProcess1: TMenuItem;
ALLDELETE1: TMenuItem;
Button1: TsButton;
Button2: TsButton;
Button3: TsButton;
Button4: TsButton;
procedure BukaFile1Click(Sender: TObject);
procedure AutoProcess1Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure SinyalSuara1Click(Sender: TObject);
procedure HeaderFile1Click(Sender: TObject);
procedure ProcessingSpeech1Click(Sender: TObject);
procedure FileSpeech1Click(Sender: TObject);
procedure otalSuara1Click(Sender: TObject);
procedure JumlahHiddenLayer1Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure Aboutme1Click(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure BitBtn6Click(Sender: TObject);
procedure Exit2Click(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure HapusSemua1Click(Sender: TObject);
procedure rainingnProcess1Click(Sender: TObject);
procedure ALLDELETE1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
MATHPHI=3.1415926535897932384626433832795;
MAXDATA=15000;//15000 sample
UKURANFRAME=2048;
FREKUENSI=12000;//12 KHz sample rate
var
Form1: TForm1;
maksuji,jumlahuji :word;
PosisiFile :Byte;
JData :integer;
Iterasi :integer;
Alpha:double;
Miu:double;
ErorMax:double;
StrIdentitas:array of string;
HUnit:array of integer;
JumHidden:Byte;
HTemp:array of integer;
RealData:array of double;
PanData:Integer;
Masuk:Tdatabobot;
Cep:Tdatabobot;
IUnit:Integer;
wbobot:Tdatabobot;
vbobot:array of Tdatabobot;
implementation
uses Unit2, Unit3, Unit4, Fourier;
{$R *.dfm}
procedure BukaFileData(const namafile:string);
var
F:File of Smallint;
dumdata:Smallint;
loop:word;
begin
AssignFile(F,namafile);
Reset(F);
Seek(F,0);
SetLength(RealData,MAXDATA);
for loop:=0 to MAXDATA-1 do
begin
Read(F,dumdata);
RealData[loop]:=dumdata;
end;
CloseFile(F);
end;
//--------------------------------
procedure LaporkanKeMemo(const namafile:string);
begin
with Form1, Memo1.Lines do
begin
Clear;
Add('Buka File : '+namafile);
Add('File speech dengan header File :');
Add('- RIFF chunck');
Add('- Mode Mono');
Add('- 12 KHZ sample rate');
Add('- 16 bit signed data');
Add('- 15000 sample data = 1.25 s');
end;
end;
//-------------------------------
procedure GraphikkanKeWave;
var
loop:word;
begin
with Form1, Series1 do
begin
Clear;
for loop:=0 to MAXDATA-1 do
Add(RealData[loop]);
end;
end;
//--------------------------------------
Procedure TampilkanProsess(proses:Byte);
var
loop1:Byte;
loop2:Byte;
begin
with Form1, RichEdit2.Lines do
begin
case proses of
0:begin
Clear;
Add('PreProcessing :');
end;
1:Add('Baca Data Sinyal Speech ...');
2:Add('Framing Data ...');
3:Add('PreEmphasis ...');
4:Add('Windowing ...');
5:Add('FFT ...');
6:Add('LPC ...');
7:Add('Cepstral ...');
100:
begin
Add('SUKSESS ...');
Add('------------------------------');
Add('Jumlah Koefisien Cepstral :'+FloatToStr(high(Cep)+1));
Add('Jumlah Frame :'+FloatToStr(high(Cep[1])+1));
for loop1:=0 to high(Cep) do
begin
Add('==============================');
for loop2:=0 to high(Cep[loop1]) do
Add('Frame['+IntToStr(loop2)+']'+'Coef['+IntToStr(loop1)+']'+
#9+ FloatToStr(Cep[loop1,loop2]));
end;
end;
end;
end;
end;
//--------------------------------
//------------------------------------------
procedure PreProcessing(sinyal:array of double);
var
p:integer;
i:integer;
j:integer;
win:array of double;
aut:array of double;
realtime:Tdatabobot;
imgtime:Tdatabobot;
realfrek:Tdatabobot;
imgfrek:Tdatabobot;
jumframe:integer;
begin
TampilkanProsess(0);
TampilkanProsess(1);
jumframe:=FrameCount(UKURANFRAME,UKURANFRAME div 3,
high(sinyal)+1);
setlength(realtime,jumframe);
setlength(imgtime,jumframe);
setlength(realfrek,jumframe);
setlength(imgfrek,jumframe);
setlength(Cep,jumframe);
TampilkanProsess(2);
pre_emphasis(0.94,sinyal);
setlength(realtime,jumframe);
for i:=0 to jumframe-1 do
begin
setlength(realtime[i],UKURANFRAME);
setlength(imgtime[i],UKURANFRAME);
setlength(realfrek[i],UKURANFRAME);
setlength(imgfrek[i],UKURANFRAME);
end;
TampilkanProsess(3);
framing(UKURANFRAME,UKURANFRAME div 3,sinyal,realtime);
TampilkanProsess(4);
setlength(win,UKURANFRAME);
win_sinyal(0,hanning,win);
TampilkanProsess(5);
for i:=0 to jumframe-1 do
for j:=0 to UKURANFRAME-1 do
realtime[i,j]:=realtime[i,j]*win[j];
for i:=0 to jumframe-1 do
fft(UKURANFRAME,realtime[i],imgtime[i],realfrek[i],imgfrek[i]);
for i:=0 to jumframe-1 do
for j:=0 to UKURANFRAME-1 do
realfrek[i,j]:=sqrt(sqr(realfrek[i,j])+sqr(imgfrek[i,j]));
TampilkanProsess(6);
p:=MakeOrder(FREKUENSI);
setlength(aut,p+1);
for i:=0 to jumframe-1 do
begin
setlength(Cep[i],p+1);
LPCAnalisis(realfrek[i],UKURANFRAME,p,aut);
lpc2cepstral(p,p,aut,Cep[i]);
weightingcepstral(p,Cep[i]);
end;
TampilkanProsess(7);
TampilkanProsess(100);
end;
//---------------------------------
function InitTarget(var target:Tdatabobot):integer;
var
a:integer;
b:integer;
sisa:integer;
ounit:integer;
begin
setlength(target,jdata);
sisa:=jdata mod 3;
if sisa<>0 then
sisa:=1;
ounit:=jdata div 3 +sisa+1;
for a:=0 to jdata-1 do
begin
setlength(target[a],ounit);
for b:=1 to ounit-1 do
target[a,b]:=0.1;
target[a,1+ a div 3]:=0.3+ 0.3*(a mod 3);
end;
result:=ounit;
end;
//-----------------------------------------
function CekBobotAll(hiden_in,hiden:Tdatabobot;
out_in,output:t1dimensi;
target:Tdatabobot;jhiden:integer):boolean;
var
i:integer;
num:integer;
kenal:integer;
sum:double;
begin
result:=false;
kenal:=0;
for num:=0 to high(masuk) do
begin
//---------feedforrward proses---------//
LayerIn(masuk[num],hiden_in[0],vbobot[0]);
FungsiAktivasi(hiden_in[0],hiden[0]);
if high(hunit)>0 then
for i:=0 to high(hunit)-1 do
begin
LayerIn(hiden[i],hiden_in[i+1],vbobot[i+1]);
FungsiAktivasi(hiden_in[i+1],hiden[i+1]);
end;
LayerIn(hiden[jhiden-1],out_in,wbobot);
FungsiAktivasi(out_in,output);
sum:=0;
for i:=1 to high(output) do
sum:=sum+abs(output[i]-target[num,i]);
sum:=sum/jdata;
if sum<ErorMax then
inc(kenal);
end;
if kenal=jdata then
result:=true;
end;
//--------------------------------------------
procedure InitTrain(var vbobotold:T3dimensi;var
wbobotold:Tdatabobot;
var hiden,hiden_in,eror_j:Tdatabobot;var
output,out_in,eror_k:T1dimensi;
ounit:integer);
var
i:integer;
j:integer;
jhiden:integer;
begin
setlength(hiden,length(hunit));
setlength(hiden_in,length(hunit));
setlength(eror_j,length(hunit));
for i:=0 to high(hunit) do
begin
setlength(hiden[i],hunit[i]);
setlength(hiden_in[i],hunit[i]);
setlength(eror_j[i],hunit[i]);
hiden[i,0]:=1;
end;
setlength(output,ounit);
setlength(out_in,ounit);
setlength(eror_k,ounit);
setlength(vbobot,length(hunit));
setlength(vbobotold,length(hunit));
setlength(vbobot[0],iunit);
setlength(vbobotold[0],iunit);
for i:=0 to iunit-1 do
begin
setlength(vbobot[0,i],hunit[0]);
setlength(vbobotold[0,i],hunit[0]);
end;
if high(hunit)>0 then
for i:=0 to high(hunit)-1 do
begin
setlength(vbobot[i+1],hunit[i]);
setlength(vbobotold[i+1],hunit[i]);
for j:=0 to hunit[i]-1 do
begin
setlength(vbobot[i+1,j],hunit[i+1]);
setlength(vbobotold[i+1,j],hunit[i+1]);
end;
end;
jhiden:=length(hunit);
setlength(wbobot,hunit[jhiden-1]);
setlength(wbobotold,hunit[jhiden-1]);
for i:=0 to hunit[jhiden-1]-1 do
begin
setlength(wbobot[i],ounit);
setlength(wbobotold[i],ounit);
end;
InisialisasiBobot(vbobot,wbobot);
end;
//-----------------------------------------
function DoTrain:integer;
var
vbobotold:T3dimensi;
wbobotold:Tdatabobot;
output:T1dimensi;
out_in:T1dimensi;
eror_k:T1dimensi;
hiden:Tdatabobot;
hiden_in:Tdatabobot;
eror_j:Tdatabobot;
target:Tdatabobot;
loop:integer;
num:integer;
jhiden:integer;
i:integer;
j:integer;
kenal:integer;
ounit:integer;
sum:double;
sumall:double;
begin
jhiden:=length(hunit);
ounit:=InitTarget(target);
InitTrain(vbobotold,wbobotold,hiden,hiden_in,eror_j,
output,out_in,eror_k,ounit);
for loop:=1 to iterasi do
begin
kenal:=0;
sumall:=0;
application.ProcessMessages;
for num:=0 to high(masuk) do
begin
//---------feedforrward proses---------//
LayerIn(masuk[num],hiden_in[0],vbobot[0]);
FungsiAktivasi(hiden_in[0],hiden[0]);
if high(hunit)>0 then
for i:=0 to high(hunit)-1 do
begin
LayerIn(hiden[i],hiden_in[i+1],vbobot[i+1]);
FungsiAktivasi(hiden_in[i+1],hiden[i+1]);
end;
LayerIn(hiden[jhiden-1],out_in,wbobot);
FungsiAktivasi(out_in,output);
//----------------cek target yg dicapai-----------
if loop mod 10=0 then
begin
sum:=0;
for i:=1 to high(output) do
sum:=sum+abs(output[i]-target[num,i]);
sum:=sum/jdata;
if sum<ErorMax then
inc(kenal);
sumall:=sumall+sum;
Form1.statusbar1.Panels[1].Text:=' Data identify'+inttostr(kenal)+ ' from '+inttostr(jdata)+ ' at'+inttostr(loop)+' epoch';
if num=high(masuk) then
Form1.statusbar1.Panels[2].Text:=' Error ='+floattostr(sumall/jdata);
if kenal=jdata then if CekBobotAll(hiden_in,hiden,out_in,output,target,jhiden) then
begin
result:=2;
exit;
end;
end;
//------backforward proses----------//
CalculateOutputEror(target[num],output,out_in,eror_k);
CalculateHidenEror(eror_k,hiden_in[jhiden-1],
wbobot,eror_j[jhiden-1]);
if high(hunit)>0 then
for i:=high(hunit) downto 1 do
CalculateHidenEror(eror_j[i],hiden_in[i-1],vbobot[i],
eror_j[i-1]);
//---------update bobot------------//
UpdateBobot(alpha,miu,eror_k,hiden[jhiden-1],wbobot,wbobotold);
UpdateBobot(alpha,miu,eror_j[0],masuk[num],vbobot[0],
vbobotold[0]);
if high(hunit)>0 then
for i:=high(hunit) downto 1 do
UpdateBobot(alpha,miu,eror_j[i],hiden[i-1],vbobot[i],
vbobotold[i]);
end;
end;
result:=1;//-------normal exit
end;
//----------------------------------
procedure InitRead(var hiden_in,hiden:Tdatabobot;
var out_in,output:T1dimensi;ounit:integer);
var
i:integer;
begin
setlength(hiden,length(hunit));
setlength(hiden_in,length(hunit));
for i:=0 to high(hunit) do
begin
setlength(hiden[i],hunit[i]);
setlength(hiden_in[i],hunit[i]);
hiden[i,0]:=1;
end;
setlength(output,ounit);
setlength(out_in,ounit);
end;
//---------------------------------
function
GetDecision(output:t1dimensi;target:Tdatabobot):integer ;
var
i:integer;
j:integer;
sum:double;
min_e:double;
begin
min_e:=1000;
result:=0;
for i:=0 to high(target) do
begin
sum:=0;
for j:=1 to high(target[i]) do
sum:=sum+abs(output[j]-target[i,j]);
if min_e>sum then
begin
result:=i;
min_e:=sum;
end;
end;
end;
procedure TForm1.BukaFile1Click(Sender: TObject);
begin
with OpenDialog1 do
begin
Title:='Buka File Data';
Filter:='data File (*.wav)|*.wav';
DefaultExt:='dat';
FileName:='';
InitialDir:=ExtractFileDir(ParamStr(0))+'\data';
if Execute then
begin
BukaFileData(FileName);
LaporkanKeMemo(FileName);
GraphikkanKeWave;
end;
end;
AutoProcess1.Enabled:=true;
end;
procedure TForm1.AutoProcess1Click(Sender: TObject);
begin
PreProcessing(RealData);
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
jumlahuji:=0;
Button1.enabled:=true;
Button2.enabled:=false;
end;
procedure TForm1.ComboBox2Change(Sender: TObject);
var
a:integer;
temp:string;
begin
JumHidden:=strtoint(ComboBox2.Text);
setlength(HTemp,JumHidden);
for a:=0 to JumHidden-1 do
begin
temp:='25';
inputquery('Jumlah Unit Hiden Ke -'+inttostr(a+1), 'Jumlah Unit :',temp);
HTemp[a]:=strtoint(temp);
end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
with OpenDialog1 do
begin
Title:='Buka File Data';
Filter:='data File (*.wav)|*.wav';
DefaultExt:='dat';
FileName:='';
InitialDir:=ExtractFileDir(ParamStr(0))+'\data';
if Execute then
begin
BukaFileData(FileName);
LaporkanKeMemo(FileName);
GraphikkanKeWave;
end;
end;
AutoProcess1.Enabled:=true;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
close
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
PreProcessing(RealData);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
label8.Left := label8.Left - 5;
if label8.Left <= -100 then
label8.Left := 550;
end;
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
memo1.Clear;
richedit1.Clear;
richedit2.Clear;
combobox1.ClearSelection;
combobox2.ClearSelection;
Series1.Clear;
statusbar1.Panels[0].Text:='';
statusbar1.Panels[1].Text:='';
statusbar1.Panels[2].Text:='';
label7.Caption:='';
end;
procedure TForm1.SinyalSuara1Click(Sender: TObject);
begin
Series1.Clear;
end;
procedure TForm1.HeaderFile1Click(Sender: TObject);
begin
memo1.Clear;
end;
procedure TForm1.ProcessingSpeech1Click(Sender: TObject);
begin
richedit1.Clear;
end;
procedure TForm1.FileSpeech1Click(Sender: TObject);
begin
richedit2.Clear;
end;
procedure TForm1.otalSuara1Click(Sender: TObject);
begin
combobox1.ClearSelection;
end;
procedure TForm1.JumlahHiddenLayer1Click(Sender: TObject);
begin
combobox2.ClearSelection;
end;
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
MessageDlg ('Pengenalan Suara Menggunakan Jaringan Syaraf Tiruan' + #13 +
'JST adalah suatu teknologi komputasi yg berbasis pada model syaraf biologis dan mencoba mensimulasikan tingkah laku dan kerja model syaraf terhadap berbagai macam masukan ' + #13 +
'"Mastering Delphi 7" written by Muhammad Ichsan',
mtInformation, [mbOk], 0);
end;
procedure TForm1.Aboutme1Click(Sender: TObject);
begin
MessageDlg ('Pengenalan Suara Menggunakan Jaringan Syaraf Tiruan' + #13 +
'JST adalah suatu teknologi komputasi yg berbasis pada model syaraf biologis dan mencoba mensimulasikan tingkah laku dan kerja model syaraf terhadap berbagai macam masukan ' + #13 +
'"Mastering Delphi 7" written by Muhammad Ichsan',
mtInformation, [mbOk], 0);
end;
procedure TForm1.About1Click(Sender: TObject);
begin
Panel1.Visible := not Panel1.Visible;
About1.Checked := Panel1.Visible;
end;
procedure TForm1.BitBtn6Click(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
richedit2.Lines.SaveToFile (SaveDialog1.FileName);
end;
end;
procedure TForm1.Exit2Click(Sender: TObject);
begin
close ;
end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
Memo1.Lines.SaveToFile (SaveDialog1.FileName);
end;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if MessageDlg('Apakah anda yakin untuk'+#13+'keluar dari program ini ?',
mtConfirmation,[mbYes,mbNo],0)=mrNo then
CanClose:=False;
end;
procedure TForm1.HapusSemua1Click(Sender: TObject);
begin
label7.Caption:='';
end;
procedure TForm1.rainingnProcess1Click(Sender: TObject);
begin
statusbar1.Panels[0].Text:='';
statusbar1.Panels[1].Text:='';
statusbar1.Panels[2].Text:='';
end;
procedure TForm1.ALLDELETE1Click(Sender: TObject);
begin
memo1.Clear;
richedit1.Clear;
richedit2.Clear;
combobox1.ClearSelection;
combobox2.ClearSelection;
Series1.Clear;
statusbar1.Panels[0].Text:='';
statusbar1.Panels[1].Text:='';
statusbar1.Panels[2].Text:='';
label7.Caption:='';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
maksuji:=strtoint(ComboBox1.text);
with OpenDialog1 do
begin
Title:='Buka File Data';
Filter:='data File (*.wav)|*.wav';
DefaultExt:='wav';
FileName:='';
InitialDir:=ExtractFileDir(ParamStr(0))+'\data';
if Execute then
begin
inc(PosisiFile);
RichEdit1.Lines.Add(FileName);
end;
end;
jumlahuji:=jumlahuji+1;
if jumlahuji=maksuji then
begin
Button1.enabled:=false;
Button2.Enabled:=true;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
a:integer;
i:integer;
j:integer;
temp:TdataBobot;
pan:integer;
curr:integer;
temps:string;
begin
JData:=StrToInt(ComboBox1.Text);
Iterasi:=StrToInt(Edit1.Text);
Alpha:=StrToFloat(trim(Edit2.Text));
Miu:=StrToFloat(trim(Edit3.Text));
ErorMax:=StrToFloat(trim(Edit4.Text));
SetLength(StrIdentitas,JData);
setlength(HUnit,JumHidden);
for a:=0 to JumHidden-1 do
HUnit[a]:=HTemp[a]+1;
setlength(temp,JData);
pan:=0;
for a:=0 to JData-1 do
begin
BukaFileData(RichEdit1.Lines.Strings[a]);
temps:=copy(extractfilename(Form1.opendialog1.FileName),
1,length(extractfilename(Form1.opendialog1.FileName))-
length(extractfileext(Form1.opendialog1.FileName)));
if not inputquery('Data Name','Nama Untuk Data ke'+inttostr(a+1),temps) then
application.MessageBox(pchar('Anda tidak menekan tombol OK'+#13+'Character identified as'+temps),'Confirmation',mb_ok or mb_iconexclamation);
StrIdentitas[a]:=temps;
pan:=max(pan,length(realdata));
setlength(temp[a],length(RealData));
for i:=0 to high(RealData) do
temp[a,i]:=RealData[i];
end;
PanData:=pan;
for a:=0 to JData-1 do
begin
curr:=length(temp[a]);
if curr<pan then
begin
setlength(temp[a],pan);
for i:=curr-1 to pan-1 do
temp[a,i]:=2;
end;
end;
setlength(Masuk,JData);
for a:=0 to JData-1 do
begin
setlength(Cep,0);
PreProcessing(temp[a]);
IUnit:=length(Cep)*length(Cep[0])+1;
setlength(Masuk[a],IUnit);
Masuk[a,0]:=1;
for i:=0 to high(cep) do
for j:=0 to high(cep[i]) do
Masuk[a,i*length(Cep[i])+j+1]:=Cep[i,j];
end;
Button3.Enabled:=true;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
hasil:integer;
begin
statusbar1.Panels[0].Text:=' Training in Process..';
hasil:=DoTrain;
case hasil of
1:MessageDlg('Maximum Iteration reached',
mtInformation,[mbOk],0);
2:MessageDlg('All data can be identified',
mtInformation,[mbOk],0);
end;
Button4.Enabled:=true;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
output:T1dimensi;
out_in:T1dimensi;
hiden:Tdatabobot;
hiden_in:Tdatabobot;
target:Tdatabobot;
i:integer;
j:integer;
jhiden:integer;
curr:integer;
ounit:integer;
begin
BukaFile1.Click;
ALWavePlayer1.FileName:=opendialog1.FileName;
ALWavePlayer1.Enabled:=true;
curr:=length(realdata);
if curr<>pandata then
begin
setlength(realdata,pandata);
if curr<pandata then
for i:=curr to pandata-1 do
realdata[i]:=2;
end;
setlength(masuk,1);
setlength(cep,0);
PreProcessing(RealData);
setlength(masuk[0],iunit);
masuk[0,0]:=1;
for i:=0 to high(cep) do
for j:=0 to high(cep[i]) do
masuk[0,i*length(cep[i])+j+1]:=cep[i,j];
ounit:=InitTarget(target);
InitRead(hiden_in,hiden,out_in,output,ounit);
jhiden:=length(hunit);
LayerIn(masuk[0],hiden_in[0],vbobot[0]);
FungsiAktivasi(hiden_in[0],hiden[0]);
if high(hunit)>0 then
for i:=0 to high(hunit)-1 do
begin
LayerIn(hiden[i],hiden_in[i+1],vbobot[i+1]);
FungsiAktivasi(hiden_in[i+1],hiden[i+1]);
end;
LayerIn(hiden[jhiden-1],out_in,wbobot);
FungsiAktivasi(out_in,output);
i:=GetDecision(output,target);
MessageDlg('Hasil Pengenalan '+StrIdentitas[i],mtInformation,[mbOk],0);
Label7.Caption:=OpenDialog1.FileName+' adalah suara = '+
StrIdentitas[i];
ALWavePlayer1.Enabled:=false;
end;
end.
// Buat Unit 2
{$N+,E+}
(*Allows code to use type 'double', run on any iX86 machine *)
{$R-}
(* Turn off range checking...we violate array bounds rules *)
unit Unit2;
interface
uses Math, Unit1;
function FrameCount(n,m,panjang:integer):integer;
procedure framing(n,m:integer;sinyal:array of double; var
hasil:Tdatabobot);
procedure pre_emphasis(koefisien:double; var sinyal:array of
double);
procedure win_sinyal(nflg:integer;kode:twindow; var win:array
of double);
const M_2PI:double=2 * 3.14159265358979323846;
implementation
function FrameCount(n,m,panjang:integer):integer;
var
a:integer;
jum:integer;
begin
a:=0;
jum:=0;
repeat
inc(jum);
inc(a,n-m);
until a>panjang;
result:=jum;
end;
procedure framing(n,m:integer;sinyal:array of double; var
hasil:Tdatabobot);
var
panjang:integer;
posisi:integer;
a:integer;
b:integer;
begin
panjang:=high(sinyal)+1;
posisi:=0;
b:=0;
repeat
for a:=0 to n-1 do
if posisi+a>=panjang then hasil[b,a]:=0
else hasil[b,a]:=sinyal[posisi+a];
inc(posisi,n-m);
inc(b);
until posisi>panjang;
end;
{
prosedur pre emphasis
koefisien -> nilai dari penguatan berkisar antara 0.9 - 1
sinyal -> sinyal yang akan dilakukan proses pre emhasis
}
procedure pre_emphasis(koefisien:double;var sinyal:array of
double);
var
temp:array of double;
a:integer;
begin
setlength(temp,high(sinyal));
for a:=1 to high(sinyal) do
temp[a]:=sinyal[a]-koefisien*sinyal[a-1];
for a:=1 to high(sinyal) do sinyal[a]:=temp[a];
end;
procedure hanning_win(var win:array of double);
var
arg:double;
a:integer;
panjang:integer;
begin
panjang:=high(win);
arg:= M_2PI/panjang;
for a:=0 to panjang do
win[a]:=0.5*(1-cos(a*arg));
end;
procedure hamming_win(var win:array of double);
var
arg:double;
a:integer;
panjang:integer;
begin
panjang:=high(win);
arg:= M_2PI /panjang;
for a:=0 to panjang do
win[a]:=0.54-0.46*cos(a*arg);
end;
procedure blackman_win(var win:array of double);
var
arg:double;
x:double;
a:integer;
panjang:integer;
begin
panjang:=high(win);
arg:=M_2PI/panjang;
for a:=0 to panjang do
begin
x:=a*arg;
win[a]:=0.42-0.5*cos(x)+0.08*cos(x+x);
end;
end;
procedure bartlett_win(var win:array of double);
var
a:integer;
pan:integer;
panjang:integer;
begin
panjang:=high(win);
pan:=panjang div 2;
for a:=0 to pan-1 do
win[a]:=2*a/pan;
for a:=pan to panjang do
win[a]:=2-2*a/pan;
end;
{
prosedur windowing sinyal
panjang -> panjang dari daerah yang akan di window
nflg -> normalisasi flag
0 -> tidak dinormalisasi
1 -> normalisasi oleh power
2 -> normalisasi oleh magnitude
kode -> kode tipe window yang dipakai
win -> koefisien hasil windowing;
}
procedure win_sinyal(nflg:integer;kode:twindow;var win:array of
double);
var
a:integer;
g:double;
panjang:integer;
begin
g:=1;
panjang:=high(win);
for a:=0 to panjang do
win[a]:=0;
case kode of
blackman:blackman_win(win);
hanning:hanning_win(win);
hamming:hamming_win(win);
bartlett:bartlett_win(win);
end;
case nflg of
0:g:=1;
1:begin
g:=0;
for a:=0 to panjang do
g:=g+sqr(win[a]);
g:=sqrt(g);
end;
2:begin
g:=0;
for a:=0 to panjang do
g:=g+win[a];
end;
end;
for a:=0 to panjang do
win[a]:=win[a]/g;
end;
end.
// Buat Unit 3
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, Menus, ExtCtrls, TeeProcs, Chart, ComCtrls,
StdCtrls, ALBasicAudioOut, ALAudioOut, LPComponent, ALCommonPlayer,
ALWavePlayer, math, ImgList, acAlphaImageList, sSkinProvider,
sSkinManager, Buttons, sButton;
type
Twindow=(blackman,hanning,hamming,bartlett);
T1dimensi=array of double;
Tdatabobot=array of T1dimensi;
T3dimensi=array of Tdatabobot;
TForm1 = class(TForm)
MainMenu1: TMainMenu;
OpenDialog1: TOpenDialog;
Memo1: TMemo;
ALWavePlayer1: TALWavePlayer;
ALAudioOut1: TALAudioOut;
RichEdit1: TRichEdit;
RichEdit2: TRichEdit;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
StatusBar1: TStatusBar;
Chart1: TChart;
File1: TMenuItem;
BukaFile1: TMenuItem;
AutoProcess1: TMenuItem;
Series1: TLineSeries;
sSkinManager1: TsSkinManager;
Exit1: TMenuItem;
Panel1: TPanel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Label8: TLabel;
Timer1: TTimer;
BitBtn4: TBitBtn;
componen1: TMenuItem;
Hapus1: TMenuItem;
SinyalSuara1: TMenuItem;
HeaderFile1: TMenuItem;
ProcessingSpeech1: TMenuItem;
FileSpeech1: TMenuItem;
otalSuara1: TMenuItem;
JumlahHiddenLayer1: TMenuItem;
HapusSemua1: TMenuItem;
Help1: TMenuItem;
About1: TMenuItem;
BitBtn5: TBitBtn;
Help2: TMenuItem;
Aboutme1: TMenuItem;
BitBtn6: TBitBtn;
SaveDialog1: TSaveDialog;
Exit2: TMenuItem;
rainingnProcess1: TMenuItem;
ALLDELETE1: TMenuItem;
Button1: TsButton;
Button2: TsButton;
Button3: TsButton;
Button4: TsButton;
procedure BukaFile1Click(Sender: TObject);
procedure AutoProcess1Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure SinyalSuara1Click(Sender: TObject);
procedure HeaderFile1Click(Sender: TObject);
procedure ProcessingSpeech1Click(Sender: TObject);
procedure FileSpeech1Click(Sender: TObject);
procedure otalSuara1Click(Sender: TObject);
procedure JumlahHiddenLayer1Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure Aboutme1Click(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure BitBtn6Click(Sender: TObject);
procedure Exit2Click(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure HapusSemua1Click(Sender: TObject);
procedure rainingnProcess1Click(Sender: TObject);
procedure ALLDELETE1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
MATHPHI=3.1415926535897932384626433832795;
MAXDATA=15000;//15000 sample
UKURANFRAME=2048;
FREKUENSI=12000;//12 KHz sample rate
var
Form1: TForm1;
maksuji,jumlahuji :word;
PosisiFile :Byte;
JData :integer;
Iterasi :integer;
Alpha:double;
Miu:double;
ErorMax:double;
StrIdentitas:array of string;
HUnit:array of integer;
JumHidden:Byte;
HTemp:array of integer;
RealData:array of double;
PanData:Integer;
Masuk:Tdatabobot;
Cep:Tdatabobot;
IUnit:Integer;
wbobot:Tdatabobot;
vbobot:array of Tdatabobot;
implementation
uses Unit2, Unit3, Unit4, Fourier;
{$R *.dfm}
procedure BukaFileData(const namafile:string);
var
F:File of Smallint;
dumdata:Smallint;
loop:word;
begin
AssignFile(F,namafile);
Reset(F);
Seek(F,0);
SetLength(RealData,MAXDATA);
for loop:=0 to MAXDATA-1 do
begin
Read(F,dumdata);
RealData[loop]:=dumdata;
end;
CloseFile(F);
end;
//--------------------------------
procedure LaporkanKeMemo(const namafile:string);
begin
with Form1, Memo1.Lines do
begin
Clear;
Add('Buka File : '+namafile);
Add('File speech dengan header File :');
Add('- RIFF chunck');
Add('- Mode Mono');
Add('- 12 KHZ sample rate');
Add('- 16 bit signed data');
Add('- 15000 sample data = 1.25 s');
end;
end;
//-------------------------------
procedure GraphikkanKeWave;
var
loop:word;
begin
with Form1, Series1 do
begin
Clear;
for loop:=0 to MAXDATA-1 do
Add(RealData[loop]);
end;
end;
//--------------------------------------
Procedure TampilkanProsess(proses:Byte);
var
loop1:Byte;
loop2:Byte;
begin
with Form1, RichEdit2.Lines do
begin
case proses of
0:begin
Clear;
Add('PreProcessing :');
end;
1:Add('Baca Data Sinyal Speech ...');
2:Add('Framing Data ...');
3:Add('PreEmphasis ...');
4:Add('Windowing ...');
5:Add('FFT ...');
6:Add('LPC ...');
7:Add('Cepstral ...');
100:
begin
Add('SUKSESS ...');
Add('------------------------------');
Add('Jumlah Koefisien Cepstral :'+FloatToStr(high(Cep)+1));
Add('Jumlah Frame :'+FloatToStr(high(Cep[1])+1));
for loop1:=0 to high(Cep) do
begin
Add('==============================');
for loop2:=0 to high(Cep[loop1]) do
Add('Frame['+IntToStr(loop2)+']'+'Coef['+IntToStr(loop1)+']'+
#9+ FloatToStr(Cep[loop1,loop2]));
end;
end;
end;
end;
end;
//--------------------------------
//------------------------------------------
procedure PreProcessing(sinyal:array of double);
var
p:integer;
i:integer;
j:integer;
win:array of double;
aut:array of double;
realtime:Tdatabobot;
imgtime:Tdatabobot;
realfrek:Tdatabobot;
imgfrek:Tdatabobot;
jumframe:integer;
begin
TampilkanProsess(0);
TampilkanProsess(1);
jumframe:=FrameCount(UKURANFRAME,UKURANFRAME div 3,
high(sinyal)+1);
setlength(realtime,jumframe);
setlength(imgtime,jumframe);
setlength(realfrek,jumframe);
setlength(imgfrek,jumframe);
setlength(Cep,jumframe);
TampilkanProsess(2);
pre_emphasis(0.94,sinyal);
setlength(realtime,jumframe);
for i:=0 to jumframe-1 do
begin
setlength(realtime[i],UKURANFRAME);
setlength(imgtime[i],UKURANFRAME);
setlength(realfrek[i],UKURANFRAME);
setlength(imgfrek[i],UKURANFRAME);
end;
TampilkanProsess(3);
framing(UKURANFRAME,UKURANFRAME div 3,sinyal,realtime);
TampilkanProsess(4);
setlength(win,UKURANFRAME);
win_sinyal(0,hanning,win);
TampilkanProsess(5);
for i:=0 to jumframe-1 do
for j:=0 to UKURANFRAME-1 do
realtime[i,j]:=realtime[i,j]*win[j];
for i:=0 to jumframe-1 do
fft(UKURANFRAME,realtime[i],imgtime[i],realfrek[i],imgfrek[i]);
for i:=0 to jumframe-1 do
for j:=0 to UKURANFRAME-1 do
realfrek[i,j]:=sqrt(sqr(realfrek[i,j])+sqr(imgfrek[i,j]));
TampilkanProsess(6);
p:=MakeOrder(FREKUENSI);
setlength(aut,p+1);
for i:=0 to jumframe-1 do
begin
setlength(Cep[i],p+1);
LPCAnalisis(realfrek[i],UKURANFRAME,p,aut);
lpc2cepstral(p,p,aut,Cep[i]);
weightingcepstral(p,Cep[i]);
end;
TampilkanProsess(7);
TampilkanProsess(100);
end;
//---------------------------------
function InitTarget(var target:Tdatabobot):integer;
var
a:integer;
b:integer;
sisa:integer;
ounit:integer;
begin
setlength(target,jdata);
sisa:=jdata mod 3;
if sisa<>0 then
sisa:=1;
ounit:=jdata div 3 +sisa+1;
for a:=0 to jdata-1 do
begin
setlength(target[a],ounit);
for b:=1 to ounit-1 do
target[a,b]:=0.1;
target[a,1+ a div 3]:=0.3+ 0.3*(a mod 3);
end;
result:=ounit;
end;
//-----------------------------------------
function CekBobotAll(hiden_in,hiden:Tdatabobot;
out_in,output:t1dimensi;
target:Tdatabobot;jhiden:integer):boolean;
var
i:integer;
num:integer;
kenal:integer;
sum:double;
begin
result:=false;
kenal:=0;
for num:=0 to high(masuk) do
begin
//---------feedforrward proses---------//
LayerIn(masuk[num],hiden_in[0],vbobot[0]);
FungsiAktivasi(hiden_in[0],hiden[0]);
if high(hunit)>0 then
for i:=0 to high(hunit)-1 do
begin
LayerIn(hiden[i],hiden_in[i+1],vbobot[i+1]);
FungsiAktivasi(hiden_in[i+1],hiden[i+1]);
end;
LayerIn(hiden[jhiden-1],out_in,wbobot);
FungsiAktivasi(out_in,output);
sum:=0;
for i:=1 to high(output) do
sum:=sum+abs(output[i]-target[num,i]);
sum:=sum/jdata;
if sum<ErorMax then
inc(kenal);
end;
if kenal=jdata then
result:=true;
end;
//--------------------------------------------
procedure InitTrain(var vbobotold:T3dimensi;var
wbobotold:Tdatabobot;
var hiden,hiden_in,eror_j:Tdatabobot;var
output,out_in,eror_k:T1dimensi;
ounit:integer);
var
i:integer;
j:integer;
jhiden:integer;
begin
setlength(hiden,length(hunit));
setlength(hiden_in,length(hunit));
setlength(eror_j,length(hunit));
for i:=0 to high(hunit) do
begin
setlength(hiden[i],hunit[i]);
setlength(hiden_in[i],hunit[i]);
setlength(eror_j[i],hunit[i]);
hiden[i,0]:=1;
end;
setlength(output,ounit);
setlength(out_in,ounit);
setlength(eror_k,ounit);
setlength(vbobot,length(hunit));
setlength(vbobotold,length(hunit));
setlength(vbobot[0],iunit);
setlength(vbobotold[0],iunit);
for i:=0 to iunit-1 do
begin
setlength(vbobot[0,i],hunit[0]);
setlength(vbobotold[0,i],hunit[0]);
end;
if high(hunit)>0 then
for i:=0 to high(hunit)-1 do
begin
setlength(vbobot[i+1],hunit[i]);
setlength(vbobotold[i+1],hunit[i]);
for j:=0 to hunit[i]-1 do
begin
setlength(vbobot[i+1,j],hunit[i+1]);
setlength(vbobotold[i+1,j],hunit[i+1]);
end;
end;
jhiden:=length(hunit);
setlength(wbobot,hunit[jhiden-1]);
setlength(wbobotold,hunit[jhiden-1]);
for i:=0 to hunit[jhiden-1]-1 do
begin
setlength(wbobot[i],ounit);
setlength(wbobotold[i],ounit);
end;
InisialisasiBobot(vbobot,wbobot);
end;
//-----------------------------------------
function DoTrain:integer;
var
vbobotold:T3dimensi;
wbobotold:Tdatabobot;
output:T1dimensi;
out_in:T1dimensi;
eror_k:T1dimensi;
hiden:Tdatabobot;
hiden_in:Tdatabobot;
eror_j:Tdatabobot;
target:Tdatabobot;
loop:integer;
num:integer;
jhiden:integer;
i:integer;
j:integer;
kenal:integer;
ounit:integer;
sum:double;
sumall:double;
begin
jhiden:=length(hunit);
ounit:=InitTarget(target);
InitTrain(vbobotold,wbobotold,hiden,hiden_in,eror_j,
output,out_in,eror_k,ounit);
for loop:=1 to iterasi do
begin
kenal:=0;
sumall:=0;
application.ProcessMessages;
for num:=0 to high(masuk) do
begin
//---------feedforrward proses---------//
LayerIn(masuk[num],hiden_in[0],vbobot[0]);
FungsiAktivasi(hiden_in[0],hiden[0]);
if high(hunit)>0 then
for i:=0 to high(hunit)-1 do
begin
LayerIn(hiden[i],hiden_in[i+1],vbobot[i+1]);
FungsiAktivasi(hiden_in[i+1],hiden[i+1]);
end;
LayerIn(hiden[jhiden-1],out_in,wbobot);
FungsiAktivasi(out_in,output);
//----------------cek target yg dicapai-----------
if loop mod 10=0 then
begin
sum:=0;
for i:=1 to high(output) do
sum:=sum+abs(output[i]-target[num,i]);
sum:=sum/jdata;
if sum<ErorMax then
inc(kenal);
sumall:=sumall+sum;
Form1.statusbar1.Panels[1].Text:=' Data identify'+inttostr(kenal)+ ' from '+inttostr(jdata)+ ' at'+inttostr(loop)+' epoch';
if num=high(masuk) then
Form1.statusbar1.Panels[2].Text:=' Error ='+floattostr(sumall/jdata);
if kenal=jdata then if CekBobotAll(hiden_in,hiden,out_in,output,target,jhiden) then
begin
result:=2;
exit;
end;
end;
//------backforward proses----------//
CalculateOutputEror(target[num],output,out_in,eror_k);
CalculateHidenEror(eror_k,hiden_in[jhiden-1],
wbobot,eror_j[jhiden-1]);
if high(hunit)>0 then
for i:=high(hunit) downto 1 do
CalculateHidenEror(eror_j[i],hiden_in[i-1],vbobot[i],
eror_j[i-1]);
//---------update bobot------------//
UpdateBobot(alpha,miu,eror_k,hiden[jhiden-1],wbobot,wbobotold);
UpdateBobot(alpha,miu,eror_j[0],masuk[num],vbobot[0],
vbobotold[0]);
if high(hunit)>0 then
for i:=high(hunit) downto 1 do
UpdateBobot(alpha,miu,eror_j[i],hiden[i-1],vbobot[i],
vbobotold[i]);
end;
end;
result:=1;//-------normal exit
end;
//----------------------------------
procedure InitRead(var hiden_in,hiden:Tdatabobot;
var out_in,output:T1dimensi;ounit:integer);
var
i:integer;
begin
setlength(hiden,length(hunit));
setlength(hiden_in,length(hunit));
for i:=0 to high(hunit) do
begin
setlength(hiden[i],hunit[i]);
setlength(hiden_in[i],hunit[i]);
hiden[i,0]:=1;
end;
setlength(output,ounit);
setlength(out_in,ounit);
end;
//---------------------------------
function
GetDecision(output:t1dimensi;target:Tdatabobot):integer ;
var
i:integer;
j:integer;
sum:double;
min_e:double;
begin
min_e:=1000;
result:=0;
for i:=0 to high(target) do
begin
sum:=0;
for j:=1 to high(target[i]) do
sum:=sum+abs(output[j]-target[i,j]);
if min_e>sum then
begin
result:=i;
min_e:=sum;
end;
end;
end;
procedure TForm1.BukaFile1Click(Sender: TObject);
begin
with OpenDialog1 do
begin
Title:='Buka File Data';
Filter:='data File (*.wav)|*.wav';
DefaultExt:='dat';
FileName:='';
InitialDir:=ExtractFileDir(ParamStr(0))+'\data';
if Execute then
begin
BukaFileData(FileName);
LaporkanKeMemo(FileName);
GraphikkanKeWave;
end;
end;
AutoProcess1.Enabled:=true;
end;
procedure TForm1.AutoProcess1Click(Sender: TObject);
begin
PreProcessing(RealData);
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
jumlahuji:=0;
Button1.enabled:=true;
Button2.enabled:=false;
end;
procedure TForm1.ComboBox2Change(Sender: TObject);
var
a:integer;
temp:string;
begin
JumHidden:=strtoint(ComboBox2.Text);
setlength(HTemp,JumHidden);
for a:=0 to JumHidden-1 do
begin
temp:='25';
inputquery('Jumlah Unit Hiden Ke -'+inttostr(a+1), 'Jumlah Unit :',temp);
HTemp[a]:=strtoint(temp);
end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
with OpenDialog1 do
begin
Title:='Buka File Data';
Filter:='data File (*.wav)|*.wav';
DefaultExt:='dat';
FileName:='';
InitialDir:=ExtractFileDir(ParamStr(0))+'\data';
if Execute then
begin
BukaFileData(FileName);
LaporkanKeMemo(FileName);
GraphikkanKeWave;
end;
end;
AutoProcess1.Enabled:=true;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
close
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
PreProcessing(RealData);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
label8.Left := label8.Left - 5;
if label8.Left <= -100 then
label8.Left := 550;
end;
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
memo1.Clear;
richedit1.Clear;
richedit2.Clear;
combobox1.ClearSelection;
combobox2.ClearSelection;
Series1.Clear;
statusbar1.Panels[0].Text:='';
statusbar1.Panels[1].Text:='';
statusbar1.Panels[2].Text:='';
label7.Caption:='';
end;
procedure TForm1.SinyalSuara1Click(Sender: TObject);
begin
Series1.Clear;
end;
procedure TForm1.HeaderFile1Click(Sender: TObject);
begin
memo1.Clear;
end;
procedure TForm1.ProcessingSpeech1Click(Sender: TObject);
begin
richedit1.Clear;
end;
procedure TForm1.FileSpeech1Click(Sender: TObject);
begin
richedit2.Clear;
end;
procedure TForm1.otalSuara1Click(Sender: TObject);
begin
combobox1.ClearSelection;
end;
procedure TForm1.JumlahHiddenLayer1Click(Sender: TObject);
begin
combobox2.ClearSelection;
end;
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
MessageDlg ('Pengenalan Suara Menggunakan Jaringan Syaraf Tiruan' + #13 +
'JST adalah suatu teknologi komputasi yg berbasis pada model syaraf biologis dan mencoba mensimulasikan tingkah laku dan kerja model syaraf terhadap berbagai macam masukan ' + #13 +
'"Mastering Delphi 7" written by Muhammad Ichsan',
mtInformation, [mbOk], 0);
end;
procedure TForm1.Aboutme1Click(Sender: TObject);
begin
MessageDlg ('Pengenalan Suara Menggunakan Jaringan Syaraf Tiruan' + #13 +
'JST adalah suatu teknologi komputasi yg berbasis pada model syaraf biologis dan mencoba mensimulasikan tingkah laku dan kerja model syaraf terhadap berbagai macam masukan ' + #13 +
'"Mastering Delphi 7" written by Muhammad Ichsan',
mtInformation, [mbOk], 0);
end;
procedure TForm1.About1Click(Sender: TObject);
begin
Panel1.Visible := not Panel1.Visible;
About1.Checked := Panel1.Visible;
end;
procedure TForm1.BitBtn6Click(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
richedit2.Lines.SaveToFile (SaveDialog1.FileName);
end;
end;
procedure TForm1.Exit2Click(Sender: TObject);
begin
close ;
end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
Memo1.Lines.SaveToFile (SaveDialog1.FileName);
end;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if MessageDlg('Apakah anda yakin untuk'+#13+'keluar dari program ini ?',
mtConfirmation,[mbYes,mbNo],0)=mrNo then
CanClose:=False;
end;
procedure TForm1.HapusSemua1Click(Sender: TObject);
begin
label7.Caption:='';
end;
procedure TForm1.rainingnProcess1Click(Sender: TObject);
begin
statusbar1.Panels[0].Text:='';
statusbar1.Panels[1].Text:='';
statusbar1.Panels[2].Text:='';
end;
procedure TForm1.ALLDELETE1Click(Sender: TObject);
begin
memo1.Clear;
richedit1.Clear;
richedit2.Clear;
combobox1.ClearSelection;
combobox2.ClearSelection;
Series1.Clear;
statusbar1.Panels[0].Text:='';
statusbar1.Panels[1].Text:='';
statusbar1.Panels[2].Text:='';
label7.Caption:='';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
maksuji:=strtoint(ComboBox1.text);
with OpenDialog1 do
begin
Title:='Buka File Data';
Filter:='data File (*.wav)|*.wav';
DefaultExt:='wav';
FileName:='';
InitialDir:=ExtractFileDir(ParamStr(0))+'\data';
if Execute then
begin
inc(PosisiFile);
RichEdit1.Lines.Add(FileName);
end;
end;
jumlahuji:=jumlahuji+1;
if jumlahuji=maksuji then
begin
Button1.enabled:=false;
Button2.Enabled:=true;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
a:integer;
i:integer;
j:integer;
temp:TdataBobot;
pan:integer;
curr:integer;
temps:string;
begin
JData:=StrToInt(ComboBox1.Text);
Iterasi:=StrToInt(Edit1.Text);
Alpha:=StrToFloat(trim(Edit2.Text));
Miu:=StrToFloat(trim(Edit3.Text));
ErorMax:=StrToFloat(trim(Edit4.Text));
SetLength(StrIdentitas,JData);
setlength(HUnit,JumHidden);
for a:=0 to JumHidden-1 do
HUnit[a]:=HTemp[a]+1;
setlength(temp,JData);
pan:=0;
for a:=0 to JData-1 do
begin
BukaFileData(RichEdit1.Lines.Strings[a]);
temps:=copy(extractfilename(Form1.opendialog1.FileName),
1,length(extractfilename(Form1.opendialog1.FileName))-
length(extractfileext(Form1.opendialog1.FileName)));
if not inputquery('Data Name','Nama Untuk Data ke'+inttostr(a+1),temps) then
application.MessageBox(pchar('Anda tidak menekan tombol OK'+#13+'Character identified as'+temps),'Confirmation',mb_ok or mb_iconexclamation);
StrIdentitas[a]:=temps;
pan:=max(pan,length(realdata));
setlength(temp[a],length(RealData));
for i:=0 to high(RealData) do
temp[a,i]:=RealData[i];
end;
PanData:=pan;
for a:=0 to JData-1 do
begin
curr:=length(temp[a]);
if curr<pan then
begin
setlength(temp[a],pan);
for i:=curr-1 to pan-1 do
temp[a,i]:=2;
end;
end;
setlength(Masuk,JData);
for a:=0 to JData-1 do
begin
setlength(Cep,0);
PreProcessing(temp[a]);
IUnit:=length(Cep)*length(Cep[0])+1;
setlength(Masuk[a],IUnit);
Masuk[a,0]:=1;
for i:=0 to high(cep) do
for j:=0 to high(cep[i]) do
Masuk[a,i*length(Cep[i])+j+1]:=Cep[i,j];
end;
Button3.Enabled:=true;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
hasil:integer;
begin
statusbar1.Panels[0].Text:=' Training in Process..';
hasil:=DoTrain;
case hasil of
1:MessageDlg('Maximum Iteration reached',
mtInformation,[mbOk],0);
2:MessageDlg('All data can be identified',
mtInformation,[mbOk],0);
end;
Button4.Enabled:=true;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
output:T1dimensi;
out_in:T1dimensi;
hiden:Tdatabobot;
hiden_in:Tdatabobot;
target:Tdatabobot;
i:integer;
j:integer;
jhiden:integer;
curr:integer;
ounit:integer;
begin
BukaFile1.Click;
ALWavePlayer1.FileName:=opendialog1.FileName;
ALWavePlayer1.Enabled:=true;
curr:=length(realdata);
if curr<>pandata then
begin
setlength(realdata,pandata);
if curr<pandata then
for i:=curr to pandata-1 do
realdata[i]:=2;
end;
setlength(masuk,1);
setlength(cep,0);
PreProcessing(RealData);
setlength(masuk[0],iunit);
masuk[0,0]:=1;
for i:=0 to high(cep) do
for j:=0 to high(cep[i]) do
masuk[0,i*length(cep[i])+j+1]:=cep[i,j];
ounit:=InitTarget(target);
InitRead(hiden_in,hiden,out_in,output,ounit);
jhiden:=length(hunit);
LayerIn(masuk[0],hiden_in[0],vbobot[0]);
FungsiAktivasi(hiden_in[0],hiden[0]);
if high(hunit)>0 then
for i:=0 to high(hunit)-1 do
begin
LayerIn(hiden[i],hiden_in[i+1],vbobot[i+1]);
FungsiAktivasi(hiden_in[i+1],hiden[i+1]);
end;
LayerIn(hiden[jhiden-1],out_in,wbobot);
FungsiAktivasi(out_in,output);
i:=GetDecision(output,target);
MessageDlg('Hasil Pengenalan '+StrIdentitas[i],mtInformation,[mbOk],0);
Label7.Caption:=OpenDialog1.FileName+' adalah suara = '+
StrIdentitas[i];
ALWavePlayer1.Enabled:=false;
end;
end.
// Buat Unit 2
{$N+,E+}
(*Allows code to use type 'double', run on any iX86 machine *)
{$R-}
(* Turn off range checking...we violate array bounds rules *)
unit Unit2;
interface
uses Math, Unit1;
function FrameCount(n,m,panjang:integer):integer;
procedure framing(n,m:integer;sinyal:array of double; var
hasil:Tdatabobot);
procedure pre_emphasis(koefisien:double; var sinyal:array of
double);
procedure win_sinyal(nflg:integer;kode:twindow; var win:array
of double);
const M_2PI:double=2 * 3.14159265358979323846;
implementation
function FrameCount(n,m,panjang:integer):integer;
var
a:integer;
jum:integer;
begin
a:=0;
jum:=0;
repeat
inc(jum);
inc(a,n-m);
until a>panjang;
result:=jum;
end;
procedure framing(n,m:integer;sinyal:array of double; var
hasil:Tdatabobot);
var
panjang:integer;
posisi:integer;
a:integer;
b:integer;
begin
panjang:=high(sinyal)+1;
posisi:=0;
b:=0;
repeat
for a:=0 to n-1 do
if posisi+a>=panjang then hasil[b,a]:=0
else hasil[b,a]:=sinyal[posisi+a];
inc(posisi,n-m);
inc(b);
until posisi>panjang;
end;
{
prosedur pre emphasis
koefisien -> nilai dari penguatan berkisar antara 0.9 - 1
sinyal -> sinyal yang akan dilakukan proses pre emhasis
}
procedure pre_emphasis(koefisien:double;var sinyal:array of
double);
var
temp:array of double;
a:integer;
begin
setlength(temp,high(sinyal));
for a:=1 to high(sinyal) do
temp[a]:=sinyal[a]-koefisien*sinyal[a-1];
for a:=1 to high(sinyal) do sinyal[a]:=temp[a];
end;
procedure hanning_win(var win:array of double);
var
arg:double;
a:integer;
panjang:integer;
begin
panjang:=high(win);
arg:= M_2PI/panjang;
for a:=0 to panjang do
win[a]:=0.5*(1-cos(a*arg));
end;
procedure hamming_win(var win:array of double);
var
arg:double;
a:integer;
panjang:integer;
begin
panjang:=high(win);
arg:= M_2PI /panjang;
for a:=0 to panjang do
win[a]:=0.54-0.46*cos(a*arg);
end;
procedure blackman_win(var win:array of double);
var
arg:double;
x:double;
a:integer;
panjang:integer;
begin
panjang:=high(win);
arg:=M_2PI/panjang;
for a:=0 to panjang do
begin
x:=a*arg;
win[a]:=0.42-0.5*cos(x)+0.08*cos(x+x);
end;
end;
procedure bartlett_win(var win:array of double);
var
a:integer;
pan:integer;
panjang:integer;
begin
panjang:=high(win);
pan:=panjang div 2;
for a:=0 to pan-1 do
win[a]:=2*a/pan;
for a:=pan to panjang do
win[a]:=2-2*a/pan;
end;
{
prosedur windowing sinyal
panjang -> panjang dari daerah yang akan di window
nflg -> normalisasi flag
0 -> tidak dinormalisasi
1 -> normalisasi oleh power
2 -> normalisasi oleh magnitude
kode -> kode tipe window yang dipakai
win -> koefisien hasil windowing;
}
procedure win_sinyal(nflg:integer;kode:twindow;var win:array of
double);
var
a:integer;
g:double;
panjang:integer;
begin
g:=1;
panjang:=high(win);
for a:=0 to panjang do
win[a]:=0;
case kode of
blackman:blackman_win(win);
hanning:hanning_win(win);
hamming:hamming_win(win);
bartlett:bartlett_win(win);
end;
case nflg of
0:g:=1;
1:begin
g:=0;
for a:=0 to panjang do
g:=g+sqr(win[a]);
g:=sqrt(g);
end;
2:begin
g:=0;
for a:=0 to panjang do
g:=g+win[a];
end;
end;
for a:=0 to panjang do
win[a]:=win[a]/g;
end;
end.
// Buat Unit 3
{$N+,E+}
(* Allows code to use type 'double' run on any iX86 machine *)
{$R-}
(* Turn off range checking...we violate array bounds rules *)
unit Unit3;
interface
uses math,Unit1;
function LPCAnalisis(sinyal:array of
double;framelength,p:integer;var a:array of double):integer;
function MakeOrder(BandWith:integer):integer;
procedure lpc2cepstral(p1,p2:integer;a:array of double;var
c:array of double);
procedure weightingcepstral(p:integer;var c:array of double);
const M_PI:double=3.14159265358979323846;
implementation
function MakeOrder(BandWith:integer):integer;
begin
result:=2*(BandWith div 1000+1);
end;
//-----------------------------------------//
{
fungsi autokorelasi untuk meminimalisasi mse dari LPC
p -> order dari prediksi
r -> koefisien autokorelasi
frame_length -> panjang frame
sinyal -> data sinyal
hasil procedure adalah :
koefisien autokorelasi
}
//-----------------------------------------//
procedure autocorelation(sinyal:array of
double;frame_length,p:integer;var r:array of double);
var a,b:integer;
temp :double;
begin
for a:=0 to p do
begin
temp:=0;
for b:=0 to frame_length-1-a do
temp:=temp+sinyal[b]*sinyal[b+a];
r[a]:=temp;
end;
end;
//-----------------------------------------//
{
fungsi untuk mencari koefisien prediksi dari LPC
r -> koefisien autokorelasi
p -> order dari prediksi
eps -> singular check
kp -> koefisien prediksi
hasil fungsi adalah :
0 -> normaly completed
1 -> abnormaly completed
2 -> unstable LPC
}
//-----------------------------------------//
function CariKoefisienPrediksi(r:array of
double;p:integer;eps:double;var kp:array of double):integer;
var rmd,mue :double;
a,b,flag:integer;
c :array of double;
begin
flag:=0;
setlength(c,p+1);
if eps<0.0 then eps:=1.0e-6;
rmd :=r[0];
kp[0]:=0;
for a:=1 to p do
begin
mue:= -r[a];
for b:=1 to a-1 do
mue:=mue - c[b] * r[a - b];
mue:= mue/rmd;
for b:=1 to a-1 do
kp[b]:= c[b] + mue * c[a - b];
kp[a]:=mue;
rmd:=(1.0 - mue * mue) * rmd;
if rmd<0 then
rmd:=-rmd;
if rmd<=eps then
begin
result:=1;
exit;
end;
if mue<0 then
mue:=-mue;
if mue>=1 then
flag:=2;
for b:= 0 to a do
c[b]:=kp[b];
end;
kp[0]:=sqrt(rmd);
result:=flag;
end;
function Gain(p:integer;a:array of double;r:array of
double):double;
var b:integer;
temp:double;
begin
temp:=0;
for b:=1 to p do
temp:=temp+a[b]*r[b];
temp:=r[0]-temp;
result:=sqrt(temp);
end;
//-----------------------------------------//
{
prosedur untuk menganalisa LPC
frame_length -> panjang frame
sinyal -> data sinyal
p -> order dari lpc
a -> koefisien dari lpc
hasilnya adalah apakah lpc kita stabil atau nggak
}
//-----------------------------------------//
function LPCAnalisis(sinyal:array of
double;framelength,p:integer;var a:array of double):integer;
var r :array of double;
flag,b,c:integer;
temp :double;
sinpred :array of double;
begin
setlength(r,p+1);
setlength(sinpred,framelength);
autocorelation(sinyal,framelength,p,r);
flag:=CariKoefisienPrediksi(r,p,-1,a);
for b:=1 to framelength-1 do
begin
temp:=0;
for c:=1 to p do
if b-c>=0 then
temp:=temp+sinyal[b-c]*a[c];
sinpred[b]:=temp;
end;
result:=flag;
end;
//-----------------------------------------//
{
prosedur untuk mencari koefisien cepstral
p1 -> order dari lpc
p2 -> order dari cepstral
a -> koefisien dari lpc
c -> koefisien dari cepstral
hasilnya adalah koefisien cepstral -> c
}
//-----------------------------------------//
procedure lpc2cepstral(p1,p2:integer;a:array of double;var
c:array of double);
var i,j,k :integer;
temp :double;
begin
c[0]:=log10(a[0]);
c[1]:=-a[1];
for i:=2 to p2 do
begin
j:=i;
if i>p1 then k:=i-p1
else k:=1;
temp:=0;
repeat
temp:=temp+k*c[k]*a[i-k];
inc(k);
until k>=j;
c[i]:=-temp/i;
if i<=p1 then c[i]:=c[i]-a[i];
end;
end;
//-----------------------------------------//
{
prosedur untuk pembobotan koefisien cepstral untuk mengurangi
sensitivitas
p -> order dari cepstral
c -> koefisien dari cepstral
hasilnya adalah koefisien cepstral yang telah di boboti -> c
}
//-----------------------------------------//
procedure weightingcepstral(p:integer;var c:array of double);
var a:integer;
w:array of double;
arg:double;
begin
setlength(w,p+1);
arg:=M_PI/p;
for a:=1 to p do
w[a]:=1+(p/2)*sin(a*arg);
for a:=1 to p do
c[a]:=c[a]*w[a];
end;
end.
// Buat Unit 4
(* Allows code to use type 'double' run on any iX86 machine *)
{$R-}
(* Turn off range checking...we violate array bounds rules *)
unit Unit3;
interface
uses math,Unit1;
function LPCAnalisis(sinyal:array of
double;framelength,p:integer;var a:array of double):integer;
function MakeOrder(BandWith:integer):integer;
procedure lpc2cepstral(p1,p2:integer;a:array of double;var
c:array of double);
procedure weightingcepstral(p:integer;var c:array of double);
const M_PI:double=3.14159265358979323846;
implementation
function MakeOrder(BandWith:integer):integer;
begin
result:=2*(BandWith div 1000+1);
end;
//-----------------------------------------//
{
fungsi autokorelasi untuk meminimalisasi mse dari LPC
p -> order dari prediksi
r -> koefisien autokorelasi
frame_length -> panjang frame
sinyal -> data sinyal
hasil procedure adalah :
koefisien autokorelasi
}
//-----------------------------------------//
procedure autocorelation(sinyal:array of
double;frame_length,p:integer;var r:array of double);
var a,b:integer;
temp :double;
begin
for a:=0 to p do
begin
temp:=0;
for b:=0 to frame_length-1-a do
temp:=temp+sinyal[b]*sinyal[b+a];
r[a]:=temp;
end;
end;
//-----------------------------------------//
{
fungsi untuk mencari koefisien prediksi dari LPC
r -> koefisien autokorelasi
p -> order dari prediksi
eps -> singular check
kp -> koefisien prediksi
hasil fungsi adalah :
0 -> normaly completed
1 -> abnormaly completed
2 -> unstable LPC
}
//-----------------------------------------//
function CariKoefisienPrediksi(r:array of
double;p:integer;eps:double;var kp:array of double):integer;
var rmd,mue :double;
a,b,flag:integer;
c :array of double;
begin
flag:=0;
setlength(c,p+1);
if eps<0.0 then eps:=1.0e-6;
rmd :=r[0];
kp[0]:=0;
for a:=1 to p do
begin
mue:= -r[a];
for b:=1 to a-1 do
mue:=mue - c[b] * r[a - b];
mue:= mue/rmd;
for b:=1 to a-1 do
kp[b]:= c[b] + mue * c[a - b];
kp[a]:=mue;
rmd:=(1.0 - mue * mue) * rmd;
if rmd<0 then
rmd:=-rmd;
if rmd<=eps then
begin
result:=1;
exit;
end;
if mue<0 then
mue:=-mue;
if mue>=1 then
flag:=2;
for b:= 0 to a do
c[b]:=kp[b];
end;
kp[0]:=sqrt(rmd);
result:=flag;
end;
function Gain(p:integer;a:array of double;r:array of
double):double;
var b:integer;
temp:double;
begin
temp:=0;
for b:=1 to p do
temp:=temp+a[b]*r[b];
temp:=r[0]-temp;
result:=sqrt(temp);
end;
//-----------------------------------------//
{
prosedur untuk menganalisa LPC
frame_length -> panjang frame
sinyal -> data sinyal
p -> order dari lpc
a -> koefisien dari lpc
hasilnya adalah apakah lpc kita stabil atau nggak
}
//-----------------------------------------//
function LPCAnalisis(sinyal:array of
double;framelength,p:integer;var a:array of double):integer;
var r :array of double;
flag,b,c:integer;
temp :double;
sinpred :array of double;
begin
setlength(r,p+1);
setlength(sinpred,framelength);
autocorelation(sinyal,framelength,p,r);
flag:=CariKoefisienPrediksi(r,p,-1,a);
for b:=1 to framelength-1 do
begin
temp:=0;
for c:=1 to p do
if b-c>=0 then
temp:=temp+sinyal[b-c]*a[c];
sinpred[b]:=temp;
end;
result:=flag;
end;
//-----------------------------------------//
{
prosedur untuk mencari koefisien cepstral
p1 -> order dari lpc
p2 -> order dari cepstral
a -> koefisien dari lpc
c -> koefisien dari cepstral
hasilnya adalah koefisien cepstral -> c
}
//-----------------------------------------//
procedure lpc2cepstral(p1,p2:integer;a:array of double;var
c:array of double);
var i,j,k :integer;
temp :double;
begin
c[0]:=log10(a[0]);
c[1]:=-a[1];
for i:=2 to p2 do
begin
j:=i;
if i>p1 then k:=i-p1
else k:=1;
temp:=0;
repeat
temp:=temp+k*c[k]*a[i-k];
inc(k);
until k>=j;
c[i]:=-temp/i;
if i<=p1 then c[i]:=c[i]-a[i];
end;
end;
//-----------------------------------------//
{
prosedur untuk pembobotan koefisien cepstral untuk mengurangi
sensitivitas
p -> order dari cepstral
c -> koefisien dari cepstral
hasilnya adalah koefisien cepstral yang telah di boboti -> c
}
//-----------------------------------------//
procedure weightingcepstral(p:integer;var c:array of double);
var a:integer;
w:array of double;
arg:double;
begin
setlength(w,p+1);
arg:=M_PI/p;
for a:=1 to p do
w[a]:=1+(p/2)*sin(a*arg);
for a:=1 to p do
c[a]:=c[a]*w[a];
end;
end.
// Buat Unit 4
{$N+,E+}
(* Allows code to use type 'double' run on any iX86 machine *)
{$R-}
(* Turn off range checking...we violate array bounds rules *)
unit Unit4;
interface
uses math, Unit1;
procedure InisialisasiBobot(var vbobot:array of Tdatabobot;var
wbobot:Tdatabobot);
procedure LayerIn(prev:array of double;var
next:T1dimensi;bobot:Tdatabobot);
procedure FungsiAktivasi(inp:array of double;var hasil:array of
double);
procedure CalculateOutputEror(target,output,out_in:array of
double;var eror_k:array of double);
procedure CalculateHidenEror(eror_next,hiden_in:array of
double;bobot:Tdatabobot;var eror_j:array of double);
procedure
UpdateBobot(alpha,miu:double;eror_next,prev_data:array of
double;var bobot,oldbobot:Tdatabobot);
implementation
procedure RandomBobot(var bobot:Tdatabobot);
var a,b:integer;
begin
for a:=0 to high(bobot) do
for b:=0 to high(bobot[a]) do
bobot[a,b]:=random-0.5;
end;
procedure NguyenWidrow(var bobot:tdatabobot);
var beta:double;
a,b :integer;
old :double;
UnitInput,UnitHiden:integer;
begin
UnitInput:=high(bobot);
UnitHiden:=high(bobot[0]);
beta:=0.7*(power(UnitHiden,1/UnitInput));
for a:=1 to UnitHiden do
begin
old:=0;
for b:=1 to UnitInput-1 do
old:=old+sqr(bobot[b,a]);
old:=sqrt(old);
for b:=1 to UnitInput-1 do
bobot[b,a]:=beta*bobot[b,a]/old;
bobot[0,a]:=beta*(1-2*random);
end;
end;
function sigmoid(nilai:real):real ;
begin
result:=1/(1+(exp(-nilai)));
end;
function TurunanSigmoid(nilai:real):real ;
begin
result:= sigmoid(nilai)*(1-sigmoid(nilai));
end;
procedure InisialisasiBobot(var vbobot:array of Tdatabobot;var
wbobot:Tdatabobot);
var a:integer;
begin
RandomBobot(vbobot[0]);
NguyenWidrow(vbobot[0]);
if high(vbobot)>0 then
for a:=1 to high(vbobot) do
RandomBobot(vbobot[a]);
RandomBobot(wbobot);
end;
procedure LayerIn(prev:array of double;var
next:T1dimensi;bobot:Tdatabobot);
var a,b:integer;
begin
for a:=1 to high(next) do
begin
next[a]:=bobot[0,a];
for b:=1 to high(prev) do
next[a]:=next[a]+bobot[b,a]*prev[b];
end;
end;
procedure FungsiAktivasi(inp:array of double;var hasil:array of
double);
var a:integer;
begin
for a:=1 to high(hasil) do
hasil[a]:=sigmoid(inp[a]);
end;
procedure CalculateOutputEror(target,output,out_in:array of
double;var eror_k:array of double);
var a:integer;
begin
for a:=1 to high(target) do
eror_k[a]:=(target[a]-output[a])*TurunanSigmoid(out_in[a]);
end;
procedure CalculateHidenEror(eror_next,hiden_in:array of
double;bobot:Tdatabobot;var eror_j:array of double);
var a,b:integer;
eror_in:double;
begin
for a:=1 to high(bobot) do
begin
eror_in:=0;
for b:=1 to high(bobot[a]) do
eror_in:=eror_in+eror_next[b]*bobot[a,b];
eror_j[a]:=eror_in*TurunanSigmoid(hiden_in[a]);
end;
end;
procedure
UpdateBobot(alpha,miu:double;eror_next,prev_data:array of
double;var bobot,oldbobot:Tdatabobot);
var a,b:integer;
temp:Tdatabobot;
begin
setlength(temp,high(bobot)+1);
for a:=0 to high(bobot) do
begin
setlength(temp[a],high(bobot[a])+1);
for b:=0 to high(bobot[a]) do
temp[a,b]:=bobot[a,b];
end;
for a:=0 to high(bobot) do
for b:=0 to high(bobot[a]) do
bobot[a,b]:=bobot[a,b]+alpha*eror_next[b]*prev_data[a]+miu*(bobot[a,b]-oldbobot[a,b]);
for a:=0 to high(bobot) do
for b:=0 to high(bobot[a]) do
oldbobot[a,b]:=temp[a,b];
end;
end.
// Buat Unit Fourier
{$N+,E+} (* Allows code to use type 'double' and run on any
iX86 machine *)
{$R-} (* Turn off range checking...we violate array bounds
rules *)
unit Fourier;
interface
procedure fft (
NumSamples: word; // positiF integer pgkt 2
var RealIn: array of double;
var ImagIn: array of double;
var RealOut: array of double;
var ImagOut: array of double );
procedure ifft (
NumSamples: word; // positiF integer pgkt 2
var RealIn: array of double;
var ImagIn: array of double;
var RealOut: array of double;
var ImagOut: array of double );
procedure fft_integer (
NumSamples: word;
var RealIn: array of integer;
var ImagIn: array of integer;
var RealOut: array of double;
var ImagOut: array of double );
procedure fft_integer_cleanup;
procedure CalcFrequency (
NumSamples: word; // positif integer
FrequencyIndex: word; // 0 .. NumSamples-1
var RealIn: array of double;
var ImagIn: array of double;
var RealOut: double;
var ImagOut: double );
function MakePowerOfTwo(nilai:integer ):integer;
procedure fftlain(dir,m:integer;var x,y:array of double);
implementation
function IsPowerOfTwo ( x: word ): boolean;
var i, y: word;
begin
y := 2;
for i := 1 to 15 do begin
if x = y then begin
IsPowerOfTwo := TRUE;
exit;
end;
y := y SHL 1;
end;
IsPowerOfTwo := FALSE;
end;
function NumberOfBitsNeeded ( PowerOfTwo: word ): word;
var i: word;
begin
for i := 0 to 16 do begin
if (PowerOfTwo AND (1 SHL i)) <> 0 then begin
NumberOfBitsNeeded := i;
exit;
end;
end;
end;
function ReverseBits ( index, NumBits: word ): word;
var i, rev: word;
begin
rev := 0;
for i := 0 to NumBits-1 do begin
rev := (rev SHL 1) OR (index AND 1);
index := index SHR 1;
end;
ReverseBits := rev;
end;
function MakePowerOfTwo(nilai:integer ):integer;
var val,a:integer;
begin
if val<=2 then
result:=2;
val:=2;
repeat
val:= val shl 1;
until val>=nilai;
result:=val;
end;
procedure FourierTransform (
AngleNumerator: double;
NumSamples: word;
var RealIn: array of double;
var ImagIn: array of double;
var RealOut: array of double;
var ImagOut: array of double );
var
NumBits, i, j, k, n, BlockSize, BlockEnd: word;
delta_angle, delta_ar: double;
alpha, beta: double;
tr, ti, ar, ai: double;
begin
if not IsPowerOfTwo(NumSamples) or (NumSamples<2) then
begin
write ( 'Error in procedure Fourier: NumSamples=',
NumSamples );
writeln ( ' is not a positive integer power of 2.' );
halt;
end;
NumBits := NumberOfBitsNeeded (NumSamples);
for i := 0 to NumSamples-1 do begin
j := ReverseBits ( i, NumBits );
RealOut[j] := RealIn[i];
ImagOut[j] := ImagIn[i];
end;
BlockEnd := 1;
BlockSize := 2;
while BlockSize <= NumSamples do begin
delta_angle := AngleNumerator / BlockSize;
alpha := sin ( 0.5 * delta_angle );
alpha := 2.0 * alpha * alpha;
beta := sin ( delta_angle );
i := 0;
while i < NumSamples do begin
ar := 1.0; (* cos(0) *)
ai := 0.0; (* sin(0) *)
j := i;
for n := 0 to BlockEnd-1 do begin
k := j + BlockEnd;
tr := ar*RealOut[k] - ai*ImagOut[k];
ti := ar*ImagOut[k] + ai*RealOut[k];
RealOut[k] := RealOut[j] - tr;
ImagOut[k] := ImagOut[j] - ti;
RealOut[j] := RealOut[j] + tr;
ImagOut[j] := ImagOut[j] + ti;
delta_ar := alpha*ar + beta*ai;
ai := ai - (alpha*ai - beta*ar);
ar := ar - delta_ar;
INC(j);
end;
i := i + BlockSize;
end;
BlockEnd := BlockSize;
BlockSize := BlockSize SHL 1;
end;
end;
procedure fft (
NumSamples: word;
var RealIn: array of double;
var ImagIn: array of double;
var RealOut: array of double;
var ImagOut: array of double );
begin
FourierTransform ( 2*PI, NumSamples, RealIn, ImagIn,
RealOut, ImagOut );
end;
procedure ifft (
NumSamples: word;
var RealIn: array of double;
var ImagIn: array of double;
var RealOut: array of double;
var ImagOut: array of double );
var
i: word;
begin
FourierTransform ( -2*PI, NumSamples, RealIn, ImagIn,
RealOut, ImagOut );
(* Normalize the resulting time samples... *)
for i := 0 to NumSamples-1 do begin
RealOut[i] := RealOut[i] / NumSamples;
ImagOut[i] := ImagOut[i] / NumSamples;
end;
end;
type
doubleArray = array [0..0] of double;
var
RealTemp, ImagTemp: ^doubleArray;
TempArraySize: word;
procedure fft_integer (
NumSamples: word;
var RealIn: array of integer;
var ImagIn: array of integer;
var RealOut: array of double;
var ImagOut: array of double );
var
i: word;
begin
if NumSamples > TempArraySize then begin
fft_integer_cleanup; { free up memory in case we
already have some. }
GetMem ( RealTemp, NumSamples * sizeof(double) );
GetMem ( ImagTemp, NumSamples * sizeof(double) );
TempArraySize := NumSamples;
end;
for i := 0 to NumSamples-1 do begin
RealTemp^[i] := RealIn[i];
ImagTemp^[i] := ImagIn[i];
end;
FourierTransform (
2*PI,
NumSamples,
RealTemp^, ImagTemp^,
RealOut, ImagOut );
end;
procedure fft_integer_cleanup;
begin
if TempArraySize > 0 then begin
if RealTemp <> NIL then begin
FreeMem ( RealTemp, TempArraySize * sizeof(double) );
RealTemp := NIL;
end;
if ImagTemp <> NIL then begin
FreeMem ( ImagTemp, TempArraySize * sizeof(double) );
ImagTemp := NIL;
end;
TempArraySize := 0;
end;
end;
procedure CalcFrequency (
NumSamples: word; { must be integer power of 2 }
FrequencyIndex: word; { must be in the range 0 ..
NumSamples-1 }
var RealIn: array of double;
var ImagIn: array of double;
var RealOut: double;
var ImagOut: double );
var
k: word;
cos1, cos2, cos3, theta, beta: double;
sin1, sin2, sin3: double;
begin
RealOut := 0.0;
ImagOut := 0.0;
theta := 2*PI * FrequencyIndex / NumSamples;
sin1 := sin ( -2 * theta );
sin2 := sin ( -theta );
cos1 := cos ( -2 * theta );
cos2 := cos ( -theta );
beta := 2 * cos2;
for k := 0 to NumSamples-1 do begin
{ Update trig values }
sin3 := beta*sin2 - sin1;
sin1 := sin2;
sin2 := sin3;
cos3 := beta*cos2 - cos1;
cos1 := cos2;
cos2 := cos3;
RealOut := RealOut + RealIn[k]*cos3 - ImagIn[k]*sin3;
ImagOut := ImagOut + ImagIn[k]*cos3 + RealIn[k]*sin3;
end;
end;
procedure fftlain(dir,m:integer;var x,y:array of double);
var nn,i,i1,j,k,i2,l,l1,l2:longint;
c1,c2,tx,ty,t1,t2,u1,u2,z:double;
begin
nn:=1;
for i:=0 to m do
nn:=nn*2;
i2:=nn shr 1;
j:=0;
for i:=0 to nn-1 do
begin
if i<j then
begin
tx:=x[i];
ty:=y[i];
x[i]:=x[j];
y[i]:=y[j];
x[j]:=tx;
y[j]:=ty;
end;
k:=i2;
while k<=j do
begin
j:=j-k;
k:=k shr 1;
end;
j:=j+k;
end;
c1:=-1.0;
c2:=0.0;
l2:=1;
for l:=0 to m do
begin
l1:=l2;
l2:=l2 shl 1;
u1:=1.0;
u2:=0.0;
for j:=0 to 11 do
begin
i:=j;
repeat
i1:=i+l1;
t1:=u1*x[i1]-u2*y[i1];
t2:=u1*y[i1]+u2*x[i1];
x[i1]:=x[i]-t1;
y[i1]:=y[i]-t2;
x[i]:=x[i]+t1;
y[i]:=y[i]+t2;
inc(i,l2);
until i>=nn;
z:=u1*c1-u2*c2;
u2:=u1*c2+u2*c1;
u1:=z;
end;
c2:=sqrt((1.0-c1)/2.0);
if dir=1 then
c2:=-c2;
c1:=sqrt((1.0+c1)/2.0);
end;
if dir=1 then
for i:=0 to nn do
begin
x[i]:=x[i]/nn;
y[i]:=y[i]/nn;
end;
end;
end.
Download Jaringan Syaraf Tiruan
Sabtu, 23 Juni 2012
Pengertian Delphi
Delphi adalah Suatu bahasa pemrograman yang menggunakan visualisasi
sama seperti bahasa pemrograman Visual Basic ( VB ) . Namun Delphi
menggunakan bahasa yang hampir sama dengan pascal (sering disebut objeck
pascal ) . Sehingga lebih mudah untuk digunakan . Bahasa pemrograman
Delphi dikembangkan oleh CodeGear sebagai divisi pengembangan perangkat
lunak milik embarcadero . Divisi tersebut awalnya milik borland ,
sehingga bahasa ini memiliki versi Borland Delphi .
Delphi juga menggunakan konsep yang berorientasi objek ( OOP ) ,
maksudnya pemrograman dengan membantu sebuah aplikasi yang mendekati
keadaan dunia yang sesungguhnya . Hal itu bisa dilakukan dengan cara
mendesign objek untuk menyelesaikan masalah . OOP ini memiliki beberapa
unsur yaitu ; Encapsulation ( pemodelan ) , Inheritance ( Penurunan ) ,
Polymorphism ( Polimorfisme ) .
Awalnya bahasa pemrograman delphi hanya dapat digunakan di
Microsoft Windows, namun saat ini telah dikembangkan sehingga dapat
digunakan juga di Linux dan di Microsoft .NET . Dengan menggunakan free
pascal yang merupakan proyek OpenSource, bahasa pemrograman ini dapat
membuat program di sistem operasi Mac OS X dan Windows CE .
Umumnya delphi hanya digunakan untuk pengembangan aplikasi dekstop,
enterprise berbasis database dan program - program kecil . Namun karena
pengembangan delphi yang semakin pesat dan bersifat general purpose
bahasa pemrograman ini mampu digunakan untuk berbagai jenis pengembangan
software . Dan Delphi juga disebut sebagai pelopor perkembangan RadTool
( Rapid Apllication Development ) tahun 1995 . Sehinnga banyak orang
yang mulai mengenal dan menyukai bahasa pemrograman yang bersifat VCL (
Visual Component Library ) ini .
Langganan:
Postingan (Atom)