Hidayatul Fitriyah
NRP. 7203 030 039
Dosen Pembimbing :
Disetujui oleh
Tim Penguji Proyek Akhir: Dosen Pembimbing:
Mengetahui
Ketua Jurusan Telekomunikasi
ii
ABSTRAK
iii
ABSTRACT
iv
KATA PENGANTAR
Adapun tugas akhir ini disusun sebagai salah satu syarat untuk
memperoleh gelar Ahli Madya (A.Md) di Politeknik Elektronika Negeri
Surabaya Institut Teknologi Sepuluh Nopember Surabaya (ITS).
Saya menyadari bahwa masih banyak kekurangan pada
perancangan dan pembuatan buku laporan tugas akhir ini. Oleh karena
itu, besar harapan saya untuk menerima saran dan kritik dari para
pembaca. Semoga buku ini dapat memberikan manfaat bagi para
mahasiswa Politeknik Elektronika Negeri Surabaya pada khususnya dan
juga para pembaca pada umumnya.
Penulis
v
UCAPAN TERIMA KASIH
vi
DAFTAR ISI
vii
2.2.3 Membuat Ekstensi Snack di C/C++ ……..…… 10
2.2.4 Sekilas Tentang Visual C++ ………..……….. 13
2.3 Sistem Pengolahan Sinyal Suara …………………… 15
2.3.1 Sinyal Suara Manusia ………….……………. 15
2.3.2 Sampling ….....................................…..……… 17
2.3.3 Frame Blocking ......................................…….. 18
2.3.4 Windowing …......................................…...….. 19
2.3.5 FFT (Fast Fourier Transform) ......................... 21
2.3.6 Cepstrum .......................................................... 23
2.3.7 IFFT (Inverse Fast Fourier Transform) ........... 25
2.3.8 Liftering ............................................................ 25
2.3.9 Cepstrum FFT .................................................. 25
2.3.10 Peak Extract ................................................... 25
BAB III PERENCANAAN DAN PEMBUATAN
3.1 Pendahuluan ……………………………………….. 27
3.2 Sistem Pengolahan Sinyal Suara …………………… 27
3.2.1 Perekaman Suara …..………………………... 29
3.2.2 Sampling ……..……………………………… 30
3.2.3 Frame Blocking .…………………………….. 32
3.2.4 Windowing ......................………………….… 33
3.2.5 FFT (Fast Fourier Transform)……………….. 34
3.2.6 IFFT (Inverse Fast Fourier Transform) …..…. 35
3.2.7 Cepstral Window (liftering) ………………….. 36
3.2.8 Peak Extract ………………………………..… 37
BAB IV PENGUJIAN DAN ANALISA
4.1 Pendahuluan ………………………...……………… 39
4.2 Pengujian dan Analisa
viii
Sistem Pengolahan Sinyal Suara ............................... 39
4.2.1 Perekaman Suara ………………..……..……. 39
4.2.2 Sampling …………………………….………. 42
4.2.3 Windowing …………………….……..…… . 43
4.2.4 FFT (Fast Fourier Transform) ……………… 45
4.2.5 Liftering ……………………………..….…… 47
4.2.6 Cepstrum FFT (Spectral Envelope) ………….. 48
4.2.7 Peak Extract (Fundamental Period) ……..…... 50
BAB V KESIMPULAN DAN SARAN
5.1 Kesimpulan ……………………………………...… 53
5.2 Saran …………………………………………...….. 53
DAFTAR PUSTAKA …………………………………………… 55
BIODATA PENULIS
LAMPIRAN
ix
DAFTAR GAMBAR
x
frame ke-11
Gambar 4.4 Hasil windowing kata /optik/ pada 45
frame ke-11
Gambar 4.5 Hasil FFT kata /optik/ pada frame 46
ke-11
Gambar 4.6 Hasil liftering kata /optik/ 48
Gambar 4.7 Hasil FFT untuk kata /optik/ 49
Gambar 4.8 Selubung spektral untuk kata /optik/ 50
Gambar 4.9 Fundamental period untuk kata 51
/optik/
xi
DAFTAR TABEL
xii
BAB I
PENDAHULUAN
1.2 TUJUAN
a. Mempelajari lebih lanjut tentang pengolahan sinyal digital,
khususnya pengenalan penutur (speaker recognition).
b. Merancang voice dial telephone dengan memanfaatkan sistem
pengenalan suara untuk proses dial telephone.
c. Hasil dari proyek akhir ini diharapkan dapat bermanfaat agar
waktu dalam panggilan telepon lebih efisien dan juga menambah
wawasan tentang speaker recognition sehingga dapat
diaplikasikan dalam bentuk lain.
1
2
Bab I Pendahuluan
1.4 METODOLOGI
Untuk perancangan voice dial telephone dengan menggunakan
teknik pengenalan penutur (speaker recognition), dibutuhkan langkah-
langkah sebagai berikut:
(a) Perancangan Sistem
Perancangan sistem dilakukan berdasarkan pada diagram
pembelajaran (enrollment phase) dan diagram pengujian (testing
phase) dimana untuk diagram enrollment phase sistem akan
melakukan dan menganalisa sedemikian rupa sinyal suara / wicara
dari user kemudian dimasukkan ke dalam database. Sedangkan
untuk pengujian, bahwa sinyal suara yang dimasukkan ke dalam
sistem akan dikenali melalui cara pembandingan dengan data pada
database, setelah itu sistem akan mengambil keputusan berdasarkan
hasil pembandingan data tersebut.
(b) Perancangan dan Pengenalan Perangkat Lunak (Software)
Perancangan dan pengenalan software meliputi software snack
2.2.2 Tcl/Tk 8.3.0 dan juga software bahasa C. Dari tiap tahap
sistem dibuat suatu simulasi program dengan tujuan untuk
mengetahui dan memahami output dari masing-masing.
3
Bab I Pendahuluan
Bab I Pendahuluan
Similarity
Reference
model Maximum Identification
Input Feature
(Speaker #1) selection result
speech extraction
(Speaker ID)
Similarity
Reference
model
(Speaker #N)
5
6
Verification
Input Feature result
Similarity Decision
speech extraction (Accept/Reject)
Reference
Speaker ID Threshold
model
(#M) (Speaker #M)
2.2.1 Snack
Snack merupakan software yang digunakan untuk pemrosesan suara
yang dipakai sebagai extensi dalam suatu bahasa pemrograman. Snack
biasanya digunakan bersama-sama dengan bahasa pemrograman script
seperti Tcl/Tk, Python, Ruby. Dalam proyek akhir ini akan
menggunakan software snack versi 2.2.2.n
Snack memiliki banyak perintah dalam hubungannya pada
pemrosesan dan memvisualisasikan suara seperi memainkan, merekam,
menampilkan obyek suara. Selain itu Snack juga menyediakan obyek-
obyek suara dengan level yang lebih tinggi dan manajemen
penyimpanan yang fleksibel. Selain itu Snack dapat menangani sebagian
besar format file suara yang ada. dan juga dapat menampilkan
visualisasi dari suatu sinyal suara secara real-time.
Snack dapat diperluas dengan perintah-perintah baru yang
beroperasi dalam suatu obyek suara. Selain itu juga memungkinkan
untuk menambah suatu format file suara dan tipe filter yang baru. Snack
dapat digunakan untuk array yang lebar untuk sesuatu yang
berhubungan dengan file-file suara dan data audio. Dari satu baris
perintah yang mudah, seperti memainkan suatu file suara atau
menemukan nilai ekstrim sinyalnya sampai aplikasi-aplikasi analisis
suara yang kompleks dengan suatu tampilan grafis (graphical user
8
interfaces).
2.2.2 Tcl / tk
Tcl merupakan singkatan dari Tool Control Language. Sedangkan
Tk adalah Graphical Toolkit extension dari Tcl. Tcl/tk menyediakan
bermacam-macam item standar antarmuka GUI untuk memfasilitasi user
untuk mmbuat sebuah tampilan atau desain secara cepat dan juga bisa
untuk pengembangan aplikasi tingkat tinggi lainnya.
Untuk bahasa pemrograman di Tcl/tk bentuknya sama seperti
bahasa pemrograman di C/C++ terutama pada loop structures, definisi
fungsi dan logika penghitungannya. Catatan, didalam Tcl semua data di
representasikan sebagai string.
2.2.2.4 Kondisi
Penkondisian di Tcl sama persis dengan pengkondisian di bahasa
C, kecuali untuk ‘foreach’ tidak sama dengan C. Syntax pengkondisian
di Tcl seperti dibawah ini.
• if {...condition...} {...body...}
• while {...condition...} {...body...}
• for {...init...} {...condition...} {...body...}
• foreach varnames {...list...} {...body...}
10
2.2.2.5 Procedurs
Procedur di dalam pemrograman Tcl mirip dengan fungsi di
Program C.
Contoh :
% proc tambah {a b} {
< return [expr $a+$b}
<}
untuk memanggil procedurnya yaitu misal tambah 3 4
#endif
if (Tcl_PkgProvide(interp, "get_data", "1.0") != TCL_OK)
{
return TCL_ERROR;
}
Snack_AddSubCmd(SNACK_SOUND_CMD, "get_data",
(Snack_CmdProc *)
Square, NULL);
return TCL_OK;
}
#/usr/local/bin/wish
# 'info sharedlibext' returns .dll on Windows and .so on most Unix
systems
package require –exact snack 2.2
1
load lib\\Get_data
2 3
sound s
s length 10000
4
s Get_data
pack [button .b -text Play -command {s play}]
keterangan :
1. Nama extensi file .dll
2. Strutur dari snack sound toolkit untuk pemrosesan suara
3. Nama obyek yang digunakan untuk pemrosesan suara
4. Panggilan fungsi dari file .dll yang digunakan dalam program snack
13
Ekstensi Keterangan
.dsp Berkas ini berisi definisi dasar sebuah proyek,
berisi informasi tentang bagaimana aplikasi
diciptakan berdasarkan berkas-berkas yang
terdapat pada project workspace.
.dsw Berisi informasi tentang isi proyek.
.opt Berisi data tentang pengaturan-pengaturan
dalam proyek; misalnya, menyimpan informasi
tentang kemungkinan aplikasi bisa di debug
atau tidak.
.cpp Berisi kode sumber C++
.h Merupakan berkas judul (header file), yang
umumnya berisi definisi kelas atau berisi
prototipe fungsi.
15
Rongga
hidung/nasal
cavity
Lintasan Langit-langit
vokal Lunak/velum Langit-langit
Keras/palatu
m
Bibir/labia
Pita
Data Sampling
3000
2000
Amplitudo
1000
0
-1000 0 200 400 600
-2000 pitch
Jumlah Data
Gambar 2.4 Bentuk sinyal suara kata /optik/ dalam 2 frame (pria)
Dari gambar 2.4 terlihat bahwa sinyal wicara mempunyai sifat quasi
periodik dan mempunyai unsur bunyi terkecil yang disebut sebagai
pitch. Panjang pitch berkisar 10 ms. Pitch manusia berbeda satu sama
lain terutama jenis kelamin laki-laki dan perempuan.
2.3.2 Sampling
Sinyal suara merupakan sinyal yang tidak terbatas dalam domain
waktu (finite time interval). Suara manusia akan menghasilkan sinyal
analog yang terus kontinyu. Untuk keperluan pemrosesan dalam
transformasi fourier maka sinyal wicara harus dibentuk dalam potongan-
potongan waktu yang terbatas (infinite time interval). Karena itu sinyal
yang ada dipotong-potong dalam slot-slot interval waktu tertentu.
Berdasarkan pada teori sampling Nyquist, maka syarat dari frekuensi
sampling adalah minimal dua kali frekuensi sinyal.
Data Sampling
3000
2000
Amplitudo
1000
0
-1000 0 200 400 600
-2000
Jumlah Data
Data Sampling
3000
2000
Amplitudo
1000
0
-1000 0 N 200 400 600
N N
-2000 M
M
Jumlah Data
2.3.4 Windowing
Merupakan proses untuk membatasi lebar sinyal yang akan
dianalisa yang dapat mengurangi efek diskontinuitas pada ujung-ujung
frame yang dihasilkan oleh potongan-potongan sinyal. Korelasi antara
lebar window dalam domain waktu dan amplitudo berguna untuk
menyederhanakan sinyal dengan mengurangi puncak sinyalnya.
Jika kita mendefinisikan window seperti w( n), 0 ≤ n ≤ N − 1 ,
dimana N adalah jumlah sample dalam tiap frame, maka hasil dari
windowing adalah sinyal :
♦ Window Hamming
♦ Window Hanning
{1 − cos[2πn /( N − 1)]} / 2 0 ≤ n ≤ N −1
Whan(n) =
0 elsewhere
(2.5)
♦ Window Bartlett
2n /( N − 1) 0 ≤ n ≤ (N −1) / 2
WB(n) = 2 − 2n /( N − 1) (N −1) / 2 ≤ n ≤ N −1
0 elsewhere
(2.6)
♦ Window Blackman
dimana:
N = Jumlah data dalam satu window
n = urutan data ke-n
21
Data Windowing
1500
1000
amplitudo
500
0
-500 0 100 200 300
-1000
-1500
jumlah data
(2.8)
DFT (Discrete Fourier Transform) yang dibatasi pada set N sample
{xn} adalah sebagai berikut :
N −1
X n = ∑ xk e −2πjkn / N , n = 0,1,2,..., N − 1 (2.9)
k =0
Sebagai catatan bahwa di sini kita menggunakan j untuk menunjuk
pada unit imaginer, misal : j = − 1 . Pada umumnya xn adalah
bilangan kompleks. Deretan sinyal yang dihasilkan {xn} diartikan
sebagai berikut : frekuensi nol sama dengan n = 0, frekuensi positif
22
(2.10)
FFT dilakukan dengan membagi N buah titik pada transformasi
fourier diskrit menjadi 2, masing-masing (N/2) titik transformasi. Proses
memecah menjadi 2 bagian ini diteruskan dengan membagi (N/2) titik
menjadi (N/4) dan seterusnya hingga diperoleh titik minimum.
Pemakaian FFT karena untuk penghitungan komputasi yang lebih
cepat dan mampu mereduksi jumlah perkalian dari N2 menjadi NlogN
perkalian. FFT yang digunakan memakai 512 point dan arena hasil FFT
simetris, maka keluaran FFT tersebut hanya diambil sebanyak 256 data.
Hasil dari proses FFT akan diperoleh titik-titik sinyal yang simetris
sehingga data yang dimbil hanya setengah dari data keseluruhan.
Untuk proses selanjutnya, yakni IFFT (Inverse Fast Fourier
Transform) hanya diperlukan nilai real dari FFT. Oleh karena itu
diperlukan harga mutlak dari log nilai FFT.
23
10
8
6
(dB)
4
2
0
0 100 200 300
frekuensi
2.3.6 Cepstrum
Cepstrum adalah fourier transform dari logaritma autospektrum.
Berguna untuk membatasi periodiksitas pada autospektrum. Cepstrum
juga berfungsi untuk menggandakan domain frekuensi dan konvolusi
pada domain waktu. Cepstrum merupakan serangkaian proses yang
terdiri dari FFT (Fast Fourier Transform), IFFT (Inverse Fast Fourier
Transform), liftering (cepstral window), dan peak extract (fundamental
period).
Bentuk matematis dari proses cepstrum bisa dipisahkan menjadi dua
variabel. Jika kita mengambil bentuk log dari magnitude kedua variabel
tersebut, maka diperoleh rumus :
Log |X(ω)| = log |G(ω) | + log |H(ω) | (2.11)
Berikut adalah contoh gambar dari sinyal hasil cepstrum dari laki-
laki dan perempuan dengan kata yang sama. Dapat dilihat bahwa pada
suara wanita sering terjadi puncak-puncak daripada cepstrum pria.
Gambar 2.9 Contoh sinyal dalam domain kepstral antara laki-laki dan
perempuan
25
3.1 PENDAHULUAN
Dalam bab ini akan dibahas tentang pengolahan sinyal suara untuk
mendapatkan ciri atau parameter dari suara masuk. Selain itu juga akan
membahas tentang pengolahan hasil compare (perbandingan) keluaran
untuk menghasilkan atau membangkitkan sinyal DTMF.
`
Sinyal suara
27
28
(Fast Fourier Transform) dimana dalam proses ini hanya diambil nilai
realnya saja untuk digunakan pada proses berikutnya.
Selanjutnya adalah IFFT dimana sinyal yang semula berada dalam
domain frekuensi akan dikonversikan ke dalam domain waktu.
Proses selanjutnya adalah liftering (cepstral window). Pada proses
ini mengambil 16 buah data yang dapat mewakili seluruh data. 16 buah
data ini akan diambil titik puncaknya yang nantinya dipakai sebagai fitur
yang dapat mempresentasikan masing – masing frame. Untuk
membuktikan 16 buah data ini dapat mewakili keseluruhan data dapat
digunakan proses FFT lagi. Kemudian fitur yang diperoleh tersebut
digunakan sebagai pembanding database dengan metode DTW.
Data Sampling
3000
2000
Amplitudo
1000
0
-1000 0 200 400 600
-2000
Jumlah Data
M u la i
S in y a l
M asu kan
B a c a P a n ja n g
S in y a l
B a g i M e n ja d i N
F ra m e
i= 0 ;i< N ;i+ +
A m b il 2 4 0
d a ta s a m p e l
T a m p ilk a n
n ila i s a m p e l
S e le s a i
Data Sampling
3000
2000
Amplitudo
1000
0
-1000 0 N 200 400 600
N N
-2000 M
M
Jumlah Data
3.2.4 Windowing
Windowing yang digunakan pada proyek akhir ini adalah window
Hamming. Digunakan windowing ini karena mempunyai hasil yang
lebih baik dalam pembatasan sinyal yang akan dianalisa. Setelah proses
pengambilan sampel maka langkah selanjutnya adalah proses
windowing yang berfungsi untuk mengurangi efek diskontinuitas pada
ujung-ujung frame yang dihasilkan oleh potongan – potongan sinyal.
Persamaan dari window Hamming adalah sebagai berikut :
240 data
sam pel
i=0;i<240;i++
Ha m m ing W indow
y[i]=x[i]*(0.54-0.46*cos(2*phi*(i-1)/240))
Selesai
dengan k = 0,1,2,….,N-1
35
5.1 KESIMPULAN
Dari pengujian dan analisa yang dilakukan dapat disimpulkan
bahwa :
1. Frekuensi sampling yang digunakan sebesar 12000 Hz
bertujuan agar memenuhi syarat bahwa frekuensi sampling
besarnya lebih dari sama dengan 2 kali frekuensi sinyal info
(finfo sama dengan fsuara yang berada di antara range 300-
5000 Hz)
2. Pemberian interval selama 200 ms bertujuan untuk
mengantisipasi adanya unvoiced plossive antara kata pertama
dan kedua sehingga sinyal tersebut dianggap masih merupakan
sinyal utama
3. Pada proses windowing ujung-ujung sinyal dinolkan agar
sinyal tersampling lebih halus serta untuk mengurangi efek
diskontinuitas. Hal ini terbukti bahwa pada titik sample 0-50
dan 20-seterusnya level sinyal adalah 0
4. Fitur yang terbentuk mewakili 16 data dalam tiap frame dari
keseluruhan sinyal suara. 16 data dari awal sample pada tiap
frame merupakan pembeda karakter suara seseorang. Terbukti
bahwa amplitudo yang spesifik berada tepat di awal data 0-5
5.2 SARAN
Mengingat masih banyaknya hal-hal yang belum dapat
diimplementasikan pada proyek akhir ini, maka kami
mempertimbangkan beberapa saran untuk perlu adanya perbaikan-
perbaikan proyek akhir ini, antara lain :
1. Sistem yang semula menggunakan metode dependent speaker
dirasa masih belum maksimal karena sistem tidak hanya
mengenali karakter suara tertentu saja melainkan semua orang
(independent speaker)
2. Kepekaan sistem dalam mengenali kondisi lingkungan saat
pengenalan suara sangat tinggi sehingga kesalahan tidak dapat
dihindari
53
54
55
BIODATA PENULIS
RIWAYAT PENDIDIKAN
Tahun Pendidikan
#!/bin/sh
# the next line restarts using wish \
exec wish8.4 "$0" "$@"
load libtest
snack::sound s
pack [label .l1 -text "Aplikasi Pengenalan Penutur untuk Dial Telepon"]
pack [label .l2 -text "dengan Metode Dependent Speaker"]
pack [label .l3 -text "oleh"]
pack [label .l4 -text "Hidayatul Fitriyah dan Auruma Nurrachmad"]
pack [label .l5 -text ""]
proc Start {} {
s reset
.f.running configure -state normal
.f.recording configure -state normal
}
B. Program Perekaman
#!/bin/sh
# the next line restarts using wish \
exec wish8.4 "$0" "$@"
# 'info sharedlibext' returns '.dll' on Windows and '.so' on most Unix systems
load global\\lib\\global
snack::sound z -channels 2
snack::sound x -file sound.wav -debug 0
snack::sound y
after 1 Update
proc Update {} {
set l [z max -start 0 -end -1 -channel 0]
.a2.time config -text [format "%.3f sec" [y length -unit seconds]]
z length 0
.a1.levelMeter configure -level $l
after 50 Update
}
C. Program Pengujian
#!/bin/sh
#the next line restarts using wish \
exec wish8.4 "$0" $@"
load global\\lib\\global
Lampiran
snack::sound z -channels 2
snack::sound x -file sound.wav -debug 0
snack::sound y
x configure -rate 12000 -encoding LIN16 -channels MONO
tk_messageBox -message {Single click untuk Record, Double click untuk Dial
Telephon, Right click untuk Play sound }
proc run {} {
y input;y dtw
start
Lampiran
proc singleclick { w } {
variable singleclick_timer
catch {
unset singleclick_timer($w)
}
y record; z record
.f5.1 configure -text "Record"
return
.f5.1 configure -text ""
}
after 1 Update
proc Update {} {
set l [z max -start 0 -end -1 -channel 0]
.f3 config -text [format "%.3f sec" [y length -unit seconds]]
z length 0
.f2.lml configure -level $l
.f2.lmr configure -level $l
after 50 Update
}
.f2.c itemconf wave -pixelspersecond 300 -width 300
.f2.c create waveform 152 102 -anchor c -sound y -height $height -tags wave -
debug 0 -zerolevel 0 -frame $frame -fill white
proc start {} {
set data [read [open data\\hasil\\out.txt]]
if { $data == 0 } {
.f5.1 configure -text "Status Ready"
}
Lampiran
if { $data == 1 } {
.f5.1 configure -text "Call.... optik 4160"
x flush
x concatenate s4
x concatenate a
x concatenate s1
x concatenate a
x concatenate s6
x concatenate a
x concatenate s0
x play
}
if { $data == 2 } {
.f5.1 configure -text "call.... kajur 1116"
x flush
x concatenate s1
x concatenate a
x concatenate s1
x concatenate a
x concatenate s1
x concatenate a
x concatenate s6
x play
}
if { $data == 3 } {
.f5.1 configure -text "Call.... digital 1502"
x flush
x concatenate s1
x concatenate a
x concatenate s5
x concatenate a
x concatenate s0
x concatenate a
x concatenate s2
x play
}
if { $data == 4 } {
.f5.1 configure -text "Call.... teleponi 1501"
x flush
x concatenate s1
x concatenate a
x concatenate s5
x concatenate a
Lampiran
x concatenate s0
x concatenate a
x concatenate s1
x play
}
if { $data == 5 } {
.f5.1 configure -text "Call.... multimedia 4163"
x flush
x concatenate s4
x concatenate a
x concatenate s1
x concatenate a
x concatenate s6
x concatenate a
x concatenate s3
x play
}
}
#include <math.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include "snack.h"
#define beki 9
#define nlpc 256
#define inv 1.0f
#define inv2 -1.0f
float DP_match1(int);
float distance(int,int);
//void trace();
Lampiran
return TCL_OK;
}
freset=fopen("data\\hasil\\out.txt","w");
fprintf(freset,"%d\n",0);
fclose(freset);
return TCL_OK;
}
int front_end_clip(xx,yy,jml_sin)
float *xx,*yy;
int jml_sin;
{
int i,mulai,akhir,jml_sin_new;
float jml=0,mean,dev,jumdev=0,sd,batas;
Lampiran
for(i=0;i<jml_sin;i++)
jml+=xx[i];
mean=jml/jml_sin;
for(i=0;i<jml_sin;i++)
{
dev=(float)fabs(xx[i]-mean);
jumdev+=dev*dev;
}
sd=(float)sqrt(jumdev/jml_sin);
batas=mean+3*sd;
for(i=0;i<jml_sin;i++)
{
if(xx[i]>=batas)
{
mulai=i;
break;
}
}
for(i=jml_sin;i>0;i--)
{
if(xx[i]>=batas)
{
akhir=i;
break;
}
}
jml_sin_new=0;
for(i=mulai;i<akhir;i++)
{
yy[jml_sin_new]=xx[i];
jml_sin_new++;
}
return(jml_sin_new);
}
FILE *fsignal,*finfo,*fframe,*fsignalframe,*fhamm,*ffft,*flift,*flog,*fceps;
Sound *sound;
Lampiran
double temp_log1;
float x[30000],y[30000],temp[30000];
float real[512],imag[512];
float ms,spd;
int k,frame,frame_no,signal_length,signal_length_new,start;
void hammr();
void cal_fft();
signal_length = Snack_GetLength(sound);
for (k=0;k<signal_length;k++)
{
x[k]=(float)Snack_GetSample(sound, 0, k);
fprintf(fsignal,"%f\n",x[k]);
}
signal_length_new = front_end_clip(x,&y,signal_length);
for (k=0;k<signal_length_new;k++)
fprintf(finfo,"%f\n",y[k]);
frame_no = signal_length_new/120;
fprintf(fframe,"%d\n",frame_no);
start=0;
Lampiran
ms=0;
spd=(float)20/240;
for(frame=0;frame<frame_no-1;frame++)
{
start=(frame)*120;
for(k=0;k<240;k++)
{
temp[k]=y[start];
fprintf(fsignalframe,"%f\n",temp[k]);
start++;
}
}
for(frame=0;frame<frame_no-1;frame++)
{
for (k=0;k<240;k++)
{
real[k]=temp[k];
imag[k]=0;
}
hammr(real,imag,nlpc);
for(k=0;k<240;k++)
fprintf(fhamm,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=240;k<512;k++)
{
real[k]=0;
imag[k]=0;
}
cal_fft(real,imag,beki,inv);
for(k=0;k<512;k++)
{
Lampiran
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(ffft,"%f\t%f\n",k*6000.f/256.f,real[k]);
}
cal_fft(real,imag,beki,inv2);
for(k=16;k<512-16;k++)
{
real[k]=0.0;
imag[k]=0.0;
}
for(k=0;k<256;k++)
fprintf(flift,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(flog,"%f\t%f\n",ms=ms+spd,real[k]);
}
cal_fft(real,imag,beki,inv);
Lampiran
/* for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]);
}*/
}
fclose(fsignal);
fclose(finfo);
fclose(fframe);
fclose(fsignalframe);
fclose(fhamm);
fclose(ffft);
fclose(flift);
fclose(flog);
fclose(fceps);
return TCL_OK;
}
//,*flog
FILE *fsignal,*finfo,*fframe,*fsignalframe,*fhamm,*ffft,*flift,*flog,*fceps;
Sound *sound;
double temp_log1;
float x[30000],y[30000],temp[30000];
float real[512],imag[512];
float ms,spd;
int k,frame,frame_no,signal_length,signal_length_new,start;
void hammr();
void cal_fft();
fsignal=fopen("data\\standart\\sinyal_1.txt","w");
finfo=fopen("data\\standart\\info_1.txt","w");
fframe=fopen("data\\standart\\frame_1.txt","w");
fsignalframe=fopen("data\\standart\\signalframe_1.txt","w");
fhamm=fopen("data\\standart\\hamm_1.txt","w");
ffft=fopen("data\\standart\\fft_1.txt","w");
flift=fopen("data\\standart\\lift_1.txt","w");
flog=fopen("data\\standart\\log_1.txt","w");
fceps=fopen("data\\standart\\ceps_1.txt","w");
signal_length = Snack_GetLength(sound);
for (k=0;k<signal_length;k++)
{
x[k]=(float)Snack_GetSample(sound, 0, k);
fprintf(fsignal,"%f\n",x[k]);
}
signal_length_new = front_end_clip(x,&y,signal_length);
for (k=0;k<signal_length_new;k++)
fprintf(finfo,"%f\n",y[k]);
frame_no = signal_length_new/120;
fprintf(fframe,"%d\n",frame_no);
start=0;
ms=0;
spd=(float)20/240;
for(frame=0;frame<frame_no-1;frame++)
{
start=(frame)*120;
for(k=0;k<240;k++)
{
temp[k]=y[start];
fprintf(fsignalframe,"%f\n",temp[k]);
start++;
}
Lampiran
for(frame=0;frame<frame_no-1;frame++)
{
for (k=0;k<240;k++)
{
real[k]=temp[k];
imag[k]=0;
}
hammr(real,imag,nlpc);
for(k=0;k<240;k++)
fprintf(fhamm,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=240;k<512;k++)
{
real[k]=0;
imag[k]=0;
}
cal_fft(real,imag,beki,inv);
for(k=0;k<512;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(ffft,"%f\t%f\n",k*6000.f/256.f,real[k]);
}
cal_fft(real,imag,beki,inv2);
for(k=16;k<512-16;k++)
{
real[k]=0.0;
imag[k]=0.0;
}
for(k=0;k<256;k++)
fprintf(flift,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(flog,"%f\t%f\n",ms=ms+spd,real[k]);
}
cal_fft(real,imag,beki,inv);
/*for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]);
Lampiran
}*/
}
fclose(fsignal);
fclose(finfo);
fclose(fframe);
fclose(fsignalframe);
fclose(fhamm);
fclose(ffft);
fclose(flift);
fclose(flog);
fclose(fceps);
return TCL_OK;
}
FILE *fsignal,*finfo,*fframe,*fsignalframe,*fhamm,*ffft,*flift,*flog,*fceps;
Sound *sound;
double temp_log1;
float x[30000],y[30000],temp[30000];
float real[512],imag[512];
float ms,spd;
int k,frame,frame_no,signal_length,signal_length_new,start;
void hammr();
void cal_fft();
signal_length = Snack_GetLength(sound);
for (k=0;k<signal_length;k++)
{
x[k]=(float)Snack_GetSample(sound, 0, k);
fprintf(fsignal,"%f\n",x[k]);
}
signal_length_new = front_end_clip(x,&y,signal_length);
for (k=0;k<signal_length_new;k++)
fprintf(finfo,"%f\n",y[k]);
frame_no = signal_length_new/120;
fprintf(fframe,"%d\n",frame_no);
start=0;
ms=0;
spd=(float)20/240;
for(frame=0;frame<frame_no-1;frame++)
{
start=(frame)*120;
for(k=0;k<240;k++)
{
temp[k]=y[start];
fprintf(fsignalframe,"%f\n",temp[k]);
start++;
}
}
for(frame=0;frame<frame_no-1;frame++)
{
for (k=0;k<240;k++)
{
real[k]=temp[k];
imag[k]=0;
}
hammr(real,imag,nlpc);
for(k=0;k<240;k++)
fprintf(fhamm,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=240;k<512;k++)
{
real[k]=0;
imag[k]=0;
}
cal_fft(real,imag,beki,inv);
for(k=0;k<512;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(ffft,"%f\t%f\n",k*6000.f/256.f,real[k]);
}
cal_fft(real,imag,beki,inv2);
for(k=16;k<512-16;k++)
{
real[k]=0.0;
imag[k]=0.0;
}
for(k=0;k<256;k++)
Lampiran
fprintf(flift,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(flog,"%f\t%f\n",ms=ms+spd,real[k]);
}
cal_fft(real,imag,beki,inv);
/*for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]);
}*/
}
fclose(fsignal);
fclose(finfo);
fclose(fframe);
fclose(fsignalframe);
fclose(fhamm);
fclose(ffft);
fclose(flift);
fclose(flog);
Lampiran
fclose(fceps);
return TCL_OK;
}
FILE *fsignal,*finfo,*fframe,*fsignalframe,*fhamm,*ffft,*flift,*flog,*fceps;
Sound *sound;
double temp_log1;
float x[30000],y[30000],temp[30000];
float real[512],imag[512];
float ms,spd;
int k,frame,frame_no,signal_length,signal_length_new,start;
void hammr();
void cal_fft();
signal_length = Snack_GetLength(sound);
for (k=0;k<signal_length;k++)
{
x[k]=(float)Snack_GetSample(sound, 0, k);
fprintf(fsignal,"%f\n",x[k]);
}
Lampiran
signal_length_new = front_end_clip(x,&y,signal_length);
for (k=0;k<signal_length_new;k++)
fprintf(finfo,"%f\n",y[k]);
frame_no = signal_length_new/120;
fprintf(fframe,"%d\n",frame_no);
start=0;
ms=0;
spd=(float)20/240;
for(frame=0;frame<frame_no-1;frame++)
{
start=(frame)*120;
for(k=0;k<240;k++)
{
temp[k]=y[start];
fprintf(fsignalframe,"%f\n",temp[k]);
start++;
}
}
for(frame=0;frame<frame_no-1;frame++)
{
for (k=0;k<240;k++)
{
real[k]=temp[k];
imag[k]=0;
}
hammr(real,imag,nlpc);
for(k=0;k<240;k++)
fprintf(fhamm,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=240;k<512;k++)
{
real[k]=0;
imag[k]=0;
}
Lampiran
cal_fft(real,imag,beki,inv);
for(k=0;k<512;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(ffft,"%f\t%f\n",k*6000.f/256.f,real[k]);
}
cal_fft(real,imag,beki,inv2);
for(k=16;k<512-16;k++)
{
real[k]=0.0;
imag[k]=0.0;
}
for(k=0;k<256;k++)
fprintf(flift,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
Lampiran
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(flog,"%f\t%f\n",ms=ms+spd,real[k]);
}
cal_fft(real,imag,beki,inv);
/*for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]);
}*/
}
fclose(fsignal);
fclose(finfo);
fclose(fframe);
fclose(fsignalframe);
fclose(fhamm);
fclose(ffft);
fclose(flift);
fclose(flog);
fclose(fceps);
return TCL_OK;
}
FILE *fsignal,*finfo,*fframe,*fsignalframe,*fhamm,*ffft,*flift,*flog,*fceps;
Sound *sound;
double temp_log1;
float x[30000],y[30000],temp[30000];
float real[512],imag[512];
Lampiran
float ms,spd;
int k,frame,frame_no,signal_length,signal_length_new,start;
void hammr();
void cal_fft();
signal_length = Snack_GetLength(sound);
for (k=0;k<signal_length;k++)
{
x[k]=(float)Snack_GetSample(sound, 0, k);
fprintf(fsignal,"%f\n",x[k]);
}
signal_length_new = front_end_clip(x,&y,signal_length);
for (k=0;k<signal_length_new;k++)
fprintf(finfo,"%f\n",y[k]);
frame_no = signal_length_new/120;
fprintf(fframe,"%d\n",frame_no);
start=0;
ms=0;
spd=(float)20/240;
Lampiran
for(frame=0;frame<frame_no-1;frame++)
{
start=(frame)*120;
for(k=0;k<240;k++)
{
temp[k]=y[start];
fprintf(fsignalframe,"%f\n",temp[k]);
start++;
}
}
for(frame=0;frame<frame_no-1;frame++)
{
for (k=0;k<240;k++)
{
real[k]=temp[k];
imag[k]=0;
}
hammr(real,imag,nlpc);
for(k=0;k<240;k++)
fprintf(fhamm,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=240;k<512;k++)
{
real[k]=0;
imag[k]=0;
}
cal_fft(real,imag,beki,inv);
for(k=0;k<512;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
Lampiran
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(ffft,"%f\t%f\n",k*6000.f/256.f,real[k]);
}
cal_fft(real,imag,beki,inv2);
for(k=16;k<512-16;k++)
{
real[k]=0.0;
imag[k]=0.0;
}
for(k=0;k<256;k++)
fprintf(flift,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(flog,"%f\t%f\n",ms=ms+spd,real[k]);
}
cal_fft(real,imag,beki,inv);
/*for(k=0;k<256;k++)
Lampiran
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]);
}*/
}
fclose(fsignal);
fclose(finfo);
fclose(fframe);
fclose(fsignalframe);
fclose(fhamm);
fclose(ffft);
fclose(flift);
fclose(flog);
fclose(fceps);
return TCL_OK;
}
FILE *fsignal,*finfo,*fframe,*fsignalframe,*fhamm,*ffft,*flift,*flog,*fceps;
Sound *sound;
double temp_log1;
float x[30000],y[30000],temp[30000];
float real[512],imag[512];
float ms,spd;
int k,frame,frame_no,signal_length,signal_length_new,start;
void hammr();
void cal_fft();
fframe=fopen("data\\standart\\frame_5.txt","w");
fsignalframe=fopen("data\\standart\\signalframe_5.txt","w");
fhamm=fopen("data\\standart\\hamm_5.txt","w");
ffft=fopen("data\\standart\\fft_5.txt","w");
flift=fopen("data\\standart\\lift_5.txt","w");
flog=fopen("data\\standart\\log_5.txt","w");
fceps=fopen("data\\standart\\ceps_5.txt","w");
signal_length = Snack_GetLength(sound);
for (k=0;k<signal_length;k++)
{
x[k]=(float)Snack_GetSample(sound, 0, k);
fprintf(fsignal,"%f\n",x[k]);
}
signal_length_new = front_end_clip(x,&y,signal_length);
for (k=0;k<signal_length_new;k++)
fprintf(finfo,"%f\n",y[k]);
frame_no = signal_length_new/120;
fprintf(fframe,"%d\n",frame_no);
start=0;
ms=0;
spd=(float)20/240;
for(frame=0;frame<frame_no-1;frame++)
{
start=(frame)*120;
for(k=0;k<240;k++)
{
temp[k]=y[start];
fprintf(fsignalframe,"%f\n",temp[k]);
start++;
}
}
Lampiran
for(frame=0;frame<frame_no-1;frame++)
{
for (k=0;k<240;k++)
{
real[k]=temp[k];
imag[k]=0;
}
hammr(real,imag,nlpc);
for(k=0;k<240;k++)
fprintf(fhamm,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=240;k<512;k++)
{
real[k]=0;
imag[k]=0;
}
cal_fft(real,imag,beki,inv);
for(k=0;k<512;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(ffft,"%f\t%f\n",k*6000.f/256.f,real[k]);
}
cal_fft(real,imag,beki,inv2);
Lampiran
for(k=16;k<512-16;k++)
{
real[k]=0.0;
imag[k]=0.0;
}
for(k=0;k<256;k++)
fprintf(flift,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(flog,"%f\t%f\n",ms=ms+spd,real[k]);
}
cal_fft(real,imag,beki,inv);
/*for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]);
}*/
}
Lampiran
fclose(fsignal);
fclose(finfo);
fclose(fframe);
fclose(fsignalframe);
fclose(fhamm);
fclose(ffft);
fclose(flift);
fclose(flog);
fclose(fceps);
return TCL_OK;
}
int Dtw(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
{
FILE *fin,*fstd1,*fstd2,*fstd3,*fstd4,*fstd5;
FILE *fframe,*fout1,*fout2;
int i,j,r;
static int out=1;
float DP_dist,hasil[6],min;
float in_data,std_data_1,std_data_2,std_data_3,std_data_4,std_data_5;
float in_in,in_1,in_2,in_3,in_4,in_5;
fin=fopen("data\\input\\log_in.txt","r");
fstd1=fopen("data\\standart\\log_1.txt","r");
fstd2=fopen("data\\standart\\log_2.txt","r");
fstd3=fopen("data\\standart\\log_3.txt","r");
fstd4=fopen("data\\standart\\log_4.txt","r");
fstd5=fopen("data\\standart\\log_5.txt","r");
fout1=fopen("data\\hasil\\out1.txt","a");
fout2=fopen("data\\hasil\\out.txt","w");
fframe=fopen("data\\input\\frame_in.txt","r");
fscanf(fframe,"%d\n",&in_blk);
fclose(fframe);
for(i=0;i<in_blk;i++)
{
for(j=0;j<16;j++)
Lampiran
{
fscanf(fin,"%f\t%f\n",&in_in,&in_data);
in_CEP[i][j]=in_data;
}
}
fframe=fopen("data\\standart\\frame_1.txt","r");
fscanf(fframe,"%d\n",&st_blk);
fclose(fframe);
for(i=0;i<st_blk;i++)
{
for(j=0;j<16;j++)
{
fscanf(fstd1,"%f\t%f\n",&in_1,&std_data_1);
st_CEP[i][j]=std_data_1;
}
}
r=7;
DP_dist=DP_match1(r);
hasil[1]=DP_dist;
// trace();
/***** Menghitung jarak antara sinyal input dan standar Optik *****/
fframe=fopen("data\\standart\\frame_2.txt","r");
fscanf(fframe,"%d\n",&st_blk);
fclose(fframe);
for(i=0;i<st_blk;i++)
{
for(j=0;j<16;j++)
{
fscanf(fstd2,"%f\t%f\n",&in_2,&std_data_2);
st_CEP[i][j]=std_data_2;
}
}
Lampiran
r=7;
DP_dist=DP_match1(r);
hasil[2]=DP_dist;
// trace();
/***** Menghitung jarak antara sinyal input dan standar Mikro *****/
fframe=fopen("data\\standart\\frame_3.txt","r");
fscanf(fframe,"%d\n",&st_blk);
fclose(fframe);
for(i=0;i<st_blk;i++)
{
for(j=0;j<16;j++)
{
fscanf(fstd3,"%f\t%f\n",&in_3,&std_data_3);
st_CEP[i][j]=std_data_3;
}
}
r=7;
DP_dist=DP_match1(r);
hasil[3]=DP_dist;
// trace();
fframe=fopen("data\\standart\\frame_4.txt","r");
fscanf(fframe,"%d\n",&st_blk);
fclose(fframe);
for(i=0;i<st_blk;i++)
{
for(j=0;j<16;j++)
{
fscanf(fstd4,"%f\t%f\n",&in_4,&std_data_4);
st_CEP[i][j]=std_data_4;
}
}
Lampiran
r=7;
DP_dist=DP_match1(r);
hasil[4]=DP_dist;
// trace();
fframe=fopen("data\\standart\\frame_5.txt","r");
fscanf(fframe,"%d\n",&st_blk);
fclose(fframe);
for(i=0;i<st_blk;i++)
{
for(j=0;j<16;j++)
{
fscanf(fstd5,"%f\t%f\n",&in_5,&std_data_5);
st_CEP[i][j]=std_data_5;
}
}
r=7;
DP_dist=DP_match1(r);
hasil[5]=DP_dist;
// trace();
for(i=1;i<=5;i++)
fprintf(fout1,"%f\t",hasil[i]);
min=hasil[1];
for(i=1;i<=5;i++)
{
if(min>=hasil[i])
{
min=hasil[i];
out=i;
}
}
fprintf(fout2,"%d\t",out);
Lampiran
fclose(fin);
fclose(fstd1);
fclose(fstd2);
fclose(fstd3);
fclose(fstd4);
fclose(fstd5);
fclose(fout1);
fclose(fout2);
return TCL_OK;
}
/*
Initialize the rekamdata package and create a new sound
command'rekamdata'.
The syntax is: sndName rekamdata
*/
#ifdef USE_SNACK_STUBS
if (Snack_InitStubs(interp, "2", 0) == NULL) {
return TCL_ERROR;
}
#endif
Snack_AddSubCmd(SNACK_SOUND_CMD, "signal",
(Snack_CmdProc *) Signal, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "reset",
(Snack_CmdProc *) Reset, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "input",
(Snack_CmdProc *) Input, NULL);
Lampiran
Snack_AddSubCmd(SNACK_SOUND_CMD, "telkom",
(Snack_CmdProc *) Telkom, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "optik",
(Snack_CmdProc *) Optik, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "mikro",
(Snack_CmdProc *) Mikro, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "sinyal",
(Snack_CmdProc *) Sinyal, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "jarkom",
(Snack_CmdProc *) Jarkom, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "dtw",
(Snack_CmdProc *) Dtw, NULL);
return TCL_OK;
}
#ifdef __cplusplus
#endif
/*void preemp(x,y,n)
float *x,*y;
int n;
{
int i;
--x;
--y;
for(i=1;i<n;++i)
y[i]=x[i+1]-x[i];
// y[n]=(float)(2.0*y[n-1]-y[n-2]);
//}
void hammr(x,y,n)
float *x,*y;
Lampiran
int n;
{
int i;
--x;
--y;
for(i=0;i<=n;++i)
{
x[i]=x[i]*(float)(0.54-
0.46*cos(2.0*3.141592654*(i)/(float)n));
y[i]=y[i]*(float)(0.54-
0.46*cos(2.0*3.141592654*(i)/(float)n));
}
}
void cal_fft(x,y,l,mode)
float *x,*y,mode;
int l;
{
int np,lmx,lo,lix,lm,li,j1,j2,nv2,npm1,i,j,k;
float scl,arg,c,s,t1,t2;
for(i=0;i<pow(2,l);i++)
y[i]=0;
--x;
--y;
np=(int)pow(2.0,(float)(l));
lmx=np;
scl=(float)(6.283185303/(float)np);
for(lo=1;lo<=l;++lo)
{
lix=lmx;
lmx=(int)(lmx/2.0);
arg=0.0;
for(lm=1;lm<=lmx;++lm)
{
c=(float)cos(arg);
Lampiran
s=(float)(mode*sin(arg));
arg=arg+scl;
for (li=lix; lix<0 ? li>=np : li<=np; li+=lix)
{
j1=li-lix+lm;
j2=j1+lmx;
t1=x[j1]-x[j2];
t2=y[j1]-y[j2];
x[j1]=x[j1]+x[j2];
y[j1]=y[j1]+y[j2];
x[j2]=c*t1+s*t2;
y[j2]=c*t2-s*t1;
}
}
scl=(float)(2.0*scl);
}
j=1;
nv2=(int)(np/2.0);
npm1=np-1;
for(i=1;i<=npm1;++i)
{
if(i>=j)
goto L30;
t1=x[j];
t2=y[j];
x[j]=x[i];
y[j]=y[i];
x[i]=t1;
y[i]=t2;
L30:
k=nv2;
L40:
if(k>=j)
goto L50;
j-=k;
k=(int)(k/2.0);
goto L40;
Lampiran
L50:
j=j+k;
}
}
float DP_match1(r)
int r;
{
int i,j;
int I,J,up,dp;
float dist,g,g0,g1,g2,g3,a;
float DP_mdist=0.0;
for(i=0;i<in_blk;i++)
{
for(j=0;j<st_blk;j++)
{
G[i][j] = (float)1.0e+30;
}
}
I=in_blk-1;
J=st_blk-1;
a=(float)st_blk/(float)in_blk;
dist=distance(0,0);
G[0][0]=(float)(2.0*dist);
dist=0.0;
for(i=0;i<=I;i++)
{
up=(int)(a*i+r);
if(up>J)
up=J;
dp=(int)(a*i-r);
if(dp<0)
dp=0;
for(j=dp;j<=up;j++)
{
if(i==0 && j==0)
j++;
g0=(float)1.0e+30;
g1=(float)1.0e+30;
Lampiran
g2=(float)1.0e+30;
dist = distance(i,j);
if(j-1>=0)
g0 = (float)(G[i][j-1]+dist);
if(i-1>=0 && j-1>=0)
g1 = (float)(G[i-1][j-1]+2.0*dist);
if(i-1>=0)
g2 = (float)(G[i-1][j]+dist);
g3 = (g0<g1) ? g0:g1;
g = (g2<g3) ? g2:g3;
G[i][j] = g;
}
}
DP_mdist = G[I][J]/(st_blk+in_blk);
return(DP_mdist);
}
float distance(ab_t,ab_r)
int ab_t,ab_r;
{
int i;
float a,kyori;
a=0.0;
kyori=0.0;
for(i=0;i<16;i++)
{
a=(in_CEP[ab_t][i]-st_CEP[ab_r][i]);
kyori+=a*a;
}
return(kyori);
}