Pengantar
Berikut adalah laporan singkat perancangan sistem neural network pada tahap simulasi
MATLAB dengan aplikasi yang spesifik. Kelompok tim penulis merupakan kelompok
gabungan yang memutuskan untuk menerapkan sistem klasifikasi uang kertas. Dataset
sistem diperoleh dengan memotret empat jenis nominasi mata uang kertas Rupiah di
sepuluh arah pencahayaan yang berbeda. Foto-foto uang kertas Rupiah kemudian
dipotong (di-crop) dan diekstrak fitur warna RGB-nya dengan Feature Extractor:
Histrogram RGB sehingga masing-masing foto diperoleh representasi Histogram RGB-
nya berupa delapan buah bilangan double. Dataset ini kemudian digunakan untuk
mentraining neural network. Sistem neural network ini termasuk sistem jenis fungsi
klasifikasi. Dataset histogram RGB uang kertas diklasifikasikan sesuai nominal uangnya.
Pertama dilakukan simulasi menggunakan kode MATLAB secara default pada tipe data
double untuk mengetahui apakah dataset mungkin untuk konvergen. Skema training yang
digunakan adalah Mini Batch SGD.
Pada skema training Mini Batch SGD dataset dibagi menjadi dataset training dan dataset
test. Dataset training dibagi lagi menjadi mini batch yang mana masing-masing mini
batch tersusun atas sejumlah data (batch) yang ditrain secara bersamaan. Penulis
berusaha menggunakan algoritma backpropagation yang memanfaatkan operasi matriks
atau vektor secara langsung daripada operasi per elemen dengan for loop. Operasi
matriks langsung lebih cepat daripada operasi manual dengan for loop namun lebih
banyak memakan memori.
Page 1 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
Selanjutnya dicoba dilakukan simulasi pada tipe data fixed point. Simulasi dengan tipe
data fixed point dilakukan untuk melihat apakah konvergensinya masih terjaga di sistem
dengan tipe data fixed point. Penulis menggunakan skema fixed point dengan 1 bit
signed, 32 bit word, dan 23 bit fraction.
Operasi fixed point di MATLAB dapat dilakukan dengan membuat objek fixed point fi.
Penulis menggunakan syntaks berikut untuk menkonversi tipe data default, yaitu double,
ke fixed point: y = fi(x, 1, word, frac, F). ’x’ adalah objek bertipe data
double yang ingin dikonversi, ’1’ artinya dipilih mode signed fixed point, ’word’
menyimpan nilai lebar word, ’frac’ menyimpan nilai lebar fraction, dan F menyimpan
objek fimath. Object fimath berguna untuk mendefinisikan property-property aritmatika
fixed point yang dijalankan seperti menentukan metode rounding, apa yang dilakukan
ketika overflow, menentukan mode perkalian, penjumlahan dan lain-lain. Berikut definisi
objek fimath, word dan frac yang digunakan oleh penulis.
Page 2 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
'SumWordLength', 32,...
'SumFractionLength', 23,...
'CastBeforeSum', true);
word = 32; %Lebar word dengan struktur: |s (word - frac - 1) frac|
frac = 23; %Lebar fraksi
Supaya waktu eksekusi simulasi fixed point berjalan lebih cepat, fungsi sigmoid yang
digunakan dikonversi ke tipe data MEX (MATLAB executable). File MEX memberikan
interface antara fungsi-fungsi MATLAB dengan fungsi-fungsi di C, C++ atau Fortran.
Interfacing ini membuat waktu eksekusi dengan MEX file lebih cepat daripada dengan
fungsi MATLAB biasa.
1.1 Simulasi MATLAB Dataset Histogram RGB Uang Tipe Data Double
Pada bagian ini dijelaskan kode yang digunakan untuk menisumlasikan dataset histogram
RGB uang dengan tipe data simulasi double. Pertama kode melakukan pembersihan
workspace seperti biasa sebagai berikut.
clear;clc;tic;
% Kode utama untuk training tipe data double
% Adaptasi dari:
% http://www2.bcs.rochester.edu/sites/raizada/matlab-neural-nets.html
% kode MATLAB dari LSI Contest, dan
% http://neuralnetworksanddeeplearning.com/chap1.html
labels = zeros(4,size(inputs,2));
for i = 1:18
labels(:,i) = [1; 0; 0; 0];
end
for i = 19:36
labels(:,i) = [0; 1; 0; 0];
end
for i = 37:54
labels(:,i) = [0; 0; 1; 0];
end
for i = 55:72
labels(:,i) = [0; 0; 0; 1];
end
Page 3 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
Urutan dataset adalah 18 data nominal uang pertama diikuti 18 data nominal uang kedua
lalu 18 data nominal uang ketiga dan 18 data nominal uang keempat. Urutan data ini
dapat digambarkan berupa [111...111 222...222 333...333 444...444], masih belum
berselingan. Untuk membuatnya berselingan menjadi [1 2 3 4 1 2 3 4 ... 1 2 3 4] maka
digunakan kode berikut.
for i = 1:18
inputx(:,i,1) = inputs(:,i);
labelx(:,i,1) = labels(:,i);
end
for i = 1:18
inputx(:,i,2) = inputs(:,18+i);
labelx(:,i,2) = labels(:,18+i);
end
for i = 1:18
inputx(:,i,3) = inputs(:,36+i);
labelx(:,i,3) = labels(:,36+i);
end
for i = 1:18
inputx(:,i,4) = inputs(:,54+i);
labelx(:,i,4) = labels(:,54+i);
end
j = 1;
for i = 1:72
input(:,i) = inputx(:,j,mod(i-1,4)+1);
label(:,i) = labelx(:,j,mod(i-1,4)+1);
if rem(i,4)==0
j = j + 1;
end
end
Page 4 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
k_tr = zeros(size(inputs,1),num_tr); %input untuk training
t_tr = zeros(size(labels,1),num_tr); %supervisor untuk training
k_ts = zeros(size(inputs,1),num_ts); %input untuk testing
t_ts = zeros(size(labels,1),num_ts); %supervisor untuk testing
Berikutnya dilakukan inisialisasi terhadap weight dan bias dengan persebaran Gaussian
pada rentang -0.5 hingga 0.5 melalui kode berikut.
% Inisialisi Bias
b2 = 0.5*(1-2*rand(num_hid,1));
b3 = 0.5*(1-2*rand(num_out,1));
Page 5 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
Tx = zeros(size(t,1),mini_batch_size,num_batch); % Operator supervisor
data untuk backpropagation
correct_out = 0; % Inisialisasi jumlah output yang benar
Pada kode di atas juga dilakukan inisialisasi parameter-parameter seperti epoch, ukuran
mini batch, jumlah batch dll.
z2 = w1 * X(:,:,i) + b2;
a2 = 1./(1+exp(-z2)); % Sigmoid
da2 = (1 - a2).*a2;
z3 = w2 * a2 + b3;
a3 = 1./(1+exp(-z3)); % Sigmoid
da3 = (1 - a3).*a3;
%Error Determination
output_error = Tx(:,:,i) - a3; % Error matrix
s3 = - output_error .* da3; % Persamaan untuk s3 menggunakan
'minus dari output error'
s2 = (w2.' * s3) .* da2;
O = (X(:,:,i) * s2.').';
dw1 = dw1 + O;
O = (a2 * (s3).').';
dw2 = dw2 + O;
db2 = db2 + sum(s2,2);
db3 = db3 + sum(s3,2);
Page 6 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
w1 = w1 - eta * dw1;
w2 = w2 - eta * dw2;
b2 = b2 - eta * db2;
b3 = b3 - eta * db3;
end
%Tahap Testing
z2 = w1 * k_ts + b2;
a2 = 1./(1 + exp(-z2)); % Sigmoid
z3 = w2 * a2 + b3;
a3 = 1./(1 + exp(-z3)); % Sigmoid
Pada tahap testing, parameter banyaknya data yang teruji benar (correct_out) akan
diupdate dan loop di atas akan terus berlanjut hingga diperoleh banyaknya data yang
teruji benar (correct_out) lebih besar dari pada nilai yang diinginkan di awal loop
pada kode while.
Page 7 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
Nilai banyaknya data yang teruji benar (correct_out), Sum Squared Error (SSE), dan
waktu eksekusi pada epoch ke 10000 akan dicuplik untuk setiap variasi. Berikut cuplikan
untuk konfigurasi default.
Epoch 10000 Output 6/18(33.3333%) SSE Test Time 0.0010009 seconds
Variasi dilakukan dengan mengubah nilai-nilai pada parameter konfigurasi kecuali nilai
epoch. Berikut hasil-hasil yang diperoleh.
Dari data-data di atas dapat diamati bahwa jumlah data yang benar saat tahap testing
selalu antara 23% hingga 44% dari jumlah data yang diujikan. Dengan keakuratan paling
tinggi adalah 44%, yaitu dari 18 data uji ada 8 data yang berhasil dijawab dengan benar.
Karena akurasi sistem neural network dengan dataset uang ini rendah (di bawah 90%),
maka diputuskan untuk tidak melanjutkan dataset ini ke tahap simulasi fixed point.
Page 8 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
1.3 Simulasi MATLAB MNIST di Double dan Hasilnya
Meskipun dataset histogram uang memberikan akurasi yang kurang, tahap simulasi fixed
point tetap akan dilakukan dengan dataset MNIST. Seperti biasa pertama dilakukan
simulasi di tipe data double terlebih dahulu untuk menkonfirmasi konvergensi datasetnya.
Kode yang digunakan mirip seperti kode untuk simulasi dataset uang, hanya saja
inisialisasi datasetnya berbeda. Skema training tetap menggunakan Mini Batch SGD.
Eksekusi training MNIST dalam tipe data double cukup singkat, yaitu sekitar 4 detik
untuk setiap epochnya. Pada epoch pertama sistem sudah konvergen dan menghasilkan
akurasi keluaran 94.29%. Epoch-epoch selanjutnya menghasilkan keakuratan yang tidak
terlalu signnifikan, menghaisilkan akurasi sekitar 2% lebih tinggi dari epoch pertama.
Waktu eksekusi 30 epoch ini adalah sekitar 246.7078 detik.
Page 9 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
Epoch 1 Batch 5 SSE 4.5149 Time 1.1858 seconds
Eksekusi batch pertama memerlukan waktu sekitar 95 detik karena eksekusi pertama
termasuk menjalankan inisialisasi awal. Selanjutnya setiap batch dieksekusi sekitar
1.1667 detik.
Dengan jumlah data training 50000 dan membuat satu batch berisi 10 data maka terdapat
5000 batch. Setiap epoch, program melakukan loop sebanyak batch yang ada sehingga
diperkirakan epoch pertama akan selesai setelah (5000 - 1)×1.1667 detik = 8333.333
detik atau sekitar 2.3 jam. Untuk menguji konvergensi MNIST di fixed point maka
penulis mencetak nilai sum square error di dalam loop batch. Dapat diamati nilai SSE
semakin kecil seiring dengan diolahnya batch baru.
Penulis mencoba mencuplik hasil pengujian yang dilakukan di dalam loop batch. Hasil
yang diperoleh memang tidak memperlihatkan bertambahnya jumlah nilai yang diperoleh
benar secara uniform. Berikut hasil yang diperoleh untuk 450 batch pertama.
Persentase output yang benar kadang naik kadang turun, namun jelas bahwa Sum
Squared Error (SSE) turun dengan kenaikan batch.
2. Kesimpulan
Proses training neural network bukanlah suatu hal yang trivial, karena konvergen
tidaknya suatu sistem neural network bergantung pada banyak parameter seperti misalnya
dataset yang digunakan, inisialisasi weight dan bias, jumlah neuron dan layer yang
Page 10 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
terlibat, skema training yang digunakan, dan di mana sistem neural network tersebut
disimulasikan atau diimplementasikan.
Tim penulis memiliki beberapa pilihan langkah yang dalat diambil untuk tahap desain
selanjutnya. Tim penulis dapat meneruskan implementasi sistem klasifikasi uang kertas
dengan mencari terlebih dahulu dataset training yang menghasilkan akurasi yang baik
(>90% success rate). Tim penulis dapat pula mengambil ide implementasi sistem lainnya
dimulai dengan memperoleh terlebih dahulu dataset yang bagus. Tanpa harus mencari
dataset lainnya, tim penulis dapat memilih untuk mengimplementasikan sistem klasifikasi
angka dengan dataset MNIST yang telah teruji konvergensi dan keakuratannya.
Page 11 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
LAMPIRAN
A. Kode MATLAB Simulasi Neural Network MNIST Fixed Point
clear;clc;tic;
% Kode utama untuk training tipe Double
% Adaptasi dari:
% http://www2.bcs.rochester.edu/sites/raizada/matlab-neural-nets.html
% kode MATLAB dari LSI Contest, dan
% http://neuralnetworksanddeeplearning.com/chap1.html
%% Inisialisasi Property Fixed Point
F = fimath('RoundingMethod', 'Floor',...
'OverflowAction', 'Wrap',...
'ProductMode', 'SpecifyPrecision',...
'ProductWordLength', 32,...
'ProductFractionLength', 23,...
'SumMode', 'SpecifyPrecision',...
'SumWordLength', 32,...
'SumFractionLength', 23,...
'CastBeforeSum', true);
word = 32; %Lebar word dengan struktur: |s (word - frac - 1) frac|
frac = 23; %Lebar fraksi
%% Inisialisasi Variabel-Variabel Awal
images = loadMNISTImages('train-images.idx3-ubyte');
labels = loadMNISTLabels('train-labels.idx1-ubyte');
labelx = zeros(10,60000);
for i = 1:60000
labelx(labels(i)+1,i) = 1 ;
end
k = zeros(size(k_tr));
t = zeros(size(t_tr));
Page 12 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
% Inisiasi Bias
b2_init = 0.5*(1-2*rand(num_hid,1));
b3_init = 0.5*(1-2*rand(num_out,1));
X = zeros(size(k,1),mini_batch_size,num_batch);
Tx = zeros(size(t,1),mini_batch_size,num_batch);
correct_out = 0; % Inisialisasi jumlah output yang benar
%% Loop Utama: Backpropagation
for j = 1:epoch %while sse > 0.01 %for i = 1:iterations % repeat the
whole training set over and over
order = randperm(num_tr); % randomize the presentations
for i = 1:num_tr % create randomized training and supervisor matrix
k(:,i) = k_tr(:,order(i));
t(:,i) = t_tr(:,order(i));
end
for i = 1:num_batch % divide training and supervisor matrix into
mini batches
for m = 1:mini_batch_size
X(:,m,i) = fi(k(:,mini_batch_size*(i-1)+m),1,word,frac,F);
Tx(:,m,i) = fi(t(:,mini_batch_size*(i-1)+m),1,word,frac,F);
end
end
for i = 1:num_batch
dw1 = zeros(size(w1)); % Last w1 change, set to a
zero matrix
dw2 = zeros(size(w2)); % Last w2 change, set to a
zero matrix
db2 = zeros(size(b2)); % Last b2 change, set to a
Page 13 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
zero matrix
db3 = zeros(size(b3)); % Last b3 change, set to a
zero matrix
z2_a = w1 * X(:,:,i);
z2 = fi(z2_a + repmat(b2,1,size(z2_a,2)),1,word,frac,F);
a2 = sigmoid(z2); % Sigmoid
da2 = (fi(1,1,word,frac,F) - a2).*a2;
z3_a = w2 * a2;
z3 = fi(z3_a + repmat(b3,1,size(z3_a,2)),1,word,frac,F);
a3 = sigmoid(z3); % Sigmoid
da3 = (fi(1,1,word,frac,F) - a3).*a3;
%Error Determination
output_error = Tx(:,:,i) - a3; % Error matrix
s3 = - output_error .* da3; % Persamaan untuk s3 menggunakan
'minus dari output error'
s2 = (w2.' * s3) .* da2;
O = (X(:,:,i) * s2.').';
dw1 = dw1 + O;
O = (a2 * (s3).').';
dw2 = dw2 + O;
db2 = db2 + sum(s2,2);
db3 = db3 + sum(s3,2);
w1 = w1 - eta * dw1;
w2 = w2 - eta * dw2;
b2 = b2 - repmat(eta * db2,1,size(b2,2));
b3 = b3 - repmat(eta * db3,1,size(b3,2));
Page 14 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
number of difference between output and test labels
function fm = get_fimath()
Page 15 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
fm = fimath('RoundingMethod', 'Floor',...
'OverflowAction', 'Wrap', 'ProductMode',
'SpecifyPrecision',...
'ProductWordLength', 32,...
'ProductFractionLength', 23,...
'SumMode', 'SpecifyPrecision',...
'SumWordLength', 32,...
'SumFractionLength', 23,...
'CastBeforeSum', true);
end
%
% Copyright 2017 The MathWorks, Inc.
Page 16 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
...
0.000380358557049955, 0.000411505907822958, 0.000445202761850394,
...
0.000481657609901766, 0.000521095959490524, 0.000563761718131161,
...
0.00060991868807858, 0.000659852181370384, 0.000713870764662537,
...
0.000772308144064414, 0.000835525200943112, 0.000903912190481124,
...
0.000977891115638176, 0.00105791829008914, 0.00114448710468715, ...
0.00123813101303576, 0.001339426752847, 0.00144899782091428, ...
0.00156751822073934, 0.00169571650312097, 0.00183438012133579, ...
0.00198436012391749, 0.00214657620946235, 0.00232202216935159, ...
0.00251177174577387, 0.00271698493394405, 0.00293891475893011, ...
0.00317891455900252, 0.00343844580888367, 0.0037190865176726, ...
0.00402254023751618, 0.00435064572025131, 0.00470538726020264, ...
0.00508890576202741, 0.00550351057288243, 0.00595169211816411, ...
0.00643613537954287, 0.00695973425286337, 0.00752560682157847, ...
0.00813711157857305, 0.00879786462533554, 0.00951175787224651, ...
0.0102829782570408, 0.0111160279899979, 0.0120157458238281, ...
0.0129873293332075, 0.0140363581731105, 0.0151688182660697, ...
0.0163911268458171, 0.0177101582579334, 0.0191332703866291, ...
0.0206683315400527, 0.0223237475839908, 0.0241084890649186, ...
0.0260321180075047, 0.0281048140083545, 0.0303373991765172, ...
0.0327413613917513, 0.0353288752635453, 0.0381128200774811, ...
0.0411067939110328, 0.0443251229890827, 0.0477828652315156, ...
0.0514958068231101, 0.0554804505121647, 0.0597539942223798, ...
0.0643342984469858, 0.0692398407906541, 0.0744896559403176, ...
0.0801032592890252, 0.0861005524171015, 0.0925017086633065, ...
0.0993270371077195, 0.106596823450966, 0.114331146524894, ...
0.122549669521426, 0.131271405491508, 0.140514457255118, ...
0.150295732582821, 0.160630636360929, 0.17153274243056, ...
0.183013448881866, 0.195081621764222, 0.207743233405497, ...
0.22100100277064, 0.23485404647149, 0.249297550094635, ...
0.264322470362556, 0.279915279200623, 0.2960577609652, ...
0.312726873819967, 0.329894685467503, 0.347528392113271, ...
0.365590427651866, 0.384038667649752, 0.402826729823838, ...
0.421904369490595, 0.441217965032369, 0.460711084971502, ...
0.480325124952091, 0.5, 0.519674875047909, ...
0.539288915028498, 0.558782034967631, 0.578095630509405, ...
0.597173270176162, 0.615961332350248, 0.634409572348134, ...
0.652471607886729, 0.670105314532497, 0.687273126180033, ...
0.7039422390348, 0.720084720799377, 0.735677529637444, ...
0.750702449905365, 0.76514595352851, 0.77899899722936, ...
0.792256766594504, 0.804918378235778, 0.816986551118134, ...
0.82846725756944, 0.839369363639071, 0.849704267417179, ...
0.859485542744882, 0.868728594508492, 0.877450330478574, ...
0.885668853475106, 0.893403176549034, 0.90067296289228, ...
0.907498291336693, 0.913899447582898, 0.919896740710975, ...
0.925510344059682, 0.930760159209346, 0.935665701553014, ...
0.94024600577762, 0.944519549487835, 0.94850419317689, ...
0.952217134768484, 0.955674877010917, 0.958893206088967, ...
0.961887179922519, 0.964671124736455, 0.967258638608249, ...
0.969662600823483, 0.971895185991645, 0.973967881992495, ...
0.975891510935081, 0.977676252416009, 0.979331668459947, ...
0.980866729613371, 0.982289841742067, 0.983608873154183, ...
0.98483118173393, 0.985963641826889, 0.987012670666792, ...
Page 17 of 18
13214002 Bangsa Edwiranda 13214122 Adi Trisna Nur Wijaya
13214105 Muhammad Ihsan Hadi 13214123 Mukhtar Amin
0.987984254176172, 0.988883972010002, 0.989717021742959, ...
0.990488242127754, 0.991202135374665, 0.991862888421427, ...
0.992474393178421, 0.993040265747137, 0.993563864620457, ...
0.994048307881836, 0.994496489427118, 0.994911094237973, ...
0.995294612739797, 0.995649354279749, 0.995977459762484, ...
0.996280913482328, 0.996561554191116, 0.996821085440997, ...
0.99706108524107, 0.997283015066056, 0.997488228254226, ...
0.997677977830648, 0.997853423790538, 0.998015639876083, ...
0.998165619878664, 0.998304283496879, 0.998432481779261, ...
0.998551002179086, 0.998660573247153, 0.998761868986964, ...
0.998855512895313, 0.998942081709911, 0.999022108884362, ...
0.999096087809519, 0.999164474799057, 0.999227691855936, ...
0.999286129235338, 0.99934014781863, 0.999390081311921, ...
0.999436238281869, 0.99947890404051, 0.999518342390098, ...
0.99955479723815, 0.999588494092177, 0.99961964144295, ...
0.999648432044464, 0.99967504409823, 0.999699642348958, ...
0.999722379098173, 0.999743395141858, 0.999762820637771, ...
0.999780775907638, 0.9997973721791, 0.999812712271889, ...
0.999826891232402, 0.999839996920525, 0.999852110552278, ...
0.999863307201601, 0.999873656264321, 0.999883221887157, ...
0.999892063364373, 0.999900235504521, 0.999907788969506, ...
0.999914770588065, 0.999921223645592, 0.999927188152063, ...
0.999932701089744, 0.999937796642176, 0.99994250640587, ...
0.999946859585997, 0.999950883177294, 0.999954602131298, ],
numerictype(T),fimath(x));
end
x_idx = fi((x - -10)*12.7,1,13,4,fimath(x));
idx_bot = floor(x_idx);
x_idx(:) = x_idx + 1;
if ( idx_bot >= fi(255,numerictype(idx_bot),fimath(x)) )
idx_bot = fi((254),numerictype(idx_bot),fimath(x));
elseif ( idx_bot <= fi(0,numerictype(idx_bot),fimath(x)) )
idx_bot = fi(1,numerictype(idx_bot),fimath(x));
end
idx_top = fi(idx_bot+1,numerictype(idx_bot),fimath(x));
x_bot = idx_bot;
x_top = idx_top;
y_bot = LUT(idx_bot);
y_top = LUT(idx_top);
y = y_top*(x_idx-x_bot) + ...
y_bot*(x_top - x_idx);
end
function fm = get_fimath()
fm = fimath('RoundingMethod', 'Floor',...
'OverflowAction', 'Wrap', 'ProductMode',
'SpecifyPrecision',...
'ProductWordLength', 32,...
'ProductFractionLength', 23,...
'SumMode', 'SpecifyPrecision',...
'SumWordLength', 32,...
'SumFractionLength', 23,...
'CastBeforeSum', true);
end
Page 18 of 18