Wednesday, August 25, 2010

Menyoal C/C++ Sebagai Pengganti Matlab

Dalam membuat permodelan algoritma, kita sering menemui permasalahan matriks, vector, dan beberapa masalah aljabar. Matlab/Octave adalah bahasa pemrograman yang paling powerful untuk menjawab permasalahan tadi. Tapi jika ingin beralih ke C/C++, ada beberapa alternatif library yang bisa dicoba. Tentu saja matrix bisa dibuat menggunakan pure C/C++, tapi akan sangat tidak nyaman. Saya sendiri masih pemula dalam masalah ini tapi akan saya coba ulas sedikit disini.

Pertama, GSL (GNU Scientific Library). GSL, seperti kebanyakan software GNU lainnya, ditulis dalam C, walau ada beberapa wrapper untuk C++ nya. Syntax GSL cukup mudah dipahami bagi yang sudah terbiasa dengan Matlab/Octave. Misalnya, untuk menjumlahkan b yang bertipe scalar dengan nilai dari vector a pada posisi I, alih-alih menulis dengan notasi a(i)+=b, notasi GSL lebih wordy:

gsl_vector_float_set(a,i,gsl_vector_float_get(a,i)+b)

Sayangnya, example code GSL sangat minim. Bahkan di installer-nya tidak ada example sama sekali. beberapa contoh code menggunakan GSL bisa dilihat di dokumentasi online-nya.Ketika pertama kali mencoba membuat penjumlahan dua buah matrix (menggunakan gsl_matrix_add), saya menemui kesulitan karena dengan tidak adanya example code mengenai ini.

Berikut salah satu contoh code pakai GSL:

#include < stdio.h >
#include < gsl/gsl_matrix.h >
int main (void)
{
    int i, j;
    const int SIZE_ROW = 10;
    const int SIZE_COLUMN = 3;

    gsl_matrix * m1 = gsl_matrix_alloc (SIZE_ROW, SIZE_COLUMN);

    for (i=0; i < SIZE_ROW; i++ )
        for (j=0; j < SIZE_COLUMN; i++ )
            gsl_matrix_set (m1, i, j, (i+1) * (j+1));

    printf("\nmatrix m1: \n");
    for (i=0; i < SIZE_ROW; i++ )
        for (j=0; j < SIZE_COLUMN; i++ )
            printf ("%g ", gsl_matrix_get (m1, i, j));
        printf("\n");
        }

    gsl_matrix_free (m1);
    return 0;
};

Kedua, Armadillo. Armadillo disponsori oleh The University of Queensland. Kelebihan Armadillo (bagi saya) dibanding GSL adalah syntax yang lebih mirip dengan Matlab. Lebih lagi, mereka  membuatkan conversion table, sebagai perbandingan syntax Matlab dengan Armadillo. Tentu ini membuat para pengguna Matlab nyaman. Kekurangan yang cukup signifikan adalah bahwa umur project ini masih baru, belum matang, dan fitur-fitur-nya masih belum banyak, sehingga kemungkinan besar akan menyulitkan programmer. Silakan bandingkan fitur-fitur yang dimiliki Armadillo dengan GSL. Pun project turunan GSL jauh lebih banyak ketimbang Armadillo.

Berikut salah satu contoh code pakai Armadillo.

#include < iostream >
#include < armadillo >

using namespace std;
using namespace arma;

int main(int argc, char** argv)
{
    mat A = randu(4,5);
 
    cout << "A*trans(B) =" << endl;
    cout << A*trans(B) << endl;
 
    return 0;
}

Ketiga, IT++. IT++ lebih menspesialisasikan diri untuk signal processing dan telekomunikasi. Bahkan contoh implementasi yang mereka tawarkan sangat banyak. Class library yang ada banyak menyinggung masalah telekomunikasi, misalnya AWGN channel, modulasi, bahkan komputasi rumit seperti BCH dan Turbo Coding.

Pertama kali buka website-nya langsung disuguhi ini “As you might have noticed, the current IT++ maintenance and development team has not been active for some time. Therefore, IT++ is looking for volunteers who are interested in further maintenance and/or development of this library.” Well, tampaknya IT++ tidak lebih ramai dari dua C/C++ library sebelumnya. IT++ ini dirintis oleh Chalmers University, Swedia. Secara pribadi saya kurang tertarik dengan IT++. Kita lewat saja tanpa mencobanya.

Keempat, SPUC. SPUC (Signal Processing Using C++) agak lebih mirip dengan IT++. Menyediakan class library cukup komplit untuk aplikasi signal processing dan telekomunikasi. Sekilas SPUC ini cukup komplit, project ini juga cukup matang. Operasi vector dan matrix cukup lengkap dan convinient.

Overall, semua kembali pada pilihan masing-masing. Saya melihat SPUC dan GSL cukup potensial. Pertanyaan yang harus dijawab adalah: apakah library yang disupport sudah komplit? Mulai dari tipe data matriks, vector, sampai fix point? Bagaimana dengan kompatibilitas Unix/Windows-nya? Kemudahan porting dari Matlab-nya? Kemudahan integrasi dengan platform lainnya (misalnya SystemVerilog DPI)? Dan pertanyaan-pertanyaan lainnya yang muncul dari engineer modeling, dan system architect. So, apa pilihan Anda? Tolong share disinya ya... (ya2n)

Saturday, August 7, 2010

Ilustrasi ISI (bag.2)


Postingan sebelumnya menggambarkan terjadinya Inter-symbol Interference(ISI) dalam suatu ilustrasi sederhana. Kali ini akan saya jelaskan ilustrasi sederhana lainnya menggunakan rumusan sederhana dari transmit signal itu sendiri.
Jika kita mengirimkan sinyal \textbf{s} dan channel impulse response yang diderita sinyal kita sebut \textbf{H}, maka disisi penerima akan kita peroleh sinyal \textbf{y} = \textbf{H} \ast \textbf{s}
Berikut adalah ilustrasi dari 3 blok* sinyal dengan 3 jenis respon kanal, dan hasil konvolusinya (bisa direpresentasikan dalam perkalian matriks) tanpa menggunakan guard interval:


Daerah kosong pada matriks \textbf{H} adalah zeros (tidak ditampilkan/ditulis). A_{t-1} menunjukkan nilai A pada saat t-1.
Daerah yang diarsir gelap pada matriks hasil konvolusi adalah blok sinyal yang kita inginkan (blok sinyal biru). Dari ilustrasi tersebut terlihat bahwa pada bagian ini terdapat interferensi yang tidak dapat dihindari, berasal dari sinyal blok sebelumnya(berwarna merah) dan blok setelahnya(berwarna hijau).
*term blok digunakan pada sistem single carrier, sehingga ilustrasi diatas lebih tepat disebut Inter-Block Interference. Akan tetapi kasus yang sama bisa pula berlaku untuk symbol pada multicarrier. Artinya 1 blok disana bisa dianalogikan dengan 1 symbol OFDM

Ilustrasi ISI (bag.1)

Inter-symbol Interferense (ISI) adalah permasalahan yang tidak dapat dihindari dalam sistem komunikasi wireless. Setiap sinyal yang ditransmit akan mengalami multipath, sehingga receiver akan menerima sinyal yang notabene merupakan hasil akumulasi dari message yang sama yang terdelay dan dengan power yang bervariasi.

Berikut adalah ilustrasi mengenai multipath :


Base station memancarkan satu frame data. Receiver menerima beberapa sinyal yang datang bersamaan dimana setiap sinyalnya berisikan message yang sama.



Ilustrasi disamping menunjukkan apa yang terjadi pada sisi penerima. Setiap frame yang diterima di sisi penerima mengalami waktu kedatangan yang berbeda (delay) dan power yang berbeda (bisa dilihat dari tinggi tiap frame yang berbeda). Asumsi synchronizer pada sisi penerima sempurna mendapatkan awal frame dimulai dari awal frame merah.


Setiap frame terdiri dari beberapa simbol. Ilustrasi diatas menunjukkan ada 2 simbol dalam 1 frame. Karena semua frame berisikan message yang sama, maka akumulasi simbol pada waktu yang sama tidak menghilangkan informasi/data pada simbol tersebut. Garis putus-putus pada ilustrasi diatas menunjukkan batas dari simbol pertama. Bisa kita lihat adanya akumulasi simbol pertama dan simbol kedua, dimulai dari frame ungu. Sebagian simbol pertama frame ungu akan terakumulasi dengan simbol kedua frame merah. Begitu pula pada frame hijau, dan seterusnya. Kondisi inilah kita sebut dengan inter-symbol interference.

Thursday, August 5, 2010

Mendefinisikan Kembali Performa Verifikasi

"If I had asked people what they wanted, they would have said faster horses." Henry Ford.

Verification adalah proses yang memakan banyak resource baik waktu maupun orang. Dengan banyaknya memakan resource, performa menjadi perhatian utama bagi tim verifikasi. Dalam proses verifikasi, sangat dimungkinkan dilakukan invonasi-inovasi hanya demi meningkatkan performa verifikasi, dan inilah yang membedakan antara verification project yang sudah matang dan belum matang.

Apakah performa itu? 

Kecepatan? Ya, jelas kecepatan merupakan salah satu aspek terpenting dalam pekerjaan. Tapi jika sebuah tim mengambil jalan yang salah dalam pekerjaannya, secepat apapun proses itu sudah tidak berarti lagi.

Pencapaian target? Hmm.. Ya, sejauh ini kita menilai performa sebuah tim dari pencapaian yang dicapainya. Setiap progress meeting kita selalu ditanya pencapaian target bukan?

Bagaimana dengan efisiensi? Efisiensi-perbandingan target yang sudah dicapai dengan effort (usaha) yang sudah dikeluarkan untuk mencapainya-dari sisi project, cukup penting untuk diperhatikan.

Terakhir mungkin kualitas? Bagaimanapun cepat, efisien, dan sesuai target-nya sebuah project, kalau kualitas yang dihasilkan jelek, hasilnya tidak terlalu berguna, bahkan gagal.

Bagaimana performa dipandang dari sisi verifikasi?

Mari kiita lihat dari real problem dalam verifikasi. Performa verifikasi harus dinilai berdasarkan tujuan tim verifikasi, yaitu:

1. Memperkecil resiko dan menemukan bug secepatnya.
2. Tidak hanya tahu ada bug atau tidak, tapi juga harus tahu apakah verifikasi sudah selesai atau tidak, agar tingkat kepercayaan meningkat.
3. Meningkatkan productifitas dan efisiensi verifikasi agar makin banyak pekerjaan yang dapat diselesaikan; get more work done.

Bicara tentang get more work done, Henry Ford, pencipta perusahaan Ford Motor Company, dan salah satu pencetus modernisasi sistem produksi dengan assembly line, adalah salah satu contohnya. Quotation dia yang cukup terkenal adalah, "If I had asked people what they wanted, they would have said faster horses." 



Fokus pada real problem

Henry Ford berhasil memfokuskan dirinya pada real problem dan berpikir outside the box. Simaklah lanjutan ceritanya disini: ketika muncul pertanyaan apa yang dibutuhkan orang dan mendapati jawaban bahwa yang dibutuhkan adalah kuda yang lebih cepat, maka sebenarnya terjadi dialog lanjutan seperti ini:

Henry: Jadi kenapa Anda menginginkan kuda yang lebih cepat?
Farmer: Saya ingin pergi ke toko lebih cepat.
Henry: Dan kenapa Anda butuh pergi ke toko lebih cepat?
Farmer: Karena saya ingin menyelesaikan pekerjaan lebih banyak di sawah.

Lihatlah, sebenarnya si Farmer bukan ingin kuda yang lebih cepat, tapi lebih kepada agar bisa menyelesaikan banyak pekerjaan di sawahnya. OK, kuda lebih cepat adalah salah satu solusi, tapi inti dari permasalahan sebenarnya adalah "Bagaimana agar bisa menyelesaikan lebih banyak pekerjaan di sawah." Dan berpikir outside the box,  kita akan mendapati berbagai solusi jitu lainnya yang bahkan akan menjadikan Farmer bisa lebih banyak menyelesaikan pekerjaannya.

Nah, kembali pada topik. Bagaimana meningkatkan performa verifikasi? Sekali lagi, fokus pada real problem, berpikir outside the box, agar get more work done. Usaha meningkatkan performa sudah terlihat dari munculnya HVL (High Level Language), assertion-based verification, coverage-driven verification, reusable verification environment, Verification IP, dan lain-lain. Teknologi-teknologi tersebut perlu kita pilah-pilah dan adaptasi sebagai wujud usaha meningkatkan performa verifikasi.

Semua effort dan usaha yang dilakukan para praktisi dan profesional verifikasi punya satu muara yang sama sebagaimana Henry Ford kepada Farmer, yaitu pada real problem: (1) menemukan bug secepatnya, (2) Tahu kapan verifikasi selesai, dan (3) get more work done

So, bagaimana performa tim verifikasi mu hari ini? (yayan ;-)

Wednesday, August 4, 2010

Script Konversi Text Linux – Cygwin

Script linux saya tidak mau jalan di cygwin. Solusinya adalah membuat file kosong di cygwin dengan fungsi touch. Selanjutnya dengan menggunakan text editor (crimson, notepad, dsb), isi script linux di copy paste ke file kosong tersebut sebagai scrip baru untuk cygwin.

Begitu juga dengan file-file log yang digenerate dalam cygwin, tidak bisa diolah benar dalam linux. Hal ini karena dos menghasilkan ^M sebagai enter, akibatnya kalau file di cat maka jadi ada spasi tambahan. Agar file DOS bisa diolah dalam linux maka harus dikonversi dulu dengan menggunakan fungsi dos2unix :

[mul@localhost ~] dos2unix gob.log

selanjutnya digunakan sed untuk menghilangkan spasi tambahan:

[mul@localhost ~] sed -i -e :a -e ‘$!N;s/\n//;ta’ gob.log

Nah kalau masih ada ^M yang belum hilang, gunakan cat dan tr :

[mul@localhost ~] cat -A gob.log | tr -d ^M$ > temp.log

[mul@localhost ~] mv temp.log gob.log

Referensi :
http://www.google.co.id/search?hl=id&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&q=bash+script++%22remove+^M%22&btnG=Telusuri&aq=f&aqi=&aql=&oq=&gs_rfai=

Tuesday, August 3, 2010

Hubungan Eb/No dan SNR

Sering dijumpai dalam paper atau sumber tertulis lainnya bentuk performa transmisi data dalam sistem telekomunikasi berdimensi BER vs Eb/No. Lalu ada pula dalam dimensi BER vs SNR. Lalu mana yang benar ?

Dua-dua nya bisa digunakan. Eb/No sering dipakai karena orang ingin melihat sejauh mana performa dari shannon limit. SNR dipakai orang yang hanya ingin melihat power sinyal keseluruhan, tidak memperdulikan seberapa besar energi bit, sejauh mana performanya dari batas shannon limit, apakah menggunakan guard interval atau tidak.

Berikut konversi dari SNR ke Eb/No atau sebaliknya :

\frac{S}{N} = \frac{Eb}{No} \, R \, M \, \frac{1}{J} \, G

\frac{S}{N}[dB] = \frac{Eb}{No}[dB] + 10 log10(R) + 10 log10(M) + 10 log10(\frac{1}{J}) + 10 log10(G)

dimana R adalah bit rate, M adalah jumlah bit untuk setiap simbol konstelasi, J adalah sampling rate dan G adalah guard interval ratio.

Implementasi ROM/RAM pada FPGA dengan Altera Quartus dan MIF File

FPGA merupakan salah satu cara untuk implementasi desain RTL, disamping ASIC. Implementasi FPGA ini sangat dependen terhadap platform dipakai, sehingga vendor mana yang akan dipakai, cara implementasinya akan 'sedikit' berbeda. Yang jelas software shyntesizer-nya pasti berbeda, sehingga scriptnya pun berbeda (=p). Altera dan Xilinx adalah dua vendor FPGA yang paling banyak dipakai saat ini. Untuk kali ini, kita hanya akan bahas implementasi di Altera.

Dalam implementasi di Altera, terkadang perlu menge-map desain memory (ROM/RAM) kedalam library Altera, atau LPM MegaCore. Kelebihan memakai LPM ini adalah kita bisa membuat initialization file sebagai nilai default ROM/RAM tersebut, sehingga, untuk RAM, tidak perlu ditulis terlebih dahulu sudah langsung bisa dibaca isinya. Untuk ROM, initialization file ini merupakan suatu keharusan karena ROM tidak bisa ditulis, hanya bisa dibaca.

Untuk membuat RAM Altera, pakai Quartus MegaWizard. Caranya install dulu program Quartus (Quartus 9.0 student edition bisa didownload dari website Altera, tutorial instralasi quartus ada di halaman download di blog ini), lalu buka Quartus > Tools > MegaWizard. Atau bisa juga dipanggil dari console dengan cara berikut (jangan lupa set path Quartus pada Environment Setting):

% qmegawiz &

Setalah itu muncul MegaWizard GUI yang dengan mudah dapat dipakai untuk generate Altera Memory, baik RAM maupun ROM (tutorial selengkapnya mengenai Altera MegaWizard dapat didownload di halaman Download di blog ini). Ketika generate Altera Memory, baik RAM maupun ROM, kita akan ditanya lokasi initialization file. 


Pada Altera, initialization file ini bisa dibuat degan format Intel Hex atau juga dengan format Altera MIF file. Untuk Altera MIF file, berikut contoh formatnya:

WIDTH = 8;  %isi dengan lebar bit data
DEPTH = 8;  %isi dengan jumlah data yang ada

ADDRESS_RADIX = HEX;  %isi dengan format format address 
DATA_RADIX = HEX;     %isi dengan format data 
                      %pilihan format adalah: BIN,DEC,HEX,OCT
                      
CONTENT BEGIN
        0       :       07;  % isi dengan 
        1       :       06;  % ADDRESS :  VALUE 
        2       :       05;
        3       :       04;
        4       :       03;
        5       :       02;
        6       :       01;
        7       :       00;
END;

Mudah bukan? Kita bisa isi MIF file ini baik dengan format biner, hexa, desimal, maupun oktal. Tinggal sesuaikan setting radixnya. Selamat mencoba! (yayan)

Menyisipkan Persamaan di Halaman Web

Seringkali kita ingin menyisipkan persamaan matematika di halaman web. Karena tidak ada tool yang memadai, kita asal saja menuliskannya dengan teks ASCII biasa. Akibatnya, persamaan menjadi susah dibaca. Misalnya, jika seharusnya suatu persamaan mengandung integral ditampilkan seperti persamaan di bawah ini:
maka kita tidak bisa melakukannya. Bagaimana caranya untuk menuliskan lambang minus tak hingga? Bagaimana pula untuk menuliskan notasi integral? Susah sekali bukan?

Sayangnya, belum ada cara yang praktis dan mudah untuk menyisipkan persamaan seperti di atas. Anda bisa saja mengikuti tips untuk memformat html seperti yang ditunjukkan di sini. Tapi, perlu perjuangan sangat keras untuk sekedar menghasilkan persamaan sederhana seperti di atas.

Cara yang lain adalah dengan menggunakan MathML. Sayangnya, menggunakan MathML tidak mudah. Memang sudah ada editor untuk mempermudah penulisan persamaan, tapi tetap saja tidak semua browser mendukungnya. Chrome dan Safari tidak bisa menampilkan MathML.

Ada cara terakhir yang mungkin sedikit repot, tapi hasilnya bisa ditampilkan di browser apapun. Cara ini memanfaatkan LaTeX. Itu artinya, kita harus memasang LaTeX terlebih dahulu di komputer kita. Dengan demikian, kita juga harus paham notasi LaTeX untuk menuliskan persamaan. Setelah itu, source LaTeX untuk persamaan tersebut diubah ke dalam gambar yang bisa kita sisipkan di halaman web kita. Memang repot jika kita melakukannya secara manual. Namun, untungnya sudah ada script untuk mempermudah proses tersebut. Oh ya, kita juga tetap membutuhkan Python dan dvipng untuk bisa menjalankan script tersebut. Selengkapnya bisa dilihat di sini. Kita juga bisa memakai alternatif yang lain.
Update 8 April 2010:
Sekarang latex sudah dipasang di blog ini, sehingga kita bisa menampilkan persamaan seperti $\sum_{i=1}^nx_i$

Tips & Trick Shell Scripting (1) - Filename, Path, Directory

Dalam scripting terkadang kita membutuhkan informasi nama file, nama folder/directory, atau path ke directory/folder tersebut sehingga kita bisa membuat file log, status, dan lain-lain dengan nama dan path yang sama tapi dengan extension berbeda secara otomatis. Berikut trick-nya:

1. Nama file.
% basename  | cut -d. -f1

2. Nama directory.
% dirname

3. Absolute path directory dan file.
% echo "`pwd``basename `"

Complete script:

#!/bin/bash
# - filename: newname.sh
name=`basename $1`
newname=`basename $1 | cut -d. -f1`
dir=`dirname $1`

echo "Lokasi: $dir`"
echo "Nama file asli: $name"
echo "Lokasi file baru: $newname.NEW"

Simpan script dalam newname.sh, lalu ubah permissionnya menjadi executable.
% chmod +x newname.sh

Jika dijalankan, script tersebut akan menampilkan hasil berikut:
% ./newname.sh newname.sh

Lokasi: ./
Nama file asli: newname.sh
Lokasi file baru: newname.NEW

Mudah bukan? (yayan ;-)




QUIZ:

Kira-kira apa output yang keluar jika script di-run dengan cara berikut?
% ./newname.sh ../script/newname.sh