Menggunakan ICA dan FFT pada C++ dgn Library ITPP ver.4.0.7

Posted: March 18, 2013 by Iman Rahmansyah Tayibnapis in C++
Tags:

1. ICA (Independent Component Analysis)

ICA  adalah metode baru yang dikembangkan dengan tujuannya adalah untuk menemukan representasi linear dari data nongaussian sehingga komponen secara statistik menjadi independen, atau seindpenden mungkin.

Persamaan yang digunakan pada ICA pada umumnya sebagai berikut

xj = aj1s1 + aj2s2 + … + ajnsn, untuk semua j…….(1)

dengan x sebagai suatu sinyal campuran, a sebagai koefisien campuran sinyal, dan snsebagai sinyal sumber atau independen. Secara ringkas persamaan tersebut dapat ditulis seperti pada persamaan (2)

x = As…………………………………(2)

Dengan A sebagai suatu matriks yang dibentuk oleh koefisien campuran sinyal a dari persamaan. Untuk mendapatkan signal independen maka bisa dilakukan dengan menggunakan persamaan (3)

s = Wx……………………………..(3)

dengan W merupakan matriks invers dari matriks A pada persamaan (2)

untuk Contoh penerapan sederhana ICA pada C++ dgn ITPP versi 4.0.7 :

mat mix_signal;
....
....
...
Fast_ICA ica_signal(mix_signal);
ica_signal.set_nrof_independent_components(mix_signal.rows());
ica_signal.set_approach(FICA_APPROACH_DEFL);
ica_signal.set_non_linearity(FICA_NONLIN_GAUSS);
ica_signal.separate();

mat independent_signal = ica_signal.get_independent_components();

vec first_component = independent_signal.get_row(0);
vec second_component = independent_signal.get_row(1);
vec third_component = independent_signal.get_row(2);
....
....
....

2. FFT (Fast Fourier Transform)

FFT adalah adalah suatu algoritma untuk menghitung transformasi Fourier diskrit. Secara umum Transformasi Fourier Diskrit itu sendiri adalah salah satu macam transformasi Fourier yang digunakan dalam analisis Fourier. Dengan Transformasi Fourier Diskrit, suatu fungsi diubah ke dalam domain frekuensi.

Misalkan ”x0, …., xN-1 merupakan bilangan kompleks. Transformasi Fourier Diskret didefinisikan oleh rumus:

rumus FFT

untuk Contoh penerapan sederhana ICA pada C++ dgn ITPP versi 4.0.7 :

 

int getnfft(int data_length){
	int i=1;
	while(true){
		if(pow2i(i)>=data_length) break;
		i++;
	}
	return i;
}
vec signal;
...
...
...
int NumUniquePts = ceil_i((nfft+1)/2); //Calculate the numberof unique points

 //Use next highest power of 2 greater than or equal to length(x) to calculate FFT.
int nfft = pow2i(getnfft(second_compo.length()));

//Take fft, padding with zeros so that length(fftx) is equal to nfft
cvec fftx1 = fft(to_cvec(signal),nfft);

//FFT is symmetric, throw away second half 
cvec FFT1 = fftx1.left(NumUniquePts); 
...

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s