Categories
DSP

MATLAB: Akuisisi Data melalui Kartu Suara

Biasanya, ada 4 (empat) proses yang harus dilakukan dalam akusisi data melalui Kartu suara (soundcard) menggunakan MATLAB:

  1. Inisialisasi, membuat objek device;
  2. Konfigurasi, menambahkan kanal serta mengatur cara akuisisi;
  3. Eksekusi, memulai (mengaktifkan) objek device dan akuisisi atau mengirim data;
  4. Terminasi, menghapus objekdevice.

Untukmemverifikasi frekuensi dasar sebuah garputala adalah 440Hz, sebuah nada akan diakuisisi dan analisis menggunakan MATLAB. Ini adalah contoh proses yang akan dijelaskan berikut ini.

Dalam contoh ini, kita akan memverifikasi frekuensi dasar (fundamental) sebuah garputala adalah 440Hz. Untuk melakukan hal ini, akan kita gunakan sebuah mikrofon dan sebuah kartu suara untuk memperolah data-data suara. Berikutnya, akan dilakukan proses FFT dari data yang diperoleh untuk menemukan komponen frekuensi sebuah garputala.

akuisisi data suara menggunakan kartu suara

Kita awala dengan mengambil data suara selama 2 detik melalui kanal di kartu suara. Karena garputala bergetar dengan frekuensi nominal 440Hz, frekuensi pencuplikan kartu suara bisa diatur paling rendah yaitu 8000Hz.

Setelah kita getarkan garputala dan kita letakkan dengan dengan mikrofon, akan kita lakukan akusisi data. Berikut penjelasan dari masing-masing langkah yang telah disebutkan sebelumnya…

Categories
DSP

Tapis FIR: Efek Order Tapis vs. Penempatan Pole/Zero

Eksperimen sederhana berikut ini menggukanan Matlab 7.0 yang dilengkapi dengan Signal Processing Toolbox dan menggunakan ‘fdatool‘, sebuah alat untuk analisis dan merancang tapis (the Filter Design and Analysis Tool), gunakan program ini untuk:

  • Merancang Tapis
  • Kuantisasi Tapis
  • Analisis Tapis
  • Memodifikasi rancangan tapis
  • Merealisasikan model Simulink untuk Tapis FIR, bentuk langsung, terkuantisasi (quantized, direct form, FIR filters), atau
  • Melakukan transformasi frekuensi digital pada suatu tapis

Jika Anda memberikan perintah ‘fdatool‘ pada Matlab, maka akan ditampilkan jendela dialog sebagai berikut…

Okey, mari kita belajar menggunakan ‘fdatool‘ sekaligus melakukan eksperimen sederhana untuk melihat efek perubahan orde tapis tanpa dan dengan menggunakan jendela versus penempatan pole-zero.

Kita lakukan pengaturan rancangan pada ‘fdatool‘ sebagai berikut:

  • Response Type: Lowpass
  • Design Method: FIR – window
  • Filter Order: 1
  • Options: Window – Rectangular
  • Fs : 10000Hz, Fc : 4000Hz

Hasil pertama sebagai berikut:

&

Kemudian parameter Filter Order kita ubah menjadi 2, 4, 6 dan 10, hasilnya berturut-turut…

&

&

&

&

Bagaimana kesimpulan Anda? silahkan tuangkan pada bagian komentar di artikel ini, silahkan…

Next, kita akan coba eksperimen menggunakan jendela yang dipakai pada Tapis dan efeknya terhadap response dan pole-zero dengan merubah orde tapis seperti sebelumnya. Kita awali dengan orde tapis sebesar 1, hasilnya:

&

Selanjutnya untuk orde tapis: 2, 4, 6 dan 10, hasilnya sebagai berikut (berturut-turut)…

&

&

&

&

Bagaimana kesimpulan Anda dengan efek penggunaan jendela ini? silahkan tuangkan pada bagian komentar di artikel ini, silahkan…

Categories
DSP

Nyquist – Efek Aliasing

Jika Anda belum tahu tentang Teorem Nyquist, coba baca artikel saya disini. Okey, sekarang saya akan coba menunjukkan kepada Anda mengenai Efek Aliasing (yang nanti akan lihat bahwa frekuensi alias = frekuensi pencuplikan – frekuensi sinyal), yaitu suatu efek yang akan terjadi jika kita melakukan pencuplikan dengan frekuensi pencuplikan dibawah dari ketentuan Nyquist. Okey let’s get started…

Pertama kita gunakan frekuensi pencuplikan sebesar 20 Hz dan rentang waktu selama 1 detik…

fs=20;
t=0:1/fs:1;

Kita awali dengan frekuensi 1Hz, kemudian dilanjutkan dengan frekuensi 2Hz, 5Hz, 10Hz (pas setengah frekuensi pencuplikan), 15Hz, 18Hz dan 19Hz…

f1=1;
x1=sin(2*pi*f1*t);
f2=2;
x2=sin(2*pi*f2*t);
f3=5;
x3=sin(2*pi*f3*t);
f4=10;
x4=sin(2*pi*f4*t);
f5=15;
x5=sin(2*pi*f5*t);
f6=18;
x6=sin(2*pi*f6*t);
f7=19;
x7=sin(2*pi*f7*t);

Kemudian kita gambarkan semua hasil dalam satu plot agar kita bisa membandingkan 7 frekuensi tersebut (dengan frekuensi pencuplikan yang sama, 20Hz)…

plot(t,x1,’-o’,t,x2,’-o’,t,x3,’-o’,t,x4,’-o’,t,x5,’-o’,t,x6,’-o’,t,x7,’-o’);
legend(‘1hz’,’2hz’,’5hz’,’10hz’,’15hz’,’18hz’,’19hz’);
title(‘Teorema Nyquist – Efek Aliasing (Fs=20Hz)’);

Hasilnya ditunjukkan pada gambar berikut…

Nach menarik sekali hasilnya, Anda perhatikan bahwa untuk frekuensi 10Hz hasilnya berupa garis lurus (masih ingat dengan artikel saya Teorema Nyquist – Pengenalan?), jelas karena frekuensi pencuplikan = 2 kali frekuensi 10Hz. Bagaimana dengan frekuensi 1Hz, 2Hz dan 5Hz? Nothing’s wrong khan, baik2 aja khan?

Mmmm… bagaimana dengan frekuensi 15Hz, 18Hz dan 19Hz? Nah gambarnya memang terbalik dari frekuensi, masing-masing, 5Hz, 2Hz dan 1Hz tetapi frekuensi-nya khan sama, iya khan? Ini dia yang dinamakan Efek Aliasing. Misalnya untuk 15Hz menghasilkan…

frekuensi aliasing = frekuensi pencuplikan – frekuensi 15Hz = 20Hz – 15Hz =5Hz

Jadi frekuensi 15Hz, dengan Fs=20Hz, merupakan kembaran (alias) dari 5Hz. Demikian seterusnya untuk contoh-contoh frekuensi aliasing lainnya (18Hz dan 19Hz yang masing-masing menghasilkan 2Hz dan 1Hz).

Jika ada pertanyaan atau komentar silahkan saja… Have a nice day…! Terima kasih, semoga bermanfaat…

Categories
DSP

Nyquist – Apaan tuch?

Dalam dunia Pemrosesan Sinyal Digital, ada suatu proses untuk mendapatkan data digital melalui proses pencuplikan, artinya sinyal analog dicuplik (diambil) secara diskrit dengan periode Ts atau frekuensi cuplik Fs. Nah agar tidak terjadi kesalahan (yang kemudian diberi nama aliasing), pak Nyquist memberikan aturan bahwa frekuensi cuplik minimal harus 2 (dua) kali lipat frekuensi maksimum yang dikandung sinyal yang bersangkutan.

Untuk memahami hal tersebut, mari kita persiapkan dulu sinyal sinusoidal dengan frekuensi 2 Hz. Kita gunakan frekuensi cuplik 1000 Hz atau periode 0.001 detik (supaya gambarnya jauh lebih ‘mulus’ dibandingkan dengan eksperimen-eksperimen yang akan kita lakukan)…

>>t=0:0.001:1;
>>f=2;
>>y=sin(2*pi*f*t);

Okey, Anda siap? Konsenterasi… kita awali dengan menyiapkan gambar (perintah figure), kemudian diteruskan dengan menyiapkan variabel waktu t1 dengan frekuensi sampling = frekuensi sinyal (atau periodenya 1/f detik), kita hitung y1-nya kemudian kita gambarkan sinyal asli y dan sinyal hasil pencuplikan y1, menggunakan perintah-perintah berikut…

>>figure;
>>t1=0:1/f:1;
>>y1=sin(2*pi*f*t1);
>>plot(t,y,t1,y1,’-o’);
>>title(sprintf(‘frekuensi sampling = frekuensi sinyal, jumlah data %d’,length(y1)));

Hasilnya (yang asli warna biru, yang cuplikan warna hijau)…

Hmmm… apaan tuch (perhatikan garis hijau), kok cuman garis lurus, berarti salah nich… Ya jelas lha wong frekuensi pencuplikan = frekuensi sinyal, harusnya khan 2 kali lipat, coba kita ubah lagi… (gunakan 1/(2*f))

>>figure;
>>t1=0:1/(2*f):1;
>>y1=sin(2*pi*f*t2);
>>plot(t,y,t1,y1,’-o’);
>>title(sprintf(‘frekuensi sampling = 2 x frekuensi sinyal, jumlah data %d’,length(y1)));

Hasilnya…

Oalah…. sami mawon, podho wae, sama saja… ya garis lurus lagi (walaupn jumlah datanya bertambah, perhatikan lingkaran-lingkaran hijau, bandingkan dengan gambar sebelumnya)! Loch khan pak Nyquist sudah bilang kalo itu 2 kali lipat adalah minimal, ya mestinya pake yang lebih tinggi lagi, coba sekarang pake 2,5 kali lipat…

>>figure;
>>t1=0:1/(2.5*f):1;
>>y1=sin(2*pi*f*t1);
>>plot(t,y,t1,y1,’-o’);
>>title(sprintf(‘frekuensi sampling = 2,5 x frekuensi sinyal, jumlah data %d’,length(y1)));

Hasilnya…

Wah ini agak lumayan (maksudnya dibandingkan hasil-hasil sebelumnya), bukan garis lurus, tapi… belum berbentuk sinusoidal ya…?? Okey kita coba jadi 3 kali lipat…

>>figure;
>>t1=0:1/(3*f):1;
>>y1=sin(2*pi*f*t1);
>>plot(t,y,t1,y1,’-o’);
>>title(sprintf(‘frekuensi sampling = 3 x frekuensi sinyal, jumlah data %d’,length(y1)));

Hasilnya…

Kemudian 4 kali lipat…

>>figure;
>>t1=0:1/(4*f):1;
>>y1=sin(2*pi*f*t1);
>>plot(t,y,t1,y1,’-o’);
>>title(sprintf(‘frekuensi sampling = 4 x frekuensi sinyal, jumlah data %d’,length(y1)));

Hasilnya…

Kemudian 10 kali lipat…

>>figure;
>>t1=0:1/(10*f):1;
>>y1=sin(2*pi*f*t1);
>>plot(t,y,t1,y1,’-o’);
>>title(sprintf(‘frekuensi sampling = 10 x frekuensi sinyal, jumlah data %d’,length(y1)));

Hasilnya…

Kemudian (terakhir, jangan kebanyaken) 20 kali lipat…

>>figure;
>>t1=0:1/(20*f):1;
>>y1=sin(2*pi*f*t1);
>>plot(t,y,t1,y1,’-o’);
>>title(sprintf(‘frekuensi sampling = 20 x frekuensi sinyal, jumlah data %d’,length(y1)));

Hasilnya…

Bagaimana? Semakin mendekati sinusoidal aslinya too…?? Cuman jumlah data-nya juga semakin banyak, iya khan? Terus silahkan disimpulkan sendiri, okey? Atau kalo masih penasaran silahkan Anda coba 30, 40, 70 atau bahkan 100 kali lipat… silahkan jika mau…

Silahkan berikan komentar atau pertanyaan Anda…

NB: Sinyal asli sebenarnya menggunakan frekuensi cuplik sebesar 500 kali dari frekuensi 2 Hz (=1000 Hz), jadi wajar saja jika gambarnya halus (banget).

Categories
DSP

Bagaimana membuat & menggambar sinusoidal di Matlab?

Baiklah, mari kita mulai dengan menggambar atau membuat sinyal sinusoidal dengan frekuensi 1 Hz selama 1 detik, pertama kita siapkan variabel t-nya:

>> t=0:1;

Kemudian variabel f atau frekuensi-nya:

>> f=1;

Langkah berikutnya adalah menghitung sinusoidalnya, ingat omega = 2 * pi * f, sehingga perintahnya… sekalian kita gambar dengan perintah plot antara variabel t dan y…

>> y=sin(2*pi*f*t);
>> plot(t,y);

nah ini hasilnya…

Eee…. kok malah cuman garis lurus ya??? apanya yang salah nich….?? Ya jelas ada yang salah tho, lha wong data untuk variabel waktu (t) cuman angka 0 dan 1 kok, jadinya y hanya menghitung di 2 titik itu…

Baiklah sekarang akan dicoba kita tambahi data t-nya dengan langkah 0.5 (setengah), jadinya cuman 3 (tiga) titik loch…

>> t=0:0.5:1;
>> y=sin(2*pi*f*t);
>> plot(t,y);

Dan ini hasilnya… (jangan kaget, karena hanya 3 titik)…

Okey sekarang kita ubah lagi jarak datanya menjadi 1/10 (sepersepuluh)…

>> t=0:0.1:1;
>> y=sin(2*pi*f*t);
>> plot(t,y);

Hasilnya seperti ini…

Hmmmm… kurang sip? Okey kita buat jarak antar data 1/100 (seperseratus)…

>> t=0:0.01:1;
>> y=sin(2*pi*f*t);
>> plot(t,y);

Hasilnya…

Wow! sudah bagus tuch… Coba sekarang Anda perhatikan langkah-langkah yang telah kita lalui bersama, hasil terakhir menghasilkan jumlah data terbesar, artinya semakin kecil jarak antar data, untuk satu periode waktu yang sama, menghasilkan jumlah data yang makin besar, keuntungannya, gambar menjadi lebih halus dan alami… Ini konsekuensinya…

Baiklah, sekarang bagaimana kalo frekuensi kita ubah menjadi 2 Hz… (masih menggunakan t sebelumnya)

>> f=2;
>> y=sin(2*pi*f*t);
>> plot(t,y);

Hasilnya… (terlihat ada 2 gelombang dalam 1 detik = 2 Hz atau 2 cycle/sec)…

Sekarang kita pakai frekuensi 10 Hz…

>> f=10;
>> y=sin(2*pi*f*t);
>> plot(t,y);

hasilnya… (hitung jumlah gelombangnya…)

Lumayan… walaupun agak ‘kaku’ tampilannya, kalo frekuensi 10 Hz, menurut Nyquist, sebaiknya minimal gunakan frekuensi pencuplikan 2 kali lipat atau minmal 20 Hz (akan kita bahas dalam posting saya lainnya) atau periodenya 1/20 atau 0.05 detik, sedangkan yang kuta gunakan jarak antar data adalah 0.01 atau 1/100 detik, hasilnya bisa Anda lihat sendiri seperti diatas…

Kalo kemudian jarak antar data kita kecilkan, yaitu 0.001 detik, maka…

>> t=0:0.001:1;
>> y=sin(2*pi*f*t);
>> plot(t,y);

Hasilnya…

Kesimpulan-nya:

  • Perhatikan parameter penting dalam sinusoidal yaitu frekuensi-nya berapa? Gunakan persamaan omega = 2 * pi * frekuensi * waktu.
  • Gunakan jarak antar data minimal 1/2 dari periode (Nyquist Theorem?).
  • Semakin kecil jarak antar data, dengan periode waktu yang sama, semakin besar jumlah datanya…

Ada komentar atau pertanyaan monggo dan silahkan…