Assalamu'alaikum Wr. Wb. pada kesempatan ini saya akan berbagi cara membuat program noise cancellation dengan menggunakan algoritma LMS (Least Mean Squared) pada MATLAB.
Pada program noise cancellation ini hanya akan meredam noise yang ada dari suara yang sudah direkam yang bercampur dengan suara-suara lain di sekitarnya yang tidak diinginkan jadi tidak untuk real time noise cancellation dikarenakan simulasi ini hanya digunakan pada laptop yang menggunakan satu mikrofon saja. Sehingga suara yang diinputkan menjadi harus bergantian. Suara yang sudah difilter dengan algoritma LMS ini akan menjadi lebih jernih dari suara yang masih bercampur dengan noise-nya. Cara menggunakannya yaitu dengan merekam terlebih dahulu suara yang bercampur dengan noise, kemudian direkam kembali hanya suara noise-nya saja. Noise cancellation ini banyak digunakan pada ponsel (ponsel yang sudah memiliki dedicated mic noise cancellation, biasanya terdapat lubang mic kecil di bagian atas ponsel/hp) untuk menghilangkan suara dari luar saat kita sedang melakukan panggilan suara.
N-tap Filter Adaptive Tranversal |
Langsung saja kita eksekusi langkah-langkahnya sebagai berikut :
- Langkah pertama buka program MATLAB dan klik ikon "New M-File" seperti pada gambar di bawah. Langkah ini dilakukan untuk membuat dan menyimpan program "Perekam_Suara.m" pada MATLAB.
- Mengetik program berikut pada jendela "Editor" MATLAB.
- %Program perekam suara dan menyimpannya dalam bentuk file.wav
- function [suara_normal,a] = Perekam_Suara(sampel_frekuensi)
- pilihan = 'n';
- pilih_merekam = 'n';
- waktu_rekaman = 5; %waktu perekaman (lamanya merekam) dalam detik
- sampel_frekuensi = 8192; %frekuensi sampling dalam Hertz (8KHz)
- sampling_waktu = sampel_frekuensi* waktu_rekaman;
- 'Aplikasi Perekam Suara dengan MATLAB';
- nama_file = input('Ketik nama file hasil rekaman yang akan disimpan: ','s');
- nama_file_wav = sprintf('%s.wav',nama_file);
- pilih_merekam = input('tekan y untuk mulai merekam: ','s');
- if pilih_merekam=='y'
- while pilihan=='n',
- input('Tekan Enter untuk mulai merekam --> ');
- rekaman = wavrecord(sampling_waktu, sampel_frekuensi); %merekam suara dari sound card dengan sampling rate yang sudah ditentukan
- input('Tekan Enter untuk mendengar hasil rekamannya --> ');
- sound(rekaman, sampel_frekuensi);
- pilihan = input('tekan y untuk menyimpan atau n untuk merekam kembali: ','s');
- end
- wavwrite(rekaman, sampel_frekuensi, nama_file_wav); %menyimpan data yang telah direkam dalam format ".wav"
- end
- Simpan program tersebut dengan menekan ikon "Save" atau menekan tombol Ctrl+S pada keyboard.
- Pilih direktori/tempat file sesuai keinginan, dan simpan dengan nama yang sama persis pada program.
- Klik tombol Run untuk menjalankan program noise cancellation yang sudah disimpan sebelumnya.
- Setelah dijalankan dan disimpan nama file .wav-nya maka akan tersimpad di direktori default MATLAB. kalo di laptop saya letaknya di C:\Users\Vidi Fitriansyah H\Documents\MATLAB.
- Selanjutnya memasukkan sintaks berikut pada "Command Window". Program di bawah ini merupakan program Noise Cancellation dengan algoritma LMS. Dalam program ini menggunakan filter 5-tap (delay sebanyak 5) yaitu Bobot.0 sampai Bobot.4 dengan panjang filter n sebanyak 40960. Semakin banyak n-tap-nya semakin jernih dan lebih mendekati suara asli yang dihasilkan, namun membutuhkan sumber daya (memori) yang banyak juga.
- %Program menentukan output sinyal asli berdasarkan pemfilteran antara sinyal noise dan sinyal asli+noise
- disp('Program LMS Noise Cancelation')
- disp(' ')
- disp('Parameter :')
- mu=1;%nilai mu dipilih 1 (bebas)
- Bobot0=0.1;%nilai inisialisasi w0 (masukkan bebas antara 0,1-0,9)
- Bobot1=0.2;%nilai inisialisasi w1 (masukkan bebas antara 0,1-0,9)
- Bobot2=0.3;%nilai inisialisasi w2 (masukkan bebas antara 0,1-0,9)
- Bobot3=0.4;%nilai inisialisasi w3 (masukkan bebas antara 0,1-0,9)
- Bobot4=0.6;%nilai inisialisasi w4 (masukkan bebas antara 0,1-0,9)
- n=40960;%panjang filter (sesuai nilai sampling suara)
- sn=wavread('Suara_Masuk.wav');%suara asli+noise/campuran
- noise=wavread('Suara_Noise.wav');%hanya suara noise
- disp('Input : Sound 1')
- disp('Desired Output : d(n)= Sound 2')
- disp('Output Adaptif : y1(n)=w0*x(n)+w1*x(n-1)w2*x(n-2)+w3*x(n-3)+w4*x(n-4)')
- disp('Update Nilai : w(n+1)=w(n)+2*mu*e(n)*x(n)') %algoritma LMS
- x=(noise');
- y1=[zeros(1,n)];%membuat matriks kosong dengan banyak baris 0 dan kolom n yang digunakan sebagai tempat hasil matriks y1
- w0=[zeros(1,n)];%membuat matriks kosong dengan banyak baris 0 dan kolom n yang digunakan sebagai tempat hasil matriks w0 (bobot 1)
- w1=[zeros(1,n)];%membuat matriks kosong dengan banyak baris 0 dan kolom n yang digunakan sebagai tempat hasil matriks w1 (bobot 2)
- w2=[zeros(1,n)];%membuat matriks kosong dengan banyak baris 0 dan kolom n yang digunakan sebagai tempat hasil matriks w2 (bobot 3)
- w3=[zeros(1,n)];%membuat matriks kosong dengan banyak baris 0 dan kolom n yang digunakan sebagai tempat hasil matriks w3 (bobot 4)
- w4=[zeros(1,n)];%membuat matriks kosong dengan banyak baris 0 dan kolom n yang digunakan sebagai tempat hasil matriks w4 (bobot 5)
- w0(1)=Bobot0;%nilai inisialisasi untuk w0
- w1(1)=Bobot1;%nilai inisialisasi untuk w1
- w2(1)=Bobot2;%nilai inisialisasi untuk w2
- w3(1)=Bobot3;%nilai inisialisasi untuk w3
- w4(1)=Bobot4;%nilai inisialisasi untuk w4
- for i=1:n-4 %nilai untuk elemen array i dari 1 sampai dengan n-4 karena nilai n=0 sampai n=4 sudah diisi oleh w0 sampai w1
- d=(sn');
- y1(i+4)=w0(i+4)*x(i+4)+w1(i+4)*x(i+3)+w2(i+4)*x(i+2)+w3(i+4)*x(i+1)+w4(i+4)*x(i);%output adaptif
- e(i+4)=d(i+4)-y1(i+4);%nilai error=nilai suara bersih
- w0(i+5)=w0(i+4)+2*mu*e(i+4)*x(i+4);%rumus algoritma LMS tap 1
- w1(i+5)=w1(i+4)+2*mu*e(i+4)*x(i+3);%rumus algoritma LMS tap 2
- w2(i+5)=w1(i+4)+2*mu*e(i+4)*x(i+2);%rumus algoritma LMS tap 3
- w3(i+5)=w1(i+4)+2*mu*e(i+4)*x(i+1);%rumus algoritma LMS tap 4
- w4(i+5)=w1(i+4)+2*mu*e(i+4)*x(i);%rumus algoritma LMS tap 5
- end
- %disp('s+n noise w0 w1 w2 w3 w4 s+n-noise y1')
- %disp('================================================================================')
- %fprintf(' %1.d %.2f %.5f %.5f %.5f %.5f %.5f %.5f %.5f\n',x,d,w0,w1,w2,w3,w4,e,y1)
- figure;
- subplot(3,3,1); plot(1:n,x),grid;xlabel('noise');ylabel('n'); %gambar sinyal noise
- subplot(3,3,2); plot(1:n,d),grid;xlabel('s+n'); ylabel('n'); %gambar sinyal s+n
- subplot(3,3,3); plot(1:n+1,w0),grid;xlabel('w0'); ylabel('n'); %gambar sinyal bobot 1
- subplot(3,3,4); plot(1:n+1,w1),grid;xlabel('w1'); ylabel('n'); %gambar sinyal bobot 2
- subplot(3,3,5); plot(1:n+1,w2),grid;xlabel('w2'); ylabel('n'); %gambar sinyal bobot 3
- subplot(3,3,6); plot(1:n+1,w3),grid;xlabel('w3'); ylabel('n'); %gambar sinyal bobot 4
- subplot(3,3,7); plot(1:n+1,w4),grid;xlabel('w4'); ylabel('n'); %gambar sinyal bobot 5
- subplot(3,3,8); plot(1:n,e),grid;xlabel('s+n-noise'); ylabel('n'); %gambar sinyal suara terfilter
- subplot(3,3,9); plot(1:n,y1),grid;xlabel('y1'); ylabel('n'); %gambar sinyal learning value
- fprintf('\n\nNilai w0 yang didapat adalah : %.5f\n',w0(i)) %nilai w0 akhir (sebenarnya)
- fprintf('Nilai w1 yang didapat adalah : %.5f\n',w1(i)) %nilai w1 akhir (sebenarnya)
- fprintf('Nilai w2 yang didapat adalah : %.5f\n',w2(i)) %nilai w2 akhir (sebenarnya)
- fprintf('Nilai w3 yang didapat adalah : %.5f\n',w3(i)) %nilai w3 akhir (sebenarnya)
- fprintf('Nilai w4 yang didapat adalah : %.5f\n',w4(i)) %nilai w4 akhir (sebenarnya)
- Untuk nama file suara sn dan noise disesuaikan dengan file audio yang sudah direkam sebelumnya.
- Setelah itu didapatkan nilai hasil masing-masing bobot yang sebenarnya pada screenshot di bawah.
- Dapat dilihat juga grafik sinyalnya pada jendela "Figure 1" di MATLAB.
- Karena perbedaan hasil sinyal suara+noise dan suara yang sudah difilter sangat sedikit maka untuk mengetahui perbedaan hasilnya sinyal-sinyal tersebut dari ranah waktu ditransformasikan ke ranah frekuensi dengan menggunakan fungsi fft (fast fourier transform) yang sudah ada pada MATLAB. Agar dapat diubah ke ranah frekuensi maka dilanjutkan memasukkan program FFT-nya.
- A = fft(d);
- B = fft(e);
- C = fft(x);
- figure;
- N = length(e);
- T = 1/N;
- mag = abs(A);
- freq = (0:(N/2)-1)/(N*T);
- subplot(2,2,1),plot(freq,mag(1:N/2)),grid;
- xlabel('frekuensi');
- ylabel('magnitude');
- title('s+n');
- mag = abs(B);
- freq = (0:(N/2)-1)/(N*T);
- subplot(2,2,2),plot(freq,mag(1:N/2)),grid;
- xlabel('frekuensi');
- ylabel('magnitude');
- title('s+n-noise');
- mag = abs(C);
- freq = (0:(N/2)-1)/(N*T);
- subplot(2,2,3),plot(freq,mag(1:N/2)),grid;
- xlabel('frekuensi');
- ylabel('magnitude');
- title('Noise');
- sound(e);
- Maka hasil dari sinyal suara+noise, suara+noise-noise dan noise-nya seperti berikut.
Dari sinyal tersebut terlihat sekilas bahwa suara+noise dan suara yang telah difilter (s+n-n) sama hal itu dikarenakan sinyal noise-nya yang diberikan sangat kecil. Namun jika diperbesar tampilannya maka akan terlihat perbedaan antara keduanya.
Sekian & terima kasih atas kunjungannya...Semoga bermanfaat ;)
Tidak ada komentar:
Posting Komentar