Monday, October 10, 2011

Menghitung SNR dengan Matlab / Octave

SNR- Signal to Noise Ration adalah ukuran untuk membandingkan suatu sinyal dengan noise-nya. SNR didefinisikan sebagai perbandingan power signal dengan power noisenya. Gampangannya, kalau power sinyal yang kita inginkan lebih kecil daripada noisenya, maka  hasil kita jelek (hasil apapun, entah dalam speech enhacement, source separation, image processing atau yang lain). Sehingga, semakin besar nilai SNR tentunya semakin baik kualitas desired signal kita.
Sesuai formulanya, SNR dirumuskan sebagai berikut;
SNR=PsignalPnoise
dimana P merupakan power rata-rata baik dari sinyal maupun noise yang diukur pada t yang sama dan dalam bandwith yang sama. Jika sinyal dan noise memiliki impedansi yang sama, maka SNR dapat dihitung dari kuadrat Amplitudo kedua sinyal dan noise tersebut. Agar mempunyai impedansi yang sama, pada praktek penghitungan SNR dengan matlab/Octave nilai SNR dinormalisasi dengan perintah norm
.
dimana A merupakan root mean square (rms) dari amplitudo sinyal. Karena banyak sinyal memiliki dynamic range, maka SNR dapat dinyatakan dalam decibel (dB) sebagai berikut:

yang mana persamaan di atas ekuivalen dengan persamaan sebelumnya sehingga SNR dalam dB dapat dituliskan dalam persamaan akhir berikut.
Nah, bagaimana listing code-nya dalam Matlab/Octave? Silakan pelajari m-file berikut yang saya rangkum dari link sebelah. Setiap persamaan diatas diakomodir oleh kode dibawah, misalnya baris 24-25 untuk persamaan pertama.

  1. % SNR demo
  2. Fs=2000;                        % Sampling Frequency
  3. Fc=10;                          % Carrier Frequency
  4. t=0:1/Fs:1;                     % define evaluation time
  5. signal=sin(2*pi*Fc*t);          % Sample signal waveform
  6. SNR=5;                          % SNR 5 dB will be added to signal
  7.  
  8. % Generate Gaussian Noise with zero mean and unit variance
  9. noise=randn(1,length(signal));
  10.  
  11. %Scale the input signal accordingly for the given SNR.
  12. scaledSignal = std(noise)/std(signal)*(sqrt(10^(SNR/10)))*signal;
  13.  
  14. %calculate Signal power and noise power
  15. signalPower = (norm(scaledSignal)^2)/length(scaledSignal);
  16. noisePower = (norm(noise)^2)/length(noise);
  17.  
  18. %Alternative way of calculating Signal and noise power from their variance
  19. %signalPower = var(scaledSignal);
  20. %noisePower = var(noise);
  21.  
  22. % Calculate Signal to noise ratio for the scaledSignal and generated Noise
  23. SNRratio = signalPower/noisePower;
  24. measuredSNR=10*log10(SNRratio);
  25.  
  26. % Add the scaled signal with the generated noise
  27. signalWithNoise=scaledSignal+noise;
  28.  
  29. % plotting commands
  30. Fs=2000;                      %Sampling Frequency
  31. Fc=10;                         % Carrier Frequency
  32. t=0:1/Fs:1;                    % define evaluation time
  33. signal=sin(2*pi*Fc*t);   % Sample signal waveform
  34.  
  35. % Generate Scaled signal, noise for SNR = 5dB
  36. % Also works well for negative SNR
  37. subplot(3,1,1);
  38. plot(scaledSignal);
  39. title('Input Signal');
  40.  
  41. subplot(3,1,2);
  42. plot(noise);
  43. title('Generated Noise');
  44.  
  45. subplot(3,1,3);
  46. plot(signalWithNoise);
  47. title(['Signal + Noise for SNR= ',num2str(measuredSNR),' dB']);
Bila anda sukses anda akan mendapatkan hasil plot seperti dibawah. Untuk mengecek benar tidaknya program yang kita buat dapat dengan melihat SNR (measuredSNR) dimana seharusnya mendekati 5 dB karena di awal program telah ditentukan bahwa noise yang ditambakan ke sinyal sebesar 5 dB. Hasil yang ditunjukkan program tidak eksak sebesar 5 dB (sekitat 4,9xx atau 4,8xx dB) karena random noise yang berubah secara random pula... :-)
Selamat Mencoba...

Plot dari Sinyal, Noise dan Sinyal+Noise


Related Posts Plugin for WordPress, Blogger...