Monday 6 April 2015

DELPHI7 :: Pengolahan Sinyal Digital menggunakan komponen dsp FFT di delphi 7



Pengenalan :

Proses pengolahan sinyal digital dilakukan setelah proses pembacaan file wav dan proses pengolahan sebelumnya untuk mendapatkan data yang benar-benar bebas dari noise yang mencerminkan data aktual karakteristik dari suara seseorang tersebut. Tujuan dari pengolahan sinyal digital adalah untuk mencapai feature extraction, sebuah proses yang mengkonversi sinyal suara menjadi beberapa parameter yang dapat diambil untuk proses selanjutnya yaitu identifikasi pola suara. Feature extraction merupakan proses mengekstraksi data hasil akuisisi sehingga dihasilkan data yang berdimensi lebih kecil, yang nantinya digunakan untuk merepresentasikan tiap-tiap pembicara.
Pengolahan sinyal digital ini berbasis fast fourier dan memiliki beberapa proses untuk mencapai feature extraction. Feature extraction yang paling cepat untuk diproses dan didapatkan adalah nilai magnitude dalam domain frekuensi. Hal ini dikarenakan frekuensi manusia yang dapat didengar memiliki batasan tertentu antara 0-20000Hz sehingga rentang yang dimiliki menjadi tetap atau konstan. Untuk itu nilai magnitude dalam domain frekuensi sangat memungkinkan dilakukan pada proses selanjutnya daripada nilai amplitudo dalam domain waktu yang setiap pencuplikan sampel selalu tak konsisten. Proses-proses tersebut yaitu :
  1. Frame Blocking
  2. Panjang frame yang biasanya digunakan untuk pemrosesan sinyal antara 10-30 ms atau 256-1024 data. Panjang frame yang digunakan sangat mempengaruhi keberhasilan dalam analisa spectral. Di satu sisi ukuran dalam frame harus sepanjang mungkin untuk dapat menunjukkan resolusi frekuensi yang baik. Akan tetapi, di lain sisi ukuran frame juga harus cukup pendek untuk dapat menunjukkan resolusi waktu yang baik.
    Proses Frame Blocking yaitu melakukan blok terhadap sinyal-sinyal menjadi frame-frame N sampel, dengan frame-frame berdekatan dengan spasi M (M < N). Frame pertama terdiri dari N sampel pertama. Frame kedua dengan M sampel setelah frame pertama, dan overlap dengan N–M sampel. Dengan cara yang sama, frame ketiga dimulai 2M sampel setelah frame pertama (atau M sampel setelah frame kedua) dan overlap dengan N– 2M sampel. Proses ini berlanjut hingga semua sinyal suara dihitung dalam satu atau banyak frame. Nilai untuk N dan M adalah N = 256 dan M =100. Berikut ini adalah diagram blok untuk proses penentuan frame :
    Jadi, proses frame tersebut dilakukan secara terus-menerus hingga semua sinyal dapat terproses. Selain itu, proses ini umumnya dilakukan secara overlapping untuk setiap frame-nya. Panjang daerah overlap yang umum digunakan adalah kurang lebih 30% sampai 50% dari panjang frame.
  3. Windowing
  4. Proses windowing ini bertujuan untuk mengurangi terjadinya kebocoran spectral atau aliasing yang mana merupakan suatu efek dari timbulnya sinyal baru yang memiliki frekuensi yang berbeda dengan sinyal aslinya. Efek tersebut dapat terjadi karena rendahnya jumlah sampling rate atau karena proses frame blocking yang menyebabkan sinyal menjadi discontinue.
    Ada beberapa fungsi pada proses window diantaranya adalah sebagai berikut :
    1. Blackman Window
    2. Fungsi ini menghasilkan sidelobe level yang paling tinggi (kurang lebih -58 dB), tapi fungsi ini juga menghasilkan noise paling besar (kurang lebih 1.73 BINS).
    3. Window Rectangle
    4. Fungsi ini menghasilkan noise yang paling rendah berkisar 1.00 BINS, tapi sayangnya fungsi ini memberikan sidelobe level yang paling rendah sehingga menyebabkan terjadinya kebocoran spektral atau aliasing.
    5. Hamming Window
    6. Fungsi ini menghasilkan sidelobe level yang tidak terlalu tinggi (kurang lebih -43 dB). Selain itu, noise yang dihasilkan pun tidak terlalu besar (kurang lebih 1.36 BINS).
  5. Fast Fourier Transform (FFT)
  6. Untuk mendapatkan sinyal dalam domain frekuensi dari sebuah sinyal discrete, salah satu metode transformasi fourier yang digunakan adalah discrete fourier transform (DFT). DFT dilakukan terhadap masing-masing frame dari sinyal yang telah di-windowing. Namun, yang menjadi persoalan adalah bahwa DFT tersebut memerlukan waktu komputasi yang sangat panjang untuk data yang besar. Oleh karena itu, diperlukan suatu teknik komputasi yang efisien, baik dari sisi waktu maupun dari sisi penggunaan memori.
    FFT adalah algoritma cepat untuk mengimplementasikan discrete fourier transform (DFT).FFT ini mengubah masing-masing frame N sampel dari domain waktu menjadi domain frekuensi.
    Hasil transformasi ini dipengaruhi oleh beberapa parameter, yaitu sample rate sinyal suara dan FFT size. Sample rate adalah banyaknya sampel input analog yang diambil secara digital dengan satuan Hertz (Hz). Sample rate sinyal suara berpengaruh pada besarnya jangkauan frekuensi dari koefisien hasil FFT. Jangkauan frekuensi hasil FFT adalah setengah dari sample rate sinyal suara yang ditransformasi. Artinya, apabila terdapat sinyal suara dengan sample rate 44100 Hz, maka koefisien-koefisien hasil transformasi dari sinyal suara tersebut berkisar dari 0 Hz sampai 22050 Hz. Jadi, semakin besar sample rate , maka akan semakin detail pula sampel analog yang diambil secara digital.
    Sedangkan FFT size adalah panjang dari FFT yang digunakan. FFT size berpengaruh terhadap ketelitian tiap koefisien FFT. Semakin besar FFT size, maka tiap koefisien hasil FFT akan mewakili rentang frekuensi yang semakin kecil, sehingga ketelitiannya semakin tinggi. Sebaliknya apabila ukuran sampel FFT semakin kecil, maka tiap koefisien hasil FFT akan mewakili rentang frekuensi yang semakin besar, sehingga ketelitiannya semakin rendah.
    Output dari FFT ditransformasikan ke dalam rentang frekuensi. Nilai magnitude terhadap frekuensi didapatkan berdasarkan rumus dibawah ini :

Proses :

Percakapan untuk data sampel telah ditentukan sebelumnya. Saya menggunakan frase atau kata yang sama misal “Hallo”. Hal ini dilakukan agar dalam proses penelitian lebih mudah karena dengan frase atau ucapan yang sama diharapkan masing-masing pembicara dapat merepresentasikan nilai yang khas dari suaranya maka parameter yang ditentukan tidak banyak. Pada dasarnya struktur fisik pengucapan setiap orang berbeda sehingga dihasilkan gelombang yang berbeda pula. Adapun lamanya pembicaraan dalam suatu file wav tersebut berdurasi kurang lebih 0.7 sampai 1.27. Hal ini dilakukan agar banyak frame yang dihasilkan untuk setiap file sama karena ukuran waktu mempengaruhi panjang data dari file wav tersebut. Banyak frame juga bergantung pada ukuran data yang diberikan untuk tiap frame-nya. Saya menetapkan banyak data untuk setiap frame sebesar 1024 sehingga untuk setiap overlap data sebesar N/2 buah data yaitu 512.
Pada tahap selanjutnya, panjang data dari suatu file wav tersebut telah diketahui. Dari panjang data file wav tersebut akan dibagi menjadi beberapa frame. Jadi, banyak frame dapat diketahui dengan membagi panjang data dengan nilai 1024 sehingga banyak frame akan konsisten yaitu 36 selama selang waktu 0.7 detik sampai 1.27 detik.
Untuk tiap frame akan dilakukan proses FFT dengan window function Hamming, sehingga menghasilkan N buah data RealOut dan Imaginer. Karena FFT menggunakan komponen tambahan yaitu dspLab pada Delphi 7, maka algoritma FFT dan fungsi window Hamming akan di-handle langsung oleh komponen tersebut. Begitu pula dengan ukuran data tiap frame yang ditentukan sendiri melalui komponen tersebut melalui properties BufferSize. Jadi, nilai BufferSize yaitu 1024 dan nilai N/2 buah data diinisialisaikan pada properties BufferSize2 secara otomatis.
Hasil dari FFT tersebut adalah simetris, sehingga hanya N/2 buah data yang digunakan untuk proses selanjutnya. Dari N/2 buah data tersebut akan dihitung rata-rata nilai magnitude yang menjadi nilai dari frame tersebut. Karena sampling rate yang digunakan adalah sebesar 44100Hz, maka frekuensi tertinggi yang diperoleh adalah 22050Hz dengan pembagian frekuensi sebesar 22050Hz/512 data = 43.07 Hz/data. Nilai frekuensi tersebut sesuai dengan batas frekuensi tertinggi yang dapat didengar oleh manusia. Tabel berikut ini menunjukkan detail pembagian frekuensi sebagai hasil dari proses frequency extraction.
DataFrekuensiMagnitude
10 Hz – 43.07 Hz---------------
243.07 Hz – 86.13 Hz---------------
-------------------------------------------
51222006.93 Hz – 22050 Hz---------------

Implementasi Program :

  1. Written By Adhitya A P (0510960002)  
  2. Student of Computer Science in Brawijaya University  
  3.   
  4. unit UnitMain;  
  5.   
  6. interface  
  7.   
  8. uses  
  9.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  10.   Dialogs, dspFFT, dspIIRFilters, Menus, StdCtrls,  
  11.   Buttons, XPMan, DBCtrls, ExtCtrls, Mask, ComCtrls, DB, TeEngine,  
  12.   MmSystem, Series, Chart, Math;  
  13.   
  14. type  
  15.   TFMain = class(TForm)  
  16.       
  17.     dspFFTL: TdspFFT;  
  18.     XPManifest1: TXPManifest;  
  19.     StatusBar1: TStatusBar;  
  20.     dspFFTR: TdspFFT;  
  21.     BitBtnProses: TBitBtn;  
  22.     Memo1: TMemo;  
  23.     Chart1: TChart;  
  24.     Series1: TFastLineSeries;  
  25.     Chart2: TChart;  
  26.     Series2: TFastLineSeries;  
  27.   
  28.      
  29.     procedure BitBtnProsesClick(Sender: TObject);  
  30.    
  31.   private  
  32.     { Private declarations }  
  33.     wavehdr : TWaveHeader;  
  34.     wavedata : array [0..1of TChannel;  
  35.     numsamples : integer;  
  36.       
  37.     freqScale : array [1..20000of real;  
  38.     procedure GetInfoWav(filename : string; Memo : TMemo);  
  39.     procedure DisplayWav;  
  40.     procedure DigitalSignalProcessing(filename : string);  
  41.   public  
  42.     { Public declarations }  
  43.     procedure GetGrafik(i : Integer);  
  44.   end;  
  45.   
  46. var  
  47.   avgMagnitude, magnitude, Rmagnitude : array of real;  
  48.   
  49. procedure TFMain.DigitalSignalProcessing(filename : string);  
  50. var  
  51. i, j : Integer;  
  52. freqRange, nilai : real;  
  53. str : string;  
  54.   
  55. begin  
  56. //Menentukan Banyak Frame  
  57. nFrame := Round(Length(wavedata[0].Data)/dspFFTL.BufferSize);  
  58.   
  59. //inisial array  
  60. SetLength(avgMagnitude, nFrame);  
  61. SetLength(Lmagnitude, dspFFTL.BufferSize2);  
  62. SetLength(Rmagnitude, dspFFTL.BufferSize2);  
  63.   
  64. str := '';  
  65.   
  66. //proses segmentasi  
  67. for i:= 0 to nFrame-1 do  
  68.     begin  
  69.         StatusBar1.Panels.Items[1].Text := 'Proses File    '+DM.TDataWav.Fields[1].AsString+' pada Frame ke-'+IntToStr(i+1);  
  70.         Memo1.Lines.Append('Frame ke-'+IntToStr(i+1));  
  71.   
  72.         //input FFT  
  73.         for j := 0 to dspFFTL.BufferSize-1 do  
  74.             begin  
  75.                 case wavehdr.NumChannels of  
  76.                 //kasus mono  
  77.                 1 : begin  
  78.                     dspFFTL.RealIn[j] := wavedata[0].Data[dspFFTL.BufferSize*i+j];  
  79.                     dspFFTL.ImagIn[j]:= 0;  
  80.                 end;  
  81.                 //kasus stereo  
  82.                 2 : begin  
  83.                    //channel 0  
  84.                    dspFFTL.RealIn[j] := wavedata[0].Data[dspFFTL.BufferSize*i+j];  
  85.                    dspFFTL.ImagIn[j]:= 0;  
  86.                    //channel 1  
  87.                    dspFFTR.RealIn[j] := wavedata[1].Data[dspFFTR.BufferSize*i+j];  
  88.                    dspFFTR.ImagIn[j]:= 0;  
  89.                 end;  
  90.                 end//end case channel  
  91.              end;  
  92.   
  93.           //proses FFT with komponen dsp  
  94.           dspFFTL.FFT;  
  95.           dspFFTR.FFT;  
  96.           //procedure hitung nilai magnitude  
  97.           dspFFTL.CalculateMagnitudes;  
  98.           dspFFTR.CalculateMagnitudes;  
  99.   
  100.           //range frekuensi  
  101.           freqRange := (wavehdr.SampleRate/2)/dspFFTL.BufferSize2;  
  102.           for j:= 0 to (dspFFTL.BufferSize2) do  
  103.                freqScale[j] := (j*freqRange);  
  104.   
  105.           //proses awal nilai magnitude  
  106.           nilai :=0;  
  107.           for j:= 0 to (dspFFTL.BufferSize2-1do  
  108.               begin  
  109.               Lmagnitude[j] := sqrt(power(dspFFTL.RealOut[j],2)+power(dspFFTL.ImagOut[j],2));  
  110.               Rmagnitude[j] := sqrt(power(dspFFTR.RealOut[j],2)+power(dspFFTR.ImagOut[j],2));  
  111.               nilai := nilai+magnitude[j];  
  112.               end;  
  113.   
  114.           //rata-rata magnitude tiap frame  
  115.           avgMagnitude[i] := StrToFloat(Format('%0.2f', [nilai/dspFFTL.BufferSize2]));  
  116.           str := str +' '+FloatToStr(avgMagnitude[i]);  
  117.           Memo1.Lines.Append('Rata-rata magnitude = '+FloatToStr(avgMagnitude[i])+' ');  
  118.           Memo1.Lines.Append('');   
  119.   
  120.           //Penggambaran Grafik Sinyal  
  121.           GetGrafik(i);  
  122.     end;  
  123.     strpola := str;  
  124.     Memo1.Lines.Add('Pola = '+str);  
  125.     Memo1.Lines.Add('');  
  126. end;  
  127.   
  128. procedure TFMain.GetGrafik(i : Integer);  
  129. var j: Integer;  
  130. begin  
  131.   
  132.    Series1.Clear;  
  133.    for j:= 0 to (dspFFTL.BufferSize2)-1 do  
  134.        Series5.AddXY(freqScale[j], Rmagnitude[j], '', clMaroon);  
  135.   
  136.    Series2.Clear;  
  137.    for j:= 0 to (dspFFTL.BufferSize2)-1 do  
  138.        Series3.AddXY(freqScale[j], Lmagnitude[j], '', clMaroon);  
  139.   
  140. end;  
Download komponen dsplab disini

No comments:

Post a Comment