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 :
- Frame Blocking
- Windowing
- Blackman Window
- Window Rectangle
- Hamming Window
- Fast Fourier Transform (FFT)
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.
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 :
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).
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.
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).
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.
Data | Frekuensi | Magnitude |
---|---|---|
1 | 0 Hz – 43.07 Hz | --------------- |
2 | 43.07 Hz – 86.13 Hz | --------------- |
--- | ------------------------- | --------------- |
512 | 22006.93 Hz – 22050 Hz | --------------- |
Implementasi Program :
- Written By Adhitya A P (0510960002)
- Student of Computer Science in Brawijaya University
- unit UnitMain;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, dspFFT, dspIIRFilters, Menus, StdCtrls,
- Buttons, XPMan, DBCtrls, ExtCtrls, Mask, ComCtrls, DB, TeEngine,
- MmSystem, Series, Chart, Math;
- type
- TFMain = class(TForm)
- dspFFTL: TdspFFT;
- XPManifest1: TXPManifest;
- StatusBar1: TStatusBar;
- dspFFTR: TdspFFT;
- BitBtnProses: TBitBtn;
- Memo1: TMemo;
- Chart1: TChart;
- Series1: TFastLineSeries;
- Chart2: TChart;
- Series2: TFastLineSeries;
- procedure BitBtnProsesClick(Sender: TObject);
- private
- { Private declarations }
- wavehdr : TWaveHeader;
- wavedata : array [0..1] of TChannel;
- numsamples : integer;
- freqScale : array [1..20000] of real;
- procedure GetInfoWav(filename : string; Memo : TMemo);
- procedure DisplayWav;
- procedure DigitalSignalProcessing(filename : string);
- public
- { Public declarations }
- procedure GetGrafik(i : Integer);
- end;
- var
- avgMagnitude, magnitude, Rmagnitude : array of real;
- procedure TFMain.DigitalSignalProcessing(filename : string);
- var
- i, j : Integer;
- freqRange, nilai : real;
- str : string;
- begin
- //Menentukan Banyak Frame
- nFrame := Round(Length(wavedata[0].Data)/dspFFTL.BufferSize);
- //inisial array
- SetLength(avgMagnitude, nFrame);
- SetLength(Lmagnitude, dspFFTL.BufferSize2);
- SetLength(Rmagnitude, dspFFTL.BufferSize2);
- str := '';
- //proses segmentasi
- for i:= 0 to nFrame-1 do
- begin
- StatusBar1.Panels.Items[1].Text := 'Proses File '+DM.TDataWav.Fields[1].AsString+' pada Frame ke-'+IntToStr(i+1);
- Memo1.Lines.Append('Frame ke-'+IntToStr(i+1));
- //input FFT
- for j := 0 to dspFFTL.BufferSize-1 do
- begin
- case wavehdr.NumChannels of
- //kasus mono
- 1 : begin
- dspFFTL.RealIn[j] := wavedata[0].Data[dspFFTL.BufferSize*i+j];
- dspFFTL.ImagIn[j]:= 0;
- end;
- //kasus stereo
- 2 : begin
- //channel 0
- dspFFTL.RealIn[j] := wavedata[0].Data[dspFFTL.BufferSize*i+j];
- dspFFTL.ImagIn[j]:= 0;
- //channel 1
- dspFFTR.RealIn[j] := wavedata[1].Data[dspFFTR.BufferSize*i+j];
- dspFFTR.ImagIn[j]:= 0;
- end;
- end; //end case channel
- end;
- //proses FFT with komponen dsp
- dspFFTL.FFT;
- dspFFTR.FFT;
- //procedure hitung nilai magnitude
- dspFFTL.CalculateMagnitudes;
- dspFFTR.CalculateMagnitudes;
- //range frekuensi
- freqRange := (wavehdr.SampleRate/2)/dspFFTL.BufferSize2;
- for j:= 0 to (dspFFTL.BufferSize2) do
- freqScale[j] := (j*freqRange);
- //proses awal nilai magnitude
- nilai :=0;
- for j:= 0 to (dspFFTL.BufferSize2-1) do
- begin
- Lmagnitude[j] := sqrt(power(dspFFTL.RealOut[j],2)+power(dspFFTL.ImagOut[j],2));
- Rmagnitude[j] := sqrt(power(dspFFTR.RealOut[j],2)+power(dspFFTR.ImagOut[j],2));
- nilai := nilai+magnitude[j];
- end;
- //rata-rata magnitude tiap frame
- avgMagnitude[i] := StrToFloat(Format('%0.2f', [nilai/dspFFTL.BufferSize2]));
- str := str +' '+FloatToStr(avgMagnitude[i]);
- Memo1.Lines.Append('Rata-rata magnitude = '+FloatToStr(avgMagnitude[i])+' ');
- Memo1.Lines.Append('');
- //Penggambaran Grafik Sinyal
- GetGrafik(i);
- end;
- strpola := str;
- Memo1.Lines.Add('Pola = '+str);
- Memo1.Lines.Add('');
- end;
- procedure TFMain.GetGrafik(i : Integer);
- var j: Integer;
- begin
- Series1.Clear;
- for j:= 0 to (dspFFTL.BufferSize2)-1 do
- Series5.AddXY(freqScale[j], Rmagnitude[j], '', clMaroon);
- Series2.Clear;
- for j:= 0 to (dspFFTL.BufferSize2)-1 do
- Series3.AddXY(freqScale[j], Lmagnitude[j], '', clMaroon);
- end;
Download komponen dsplab disini
No comments:
Post a Comment