>> A=rand(1,8)
A =
0.4505 0.0838 0.2290 0.9133 0.1524 0.8258 0.5383 0.9961
>> B=bubblesort(A)
B =
0.0838 0.1524 0.2290 0.4505 0.5383 0.8258 0.9133 0.9961
Adapun Fungsinya adalah sbb:
function x = bubblesort(x)
n = length(x);
while (n > 0)
nnew = 0;
for i = 2:n
if (x(i) < x(i - 1))
x = swap(x,i,i - 1);
nnew = i;
end
end
n = nnew;
end
end
function x = swap(x,i,j)
val = x(i);
x(i) = x(j);
x(j) = val;
end
Kamis, 20 Desember 2018
Rabu, 19 Desember 2018
Implementasi Matlab Untuk Tingkat kesegaran Ikan
Yuk Kita Buat GUInya :
Jika nanti dijalankan ahsilnya sbb:
Lalu atur propertis nama TAGnya di setiap itemnya
Lalu pada Button kita kasih Koding
Code ahirnya dalah sbb:
function varargout = myGUI(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @myGUI_OpeningFcn, ...
'gui_OutputFcn', @myGUI_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function myGUI_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
function btnPilih_Callback(hObject, eventdata, handles)
[handles.namafile,handles.direktori]=uigetfile({'*.xls;*.xlsx','file excel(*.xls,*.xlsx)';'*.*','semua file(*.*)'},'buka file xls master');
I=fullfile(handles.direktori,handles.namafile);
if ~isequal(handles.namafile, 0)
set(handles.edPath,'String',I);
[a,b,c]=xlsread(I);
header= {'Kategori', 'Jam', 'Jenis Ikan', 'bagian', 'R', 'G', 'B'};
ba=size(c,1);
co=size(c,2);
mulaike=2;
mydata=c(mulaike:ba,1:co);
rnames = linspace(1,ba-mulaike+1,ba-mulaike+1);
jml=['Total Data Latih ' num2str(ba-1) ' Item']
set(handles.myTabel1,'data',mydata,'ColumnName',header,'RowName',rnames);
set(handles.myTabel1,'Userdata',mydata);
set(handles.txtTotal,'String',jml);
r1=10;
r2=18;
r3=27;
ar1=cell2mat(c(2:r1,5));
ag1=cell2mat(c(2:r1,6));
ab1=cell2mat(c(2:r1,7));
ar2=cell2mat(c(r1+1:r2,5));
ag2=cell2mat(c(r1+1:r2,6));
ab2=cell2mat(c(r1+1:r2,7));
ar3=cell2mat(c(r2+1:r3,5));
ag3=cell2mat(c(r2+1:r3,6));
ab3=cell2mat(c(r2+1:r3,7));
minr1=min(ar1);
ming1=min(ag1);
minb1=min(ab1);
minr2=min(ar2);
ming2=min(ag2);
minb2=min(ab2);
minr3=min(ar3);
ming3=min(ag3);
minb3=min(ab3);
maxr1=max(ar1);
maxg1=max(ag1);
maxb1=max(ab1);
maxr2=max(ar2);
maxg2=max(ag2);
maxb2=max(ab2);
maxr3=max(ar3);
maxg3=max(ag3);
maxb3=max(ab3);
header= {'Kategori', 'Rmin', 'Rmax', 'Gmin', 'Gmax', 'Bmin', 'Bmax'};
rnames = linspace(1,3,3);
mydata2(1,1)={'Segar'};
mydata2(1,2)={minr1};
mydata2(1,3)={maxr1};
mydata2(1,4)={ming1};
mydata2(1,5)={maxg1};
mydata2(1,6)={minb1};
mydata2(1,7)={maxb1};
mydata2(2,1)={'Cukup Segar'};
mydata2(2,2)={minr2};
mydata2(2,3)={maxr2};
mydata2(2,4)={ming2};
mydata2(2,5)={maxg2};
mydata2(2,6)={minb2};
mydata2(2,7)={maxb2};
mydata2(3,1)={'Tidak Segar'};
mydata2(3,2)={minr3};
mydata2(3,3)={maxr3};
mydata2(3,4)={ming3};
mydata2(3,5)={maxg3};
mydata2(3,6)={minb3};
mydata2(3,7)={maxb3};
set(handles.myTabel2,'data',mydata2,'ColumnName',header,'RowName',rnames);
set(handles.myTabel2,'Userdata',mydata2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
header= {'Linguistic Term', 'R', 'G', 'B'};
rnames = linspace(1,3,3);
mydata3(1,1)={'Low'};
mydata3(1,2)={'10-91'};
mydata3(1,3)={'11-76'};
mydata3(1,4)={'14-87'};
mydata3(2,1)={'Medium'};
mydata3(2,2)={'14-93'};
mydata3(2,3)={'16-90'};
mydata3(2,4)={'27-88'};
mydata3(3,1)={'High'};
mydata3(3,2)={'44-96'};
mydata3(3,3)={'42-93'};
mydata3(3,4)={'41-97'};
set(handles.myTabel3,'data',mydata3,'ColumnName',header,'RowName',rnames);
set(handles.myTabel3,'Userdata',mydata3);
header= {'Linguistic Term', 'Range'};
rnames = linspace(1,3,3);
mydata4(1,1)={'Segar'};
mydata4(1,2)={'11-76'};
mydata4(2,1)={'Cukup Segar'};
mydata4(2,2)={'27-88'};
mydata4(3,1)={'Tidak Segar'};
mydata4(3,2)={'41-97'};
set(handles.myTabel4,'data',mydata4,'ColumnName',header,'RowName',rnames);
set(handles.myTabel4,'Userdata',mydata4);
end
function btnBersih_Callback(hObject, eventdata, handles)
proyek=guidata(gcbo);
mau=questdlg(['Reset ' get(proyek.figure1,'Name')''],['Anda ingin Reset Aplikasi ini?'],'Ya','Tidak','Ya');
if strcmp(mau,'Tidak')
return;
else
%str=date;
%set(handles.edjoindate,'String',str);
set(handles.myTabel1,'data',[],'ColumnName',[],'RowName',[]);
set(handles.myTabel1,'Userdata',[]);
set(handles.myTabel2,'data',[],'ColumnName',[],'RowName',[]);
set(handles.myTabel2,'Userdata',[]);
set(handles.myTabel3,'data',[],'ColumnName',[],'RowName',[]);
set(handles.myTabel3,'Userdata',[]);
set(handles.myTabel4,'data',[],'ColumnName',[],'RowName',[]);
set(handles.myTabel4,'Userdata',[]);
set(handles.edPath,'String','');
set(handles.edMR,'String','');
set(handles.edMG,'String','');
set(handles.edMB,'String','');
set(handles.edPath2,'String','');
set(handles.edHasil1,'String','');
set(handles.edHasil2,'String','');
set(handles.edProses,'String','');
set(handles.txtTotal,'String','Total DataLatih 0 Item');
cla(handles.axes1,'reset');
cla(handles.axes2,'reset');
cla(handles.axes3,'reset');
cla(handles.axes4,'reset');
cla(handles.axes5,'reset');
end
function btnPilih2_Callback(hObject, eventdata, handles)
[handles.namafile,handles.direktori]=uigetfile({'*.jpg;*.bmp','file Image(*.jpg,*.bmp,*.bmp)';'*.*','semua file(*.*)'},'buka file xls master');
I=fullfile(handles.direktori,handles.namafile);
if ~isequal(handles.namafile, 0)
Matrix=imread(I);
set(handles.figure1,'CurrentAxes',handles.axes1);
imshow(Matrix);
set(handles.axes1,'Userdata',Matrix);
MatrixHSV=rgb2hsv(Matrix);
set(handles.figure1,'CurrentAxes',handles.axes5);
imshow(MatrixHSV);
set(handles.axes5,'Userdata',MatrixHSV);
set(handles.btnRGB,'Enable','on');
set(handles.edPath2,'String',I);
end
function btnRGB_Callback(hObject, eventdata, handles)
Matrix=get(handles.axes1,'Userdata');
R=Matrix(:,:,1);
set(handles.figure1,'CurrentAxes',handles.axes2);
imshow(R);
set(handles.axes2,'Userdata',R);
G=Matrix(:,:,2);
set(handles.figure1,'CurrentAxes',handles.axes3);
imshow(G);
set(handles.axes3,'Userdata',G);
B=Matrix(:,:,3);
set(handles.figure1,'CurrentAxes',handles.axes4);
imshow(B);
set(handles.axes4,'Userdata',B);
MR=mean(mean(R));
MG=mean(mean(G));
MB=mean(mean(B));
set(handles.edMR,'String',num2str(MR));
set(handles.edMG,'String',num2str(MG));
set(handles.edMB,'String',num2str(MB));
set(handles.btnRGB,'Enable','off');
function btnExit_Callback(hObject, eventdata, handles)
close;
Minggu, 11 November 2018
Menu Editor Matlab
Setelah membuat halaman kosong + backgroud, agar menarik dan hemat tempat buatlah menu editor
Tools-Menu Editor
Buat link sebagai berikut:
function mnuAdmin_Callback(hObject, eventdata, handles)
admin; %memanggil halaman admin
function mnuEmployes_Callback(hObject, eventdata, handles)
matlabEmploye;%memanggil halaman employee
function mnuValue_Callback(hObject, eventdata, handles)
value;%memanggil halaman value
function mnuAplikasi_Callback(hObject, eventdata, handles)
aplikasi;%memanggil halaman aplikasi
function mnuLogout_Callback(hObject, eventdata, handles)
exit;%keluar aplikasi
CMIIW
Tools-Menu Editor
Buat link sebagai berikut:
function mnuAdmin_Callback(hObject, eventdata, handles)
admin; %memanggil halaman admin
function mnuEmployes_Callback(hObject, eventdata, handles)
matlabEmploye;%memanggil halaman employee
function mnuValue_Callback(hObject, eventdata, handles)
value;%memanggil halaman value
function mnuAplikasi_Callback(hObject, eventdata, handles)
aplikasi;%memanggil halaman aplikasi
exit;%keluar aplikasi
CMIIW
Matlab 64bit ke Database
1.Download driver Matlab ke databse mysql mysql-connector-java-3.1.14-bin
2.File jar yag di dapat copas ke C:\Program Files\MATLAB\R2017a\java\jar
3.Buka file C:\Program Files\MATLAB\R2017a\toolbox\local\classpath.txt menggunakan notepad, dan letakkan kode sbb di bagian bawahnya:
$matlabroot/java/jar/mysql-connector-java-3.1.14-bin.jar
4.Buat database db_matlab dengan tabel sbb
CREATE TABLE `tb_admin` (
`kode_admin` varchar(15) NOT NULL,
`name` varchar(30) NOT NULL,
`username` varchar(20) NOT NULL,
`password` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `tb_employe` (
`nik` varchar(15) NOT NULL,
`name` varchar(30) NOT NULL,
`join_date` varchar(20) NOT NULL,
`divisi` varchar(20) NOT NULL,
`department` varchar(20) NOT NULL,
`tempat_lahir` varchar(30) NOT NULL,
`tanggal_lahir` varchar(20) NOT NULL,
`jenis_kelamin` varchar(20) NOT NULL,
`agama` varchar(15) NOT NULL,
`pendidikan_terakhir` varchar(15) NOT NULL,
`jurusan` varchar(30) NOT NULL,
`status` varchar(30) NOT NULL,
`alamat` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `tb_value` (
`id` int(11) NOT NULL,
`nik` varchar(20) NOT NULL,
`tanggal_nilai` varchar(20) NOT NULL,
`month` varchar(20) NOT NULL,
`year` varchar(10) NOT NULL,
`age` varchar(10) NOT NULL,
`nilai` varchar(10) NOT NULL,
`note` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ADD UNIQUE KEY `kode_admin` (`kode_admin`);
ALTER TABLE `tb_value`
ADD UNIQUE KEY `id` (`id`);
ALTER TABLE `tb_value`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=607;
COMMIT;
++++++++++++++++++++++++++++
Sehingga hasilnya adalah sebagai berikut
Atau penampakan keseluruhannya adalah sbb:
5.Langkah selanjutnya adalah kita membuat code CRUD:create Read Update dan Delete tb_admin
A.Buat fungsi koneksiadmin() gunanya sebagai penghubung tb_admin dengan database
function [con,table,kolom] = koneksiadmin()
url = 'jdbc:mysql://localhost:3306/';
table='tb_admin';
kolom = {'kode_admin', 'name', 'username', 'password'};
con = database('db_matlab', 'root', '', 'com.mysql.jdbc.Driver', url);
end
B.Buat fungsi lihatadmin() gunanya sebagai code melihat tb_admin database ke database
function [ kolom,mydata,no ] = lihatadmin(varargin)
[con,table,kolom]=koneksiadmin();
tabel=varargin{1};
SQL=['SELECT * FROM ' tabel];
if length(varargin)==3
pk=varargin{2};
kode=varargin{3};
setdbprefs('NullNumberWrite', 'NaN');
SQL=['select * from ' tabel ' where ' pk ' like ''%', kode, '%'''];
end
curs = exec(con,SQL);
curs = fetch(curs);
mydata=curs.Data;
baris=size(mydata,1);
no=linspace(1,baris,baris);
end
C.Membuat Fungsi autoadmin(), gunanya untuk membuat kode autocode kode_admin.....
function [ AU ] = autoadmin( varargin )
[con,table,kolom]=koneksiadmin();
%kode='KAT1407000';
tabel=varargin{1};
pk=varargin{2};
pre=varargin{3};
setdbprefs('NullNumberWrite', 'NaN');
SQL=['SELECT * FROM ' tabel ' order by ' pk ' desc' ];
curs = exec(con,SQL);
curs = fetch(curs);
mydata=curs.Data;
baris=size(mydata,1);
th=year(date);
bl=month(date);
thn=num2str(th);
thn=thn(3:4);
bln=num2str(bl);
C=1;
if bl<10
bln=['0' bln];
end
kode=[pre thn bln '001'];
[AU]=[pre thn bln];
if baris>0
kode=cell2mat(mydata(1,1));
if strcmp(kode,'No Data')>0
C=1;
else
C1=kode(8:10);
C=str2num(C1)+1;
YL=kode(4:5);
ML=kode(6:7);
[AU]=[pre YL ML];
if str2num(thn)~=str2num(YL)
C=1;
elseif str2num(bln)~=str2num(ML)
C=1;
end
end
end
if C <10
[AU]=[AU '00' num2str(C)];
elseif C <100
[AU]=[AU '0' num2str(C)];
else
[AU]=[AU num2str(C)];
end
end
D.Membuat GUI CRUD Admin
E.Buat code sbb di dalamnya:
function varargout = admin(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @admin_OpeningFcn, ...
'gui_OutputFcn', @admin_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function admin_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
axes(handles.axes2); %memilih axes1 sebagai letak gambar yang dimunculkan
imshow('logo.jpeg');
axes(handles.axes3); %memilih axes1 sebagai letak gambar yang dimunculkan
imshow('bg2.jpeg');
axes(handles.axes4); %memilih axes1 sebagai letak gambar yang dimunculkan
imshow('bg2.jpeg');
global kode_admin;
handles.pk='kode_admin';
handles.tabel='tb_admin';
handles.pre='ADM';
[kolom,mydata,no ]=lihatadmin(handles.tabel,handles.pk);
set(handles.myTable,'data',mydata,'ColumnName',kolom,'RowName',no);
set(handles.myTable,'Userdata',mydata); T=size(mydata,1); [tot]=['Total '
num2str(T) ' data']; set(handles.txtTotal,'String',tot);
[AU]=autoadmin(handles.tabel,handles.pk,handles.pre);
set(handles.edkodeadmin,'String',AU);
guidata(hObject, handles);
guidata(hObject, handles);
function btnSimpan_Callback(hObject, eventdata, handles)
kode_admin=get(handles.edkodeadmin,'String');
name=get(handles.edname,'String');
username=get(handles.edusername,'String');
password=get(handles.edpassword,'String');
[con,table,kolom]=koneksiadmin();
kolomsimpan = {'kode_admin', 'name', 'username', 'password'};
arData = {kode_admin, name,username,password};
fastinsert(con,table,kolomsimpan,arData);
showtabel('Simpan',handles);
function btnUbah_Callback(hObject, eventdata, handles)
kode_admin=get(handles.edkodeadmin,'String');
name=get(handles.edname,'String');
username=get(handles.edusername,'String');
password=get(handles.edpassword,'String');
[con,table,kolom]=koneksiadmin();
[SQL]= ['update tb_admin set name=''', name, ''',username=''', username,''',password=''', password, ''' where kode_admin=''', kode_admin, ''''];
sqls=cell2mat(SQL)
curs = exec(con,sqls);
exec(con, 'rollback');
exec(con, 'commit');
showtabel('Ubah',handles);
function btnHapus_Callback(hObject, eventdata, handles)
kode_admin=get(handles.edkodeadmin,'String');
[con,table,kolom]=koneksiadmin();
[SQL]=['delete from tb_admin where kode_admin=''' kode_admin ''''];
curs = exec(con,SQL);
sqls=cell2mat(SQL)
curs = exec(con,sqls);exec(con, 'rollback');
exec(con, 'commit');
showtabel('Hapus',handles);
function btnReset_Callback(hObject, eventdata, handles)
proyek=guidata(gcbo);
mau=questdlg(['Reset ' get(proyek.figure1,'Name')''],['Anda ingin Reset Aplikasi ini?'],'Ya','Tidak','Ya');
if strcmp(mau,'Tidak')
return;
else
hm = msgbox('Reset','Reset Sukses','help');
showtabel('Clear',handles);
end
function btnTutup_Callback(hObject, eventdata, handles)
close();
function showtabel(proses,handles)
tabel=handles.tabel;
pk=handles.pk;
[kolom,mydata,no ]=lihatadmin(tabel,pk);
set(handles.myTable,'data',mydata,'ColumnName',kolom,'RowName',no);
set(handles.myTable,'Userdata',mydata);
T=size(mydata,1);
[tot]=['Total ' num2str(T) ' data'];
set(handles.txtTotal,'String',tot);
[AU]=autoadmin(handles.tabel,handles.pk,handles.pre);
set(handles.edkodeadmin,'String',AU);
set(handles.edname,'String','');
set(handles.edusername,'String','');
set(handles.edpassword,'String','');
[ps]=['Sukses Proses ' proses];
msgbox(ps,proses,'help');
function myTable_CellSelectionCallback(hObject, eventdata, handles)
try
al= eventdata.Indices;
dataseleksi=get(handles.myTable,'Userdata');
getdata=dataseleksi(al);
kode=getdata{1};
[kolom,mydata,no ] = lihatadmin(handles.tabel,handles.pk,kode);
var1=mydata(1,1);
var2=mydata(1,2);
var3=mydata(1,3);
var4=mydata(1,3);
set(handles.edkodeadmin,'string',var1);
set(handles.edname,'string',var2);
set(handles.edusername,'string',var3);
set(handles.edpassword,'string',var4);
catch
[AU]=autoadmin(handles.tabel,handles.pk,handles.pre);
set(handles.edkodeadmin,'string',AU);
set(handles.edname,'string','');
set(handles.edusername,'string','');
set(handles.edpassword,'string','');
end
F.Hasil ahirnya adalah sbb:
Bila salah satu data pada tabel kita pilih/klik maka data tersebut akan terseleksi ke atas dan siap untuk di modifikasi (ubah / dihapus).....
CMIIW
Sabtu, 10 November 2018
POPUP MENU MATLAB
How Get VALUE POPUP MENU
function pilAgama_Callback(hObject, eventdata, handles)
ar= get(handles.pilAgama, 'String');
v = get(handles.pilAgama, 'value');
hasil=cell2mat(ar(v));
set(handles.pilAgama, 'Userdata',hasil);
How SET VALUE POPUP MENU:
v=1;
if(strcmp(agama,'Islam')>0)
v=1;
elseif(strcmp(agama,'Kristen')>0)
v=2;
elseif(strcmp(agama,'Hindu')>0)
v=3;
elseif(strcmp(agama,'Budha')>0)
v=4;
end
set(handles.pilAgama, 'Value', v);
How SET STRING POPUP MENU:
a='you';b='are';c='crazy'
s=char(a,b,c); %s 3x5 30 char
set(handles.pilNIK,'string',s);
How SET STRING POPUP MENU FROM DATABASE:
[arkode,arnama] = aremployee( 'tb_employe' );
set(handles.pilNIK,'string',arkode);
function [kode,nama] = aremployee( tabel )
[con]=koneksivalue();
setdbprefs('NullNumberWrite', 'NaN');
SQL=['SELECT nik,name FROM ' tabel ' order by nik asc' ];
curs = exec(con,SQL);
curs = fetch(curs);
mydata=curs.Data;
baris=size(mydata,1);
kode=mydata(:,1);
nama=mydata(:,2);
end
function [con] = koneksivalue()
url = 'jdbc:mysql://localhost:3306/';
con = database('db_matlab', 'root', '', 'com.mysql.jdbc.Driver', url);
end
Menghitung Selisih Tanggal
Di database Matlab menyimpan tanggal dalam format string...
Misal:
str=date
'10-Nov-2018'
Dan jika kita k=ingin mncari selisih dari dua string tanggal tersebut maka gunakan rumus sbb:
A=datetime('02-Nov-2018','InputFormat','dd-MM-yyyy');
B=datetime('12-Nov-2018','InputFormat','dd-MM-yyyy');
numdays = datenum(A) - datenum(B);
HASIL:
A 1x1 17 datetime
B 1x1 17 datetime
numdays 1x1 8 double
A = 02-Nov-2018
B = 12-Nov-2018
numdays =-10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Misal:
str=date
'10-Nov-2018'
Dan jika kita k=ingin mncari selisih dari dua string tanggal tersebut maka gunakan rumus sbb:
A=datetime('02-Nov-2018','InputFormat','dd-MM-yyyy');
B=datetime('12-Nov-2018','InputFormat','dd-MM-yyyy');
numdays = datenum(A) - datenum(B);
HASIL:
A 1x1 17 datetime
B 1x1 17 datetime
numdays 1x1 8 double
A = 02-Nov-2018
B = 12-Nov-2018
numdays =-10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Jumat, 17 Agustus 2018
MFCC Audio File
download file latihan
A.Pre-emphasis
the speech signal s(n) is sent to a high-pass filter:
s2(n) = s(n) - a*s(n-1)
where s2(n) is the output signal and the value of a is usually between 0.9 and 1.0. The z-transform of the filter is
H(z)=1-a*z-1
figure;
waveFile='sunday.wav';
[y,fs]=audioread(waveFile);
nbits=8;
y=y*2^nbits/2;
subplot(2,1,1);
time=(1:length(y))/fs;
plot(time, y); axis([min(time), max(time), -2^nbits/2, 2^nbits/2]);
xlabel('Time (seconds)'); ylabel('Amplitude'); title('Waveforms of "sunday"');
frameSize=512;
index1=0.606*fs;
index2=index1+frameSize-1;
line(time(index1)*[1, 1], 2^nbits/2*[-1 1], 'color', 'r');
line(time(index2)*[1, 1], 2^nbits/2*[-1 1], 'color', 'r');
subplot(2,1,2);
time2=time(index1:index2);
y2=y(index1:index2);
plot(time2, y2, '.-'); axis([min(time2), max(time2), -2^nbits/2, 2^nbits/2]);
xlabel('Time (seconds)'); ylabel('Amplitude'); title('Waveforms of the voiced "ay" in "sunday"');
C.Hamming windowing:
Each frame has to be multiplied with a hamming window in order to keep the continuity of the first and the last points in the frame (to be detailed in the next step). If the signal in a frame is denoted by s(n), n = 0,…N-1, then the signal after Hamming windowing is s(n)*w(n), where w(n) is the Hamming window defined by:
w(n, a) = (1 - a) - a cos(2pn/(N-1)),0≦n≦N-1
Different values of a corresponds to different curves for the Hamming windows shown next:
D.Fast Fourier Transform or FFT:
Spectral analysis shows that different timbres in speech signals corresponds to different energy distribution over frequencies. Therefore we usually perform FFT to obtain the magnitude frequency response of each frame.
fs=8000;
t=(1:512)'/fs;
f=306.396;
original=sin(2*pi*f*t)+0.2*randn(length(t),1);
windowed=original.*hamming(length(t));
plot(t, original); grid on; axis([-inf inf -1.5 1.5]); title('Original signal');
plot(t, windowed); grid on; axis([-inf inf -1.5 1.5]); title('Windowed signal');
A.Pre-emphasis
the speech signal s(n) is sent to a high-pass filter:
figure;
waveFile='sunday.wav';
[y,fs]=audioread(waveFile);
nbits=8;
y=y*2^nbits/2;
subplot(2,1,1);
time=(1:length(y))/fs;
plot(time, y); axis([min(time), max(time), -2^nbits/2, 2^nbits/2]);
xlabel('Time (seconds)'); ylabel('Amplitude'); title('Waveforms of "sunday"');
frameSize=512;
index1=0.606*fs;
index2=index1+frameSize-1;
line(time(index1)*[1, 1], 2^nbits/2*[-1 1], 'color', 'r');
line(time(index2)*[1, 1], 2^nbits/2*[-1 1], 'color', 'r');
subplot(2,1,2);
time2=time(index1:index2);
y2=y(index1:index2);
plot(time2, y2, '.-'); axis([min(time2), max(time2), -2^nbits/2, 2^nbits/2]);
xlabel('Time (seconds)'); ylabel('Amplitude'); title('Waveforms of the voiced "ay" in "sunday"');
B.Frame blocking:
The input speech signal is segmented into frames of 20~30 ms with optional overlap of 1/3~1/2 of the frame size.
Usually the frame size (in terms of sample points) is equal to power of two in order to facilitate the use of FFT. If this is not the case, we need to do zero padding to the nearest length of power of two. If the sample rate is 16 kHz and the frame size is 320 sample points, then the frame duration is 320/16000 = 0.02 sec = 20 ms. Additional, if the overlap is 160 points, then the frame rate is 16000/(320-160) = 100 frames per second.
C.Hamming windowing:
Each frame has to be multiplied with a hamming window in order to keep the continuity of the first and the last points in the frame (to be detailed in the next step). If the signal in a frame is denoted by s(n), n = 0,…N-1, then the signal after Hamming windowing is s(n)*w(n), where w(n) is the Hamming window defined by:
D.Fast Fourier Transform or FFT:
Spectral analysis shows that different timbres in speech signals corresponds to different energy distribution over frequencies. Therefore we usually perform FFT to obtain the magnitude frequency response of each frame.
When we perform FFT on a frame, we assume that the signal within a frame is periodic, and continuous when wrapping around. If this is not the case, we can still perform FFT but the incontinuity at the frame's first and last points is likely to introduce undesirable effects in the frequency response. To deal with this problem, we have two strategies:
- Multiply each frame by a Hamming window to increase its continuity at the first and last points.
- Take a frame of a variable size such that it always contains a integer multiple number of the fundamental periods of the speech signal.
PLOT AUDIO
[ clean, fs ] = audioread( 'tes.wav' );
plotWave_YW(1, clean, fs, 'time', 0, 'clean speech');
plotWave_YW(1, clean, fs, 'time', 1, 'clean speech');
plotWave_YW(0, clean, fs, 'time', 1, 'clean speech');
function plotWave_YW(newFig, signal, fs, type, x_axis, name, removeFreq, frame)
plotWave_YW(1, clean, fs, 'time', 0, 'clean speech');
plotWave_YW(1, clean, fs, 'time', 1, 'clean speech');
plotWave_YW(0, clean, fs, 'time', 1, 'clean speech');
function plotWave_YW(newFig, signal, fs, type, x_axis, name, removeFreq, frame)
%% By YI-WEN CHEN, 2017 / Jarvus Studio % 1. Plot signal wave in time or frequency domain % 2. Choose x-axis as time or samples % 3. Remove spectral energy under a value when show the spectrogram % Read more at http://jarvus.dragonbeef.net/note/noteAudioPlot.php % % Required Input Parameters : % newFig Create in a new figure window ( 0:No, 1:Yes ) % signal Speech data % fs Sampling frequency (Hz) % type 'time' or 'freq' % Optional Input Parameters : % x_axis 0: samples, 1: time % name Figure title % removeFreq Threshold for spectral energy % frame Frame size for spectrogram (ms) % % example : % [ clean, fs ] = audioread( 'sp10.wav' ); % % open a new figure, plot in time domain % % show index as x-axis, titile is 'clean speech' % plotWave_YW(1, clean, fs, 'time', 0, 'clean speech'); % % open a new figure, plot in time domain % % show time as x-axis, titile is 'clean speech' % plotWave_YW(1, clean, fs, 'time', 1, 'clean speech'); % % open a new figure, plot in frequency domain % % titile is 'clean speech' % plotWave_YW(1, clean, fs, 'freq', 1, 'clean speech'); % % open a new figure, plot in frequency domain % % titile is 'clean speech', remove spectral energy when under 0 % plotWave_YW(1, clean, fs, 'freq', 1, 'clean speech',0); % % use subplot, so the first parameter should be zero % figure; % subplot(2,1,1); % plotWave_YW(0, clean, fs, 'time', 1, 'clean speech'); % subplot(2,1,2); % plotWave_YW(0, clean, fs, 'freq', 1, 'clean speech'); if ( nargin < 5) x_axis = 0; end if ( nargin < 7) removeFreq = 0; end if ( nargin < 8) frame = 32; end s_length = length(signal); sampleTime = ( 1:s_length )/fs; frameSize = fix(frame*0.001*fs); if ( newFig == 1 ) figure; end if ( strcmp(type, 'time') && x_axis == 0) plot(signal); if ( nargin > 5 ) title(name) end xlabel('Samples');ylabel('Amplitude'); end if ( strcmp(type, 'time') && x_axis == 1) plot(sampleTime, signal); if ( nargin > 5 ) title(name) end xlabel('Time (s)');ylabel('Amplitude'); end if ( strcmp(type, 'freq') ) [B,f,T] = specgram(signal,frameSize*2,fs,hanning(frameSize),round(frameSize/2)); B = 20*log10(abs(B)); if ( nargin > 6 ) B_idx = B <= removeFreq ; B(B_idx) = -50; end imagesc(T,f,B);axis xy;colorbar if ( nargin > 5 ) title(['Spectrogram' ' - ' name]); end xlabel('Time (s)');ylabel('Frequency (Hz)'); end end
Selasa, 14 Agustus 2018
Pengolahan Sinyal Audio
LPC
Linear Predictive Coding (LPC)
adalah salah satu teknik yang efektif untuk menganalisa suara
dan salah satu metode yang sering digunakan untuk menghasilkan kualitas suara yang baik dengan bit yang rendah.
LPC Pitch dan LPC Voice Excited
Parameter LPC al: koefisien prediksi, gain, dan pitch u perbaikan rekontruksi suara yang baik.
Voice excited LPC digunakan perhitungan DCT untuk membangkitkan sinyal energi dengan beberapa koefisien sehingga memberikan rekontruksi sinyal yang lebih bila dibandingkan dengan plain LPC yang menggunakan perhitungan pitch.
Perbandingan keluaran dari plain LPC dan voice excited LPC.
Keluaran sinyal yang dihasilkan pada plain LPC hampir tidak jelas terdengar.
Sedangkan sinyal keluaran pada voice excited LPC lebih terdengar jelas tetapi
menggunakan total bit yang lebih banyak dibandingkan dengan plain LPC.
Terlihat bahwa untuk mendapatkan kualitas keluaran sinyal yang lebih baik maka dibutuhkan
total bit yang lebih besar.
++++++++++++++++++++
Umumnya LPC digunakan karena menyediakan pemodelan yang baik untuk sinyal suara,
LPC dapat dengan mudah dan langsung diterapkan baik secara perangkat lunak maupun perangkat keras karena perhitungan matematis yang dilibatkan realtif lebih singkat dari metode-metode yang dikenal sebelumnya.
Fast Fourier transform (FFT) menjadi penting untuk bermacam–macam aplikasi, dari pengolahan sinyal digital dan memecahkan persamaan diferensial parsial menjadi algoritma-algoritma untuk penggandaan bilangan integer dalam jumlah yang banyak.
Secara garis besar, cara kerja sistem pengenalan suara ini ialah
+mula-mula sinyal suara manusia yang diterima dengan menggunakan microphone (sinyal analog) dicuplik sehingga menjadi sinyal digital dengan bantuan sound card pada komputer.
+Sinyal digital hasil cuplikan ini terlebih dulu dinormalisasi kemudian diproses awal menggunakan metode LPC sehingga didapat beberapa koefisien LPC yang merupakan feature (ciri) dari suara pembicaraan.
+Kemudian koefisien LPC tersebut diproses dengan Fast Fourier Transform (FFT) untuk mendapatkan sinyal pada domain frekuensi. Hal ini bertujuan agar perbedaan antar pola kata yang satu dengan yang lain terlihat lebih jelas sehingga ekstraksi parameter sinyal memberikan hasil yang lebih baik. Hasil keluaran FFT ini akan di compare sebagai fungsi utama dari sistem untuk proses pengenalan.
LPC melakukan analisis dengan cara memperkirakan formant,
memisahkan formant dari sinyal, yang dinamakan proses inverse filtering,
lalu mengestimasi intensitas dan frekuensi dari sinyal percakapan yang tersisa, yang disebut residue.
Karena sinyal percakapan bervariasi seiring waktu, estimasi tersebut dilakukan untuk setiap potongan kecil dari sinyal, yang dinamakan frame.
Prosedur untuk mendapatkan koefisien LPC diperlihatkan pada gambar dibawah.
1. Preemphasis :
Proses dimana sinyal / speech ucapan sirubah menjadi sinyal
Preemphasis terhadap cuplikan sinyal dengan persamaan preemphasizer:
s (n) = s(n)- as(n -1) atau
s(n) = s(n) – 0.95 s(n − 1)
dengan s(n) adalah sampel ke-n dan harga a yang paling sering digunakan ialah 0.95.
jadi..pada langkah ini dilakukan filtering terhadap sinyal menggunakan FIR filter orde satu untuk meratakan spektral sinyal tersebut. Proses ini mencakup penambahan energi suara pada frekuensi tinggi.
di mana as(n) adalah sinyal yang ditekan, sedangkan s(n) adalah sinyal terdigitasi. Koefisien dengan nilai 0.95 menunjukkan sinyal yang diekstrak merupakan 95 % sinyal aslinya
2. Blocking into frames / Tracking :
Pada langkah ini sinyal ucapan yang telah teremphasis dibagi menjadi beberapa frame (bingkai)
dengan masing-masing frame memuat N sampel sinyal dan frame yang saling yang berdekatan dipisahkan sejauh M sample.
Menyusun sinyal ke dalam bingkai yang lebih pendek. Panjang frame yang membagi setiap
sample menjadi beberapa frame berdasarkan waktu terletak di antara 20 hingga 40 ms . Dengan asumsi bahwa frekuensi suara 18 kHz, maka sampel yang akan diekstrak adalah 0,025 detik * 18.000 Hz = 450 sampel.
Semakin M < N semakin baik perkiraan spektral LPC dari frame ke frame.
3. FrameWindowing :
Windowing (Penjendelaan) merupakan proses pembobotan terhadap setiap frame yang telah dibentuk
pada langkah sebelumnya menggunakan fungsi Window. Ada dua fungsi window yang biasa digunakan, yaitu
Rectangular Window dan Hamming Window.
Fungsi window ini menghasilkan sinyal yang diskontinyu.
Salah satu cara untuk menghindari diskontinyu pada ujung window adalah dengan
meruncingkan sinyal menjadi nol atau dekat dengan nol sehingga dapat mengurangi kesalahan.
Rectangular Window yang didefinisikan untuk meminimalkan pada bagian awal dan akhir sinyal.
Jika definisikan sebuah window w(n) dan sinyal tiap bagian adalah x(n) .
Artinya HammingWindow untuk sampel ke-n adalah: W(n) =0.54-0.46 cos (2Ï€n/N-1), 0 ≤ n ≤ N-1
4. Auto Correlation Analisys :
Tiap bagian yang telah diberi window kemudian akan dibentuk autokorelasinya.
Analisis autokorelasi terhadap setiap frame hasil windowing x1 (n) dengan persamaan:
r1(m)=Σ n-1-mn=0 x1(n)x1(n+m)
dengan m dimulai dari 0 dan nilai tertinggi dari m = p adalah orde LPC yang biasa bernilai 8 - 16
5. Analisa LPC :
Langkah berikutnya adalah analisa LPC dimana semua nilai aotukorelasinya yang telah dihitung pada tahap sebelumnya akan diubah menjadi parameter LPC
Mengubah p +1 buah hasil autokorelasi pada masing masing frame menjadi
koefisien LPC am = αm(p)
untuk m = 1,2,..., p dengan persamaan dibawah ini:
E(o)=r(0) (2.5)
km={r(m)-Σm-1j=1αj(m-1)r(|m-j|)/E(m-1), 1 ≤ m ≤ p
αm(m)= km αj(m) = αj(m-1)- km αm-j(m-1), 1 ≤ j ≤ m-1
E(m)=(1- km2) E(m-1)
dengan r(0)adalah hasil autokorelasi,
E(m) adalah error,
km adalah koefisien pantulan,
aj(m) adalah koefisien prediksi untuk 1 ≤ j ≤ m
6. Pengubahan parameter LPC menjadi koefisien cepstral :
Parameter LPC yang sangat penting yang bisa diturunkan dari koefisien LPC adalah koefisien cepstral LPC, c(m).
Mengubah parameter LPC am ke koefisien cepstral cm untuk mendapatkan kinerja yang lebih baik dan tahan terhadap noise,
yaitu dengan persamaan:
cm=am+Σm-1k=1(k/m)ck am-k, 1 ≤ m ≤ p
cm= Σm-1k=1(k/m)ck am-k, m > p
koefisien cepstral ini adalah koefisien dari representasi pada spectrum logaritmis.
clear all;
fs=10000;
[x,fs]=audioread('tes.wav');
xx=length(x)+1;
x(xx)=0;
alpha=0.96;
for i=2:xx
y0(i)=x(i-1);
end
for i=1:xx
y(i) = x(i) - alpha*y0(i);
end
subplot(211)
t=1:xx;
plot(t/fs,y);legend('input');grid
xlabel('waktu (dt)'); ylabel('magnitudo');axis([0 0.7 -0.25 0.25]);
subplot(212)
plot(t/fs,y0); legend('output');grid
xlabel('waktu (dt)'); ylabel('magnitudo'); axis([0 0.7 -1 1.5])
MFCC
Mel frequency Cepstral Coefficient adalah sebuah koefisien audio, dalam beberapa studi menunjukkan bahwa persepsi pendengaran manusia tidaklah dalam skala yang linier dalam bentuk frekuensi melainkan diukur dalam bentuk skala mel-frekuensi.
Sehingga Mel-Scale merupakan skala yang diambil berdasarkan pendekatan terhadap pendengaran manusia. Dimana penggunaannya adalah untuk mengestrak data sinyal suara. Tahapan proses dalam Mel Frequency Cepstral Coefficient adalah;
1. Frame Blocking
Dalam proses frame blocking sinyal suara yang masuk akan diblok menjadi frame frame dengan jumlah N sampel dan jarak antar sampel dengan spasi M dimana M < N. Nilai dari N biasanya adalah 256 dengan spasi M=100
2. Windowing
Proses windowing dilakukan pada setiap frame dengan tujuan untuk meminimumkan diskontinuitas antar dua frame yang adjacent, khususnya pada bagian awal dan akhir.
3. FFT ( Fast Fourier Transform ) Tahapan berikutnya adalah FFT, disini FFT akan mengubah masing-masing frame N sampel dari domain waktu menjadi domain frekuensi.
Pada langkah ini setiap frame hasil dari fungsi window dikenai proses FFT. Fungsi FFT digunakan
untuk mengubah sinyal yang semula merupakan time domain menjadi frequency domain. Langkah ini mengubah tiap frame N sampel dari domain waktu ke dalam domain frekuensi. Dalam pengolahan suara, Transformasi Fourier Cepat berguna untuk mengubah konvolusi getaran celah suara dan respon gelombang saluran suara dalam domain waktu.
4. Wrapping Skala mel-frekuensi adalah frekuensi linier berada dibawah 1000 Hz dan bentuk logaritmik berada diatas 1000 Hz. Pendekatan persamaan untuk mengitung mel dalam frekuensi f ( Hz ) adalah;
Mel ( f ) = 2595 x Log10( 1+ f / 700 )
5. Cepstrum Langkah terakhir adalah mengubah spektrum log-mel menjadi domain waktu. Hasil dari proses inilah yang disebut dengan Mel Frequency Cepstral Coefficient. Representasi cepstral dari spektrum sinyal suara berasal dari sifat spektrum sinyal untuk analisa frame yang ada.
Pada tahap ini dilakukan wrapping terhadap spektrum yang dihasilkan dari FFT sehingga dihasilkan Mel-scale
untuk menyesuaikan resolusi frekuensi terhadap properti pendengaran manusia. Kemudian Mel-scale
dikelompokkan menjadi sejumlah critical bank menggunakan filter bank. Jangkauan frekuensi dalam
spektrum sangatlah luas dan sinyal suara tidak mengikuti skala linear. Sehingga setelah spektrum
terkomputasi, data dipetakan dalam skala Mel menggunakan filter segitiga yang saling tumpang tindih.
Linear Predictive Coding (LPC)
adalah salah satu teknik yang efektif untuk menganalisa suara
dan salah satu metode yang sering digunakan untuk menghasilkan kualitas suara yang baik dengan bit yang rendah.
LPC Pitch dan LPC Voice Excited
Parameter LPC al: koefisien prediksi, gain, dan pitch u perbaikan rekontruksi suara yang baik.
Voice excited LPC digunakan perhitungan DCT untuk membangkitkan sinyal energi dengan beberapa koefisien sehingga memberikan rekontruksi sinyal yang lebih bila dibandingkan dengan plain LPC yang menggunakan perhitungan pitch.
Perbandingan keluaran dari plain LPC dan voice excited LPC.
Keluaran sinyal yang dihasilkan pada plain LPC hampir tidak jelas terdengar.
Sedangkan sinyal keluaran pada voice excited LPC lebih terdengar jelas tetapi
menggunakan total bit yang lebih banyak dibandingkan dengan plain LPC.
Terlihat bahwa untuk mendapatkan kualitas keluaran sinyal yang lebih baik maka dibutuhkan
total bit yang lebih besar.
++++++++++++++++++++
Umumnya LPC digunakan karena menyediakan pemodelan yang baik untuk sinyal suara,
LPC dapat dengan mudah dan langsung diterapkan baik secara perangkat lunak maupun perangkat keras karena perhitungan matematis yang dilibatkan realtif lebih singkat dari metode-metode yang dikenal sebelumnya.
Fast Fourier transform (FFT) menjadi penting untuk bermacam–macam aplikasi, dari pengolahan sinyal digital dan memecahkan persamaan diferensial parsial menjadi algoritma-algoritma untuk penggandaan bilangan integer dalam jumlah yang banyak.
Secara garis besar, cara kerja sistem pengenalan suara ini ialah
+mula-mula sinyal suara manusia yang diterima dengan menggunakan microphone (sinyal analog) dicuplik sehingga menjadi sinyal digital dengan bantuan sound card pada komputer.
+Sinyal digital hasil cuplikan ini terlebih dulu dinormalisasi kemudian diproses awal menggunakan metode LPC sehingga didapat beberapa koefisien LPC yang merupakan feature (ciri) dari suara pembicaraan.
+Kemudian koefisien LPC tersebut diproses dengan Fast Fourier Transform (FFT) untuk mendapatkan sinyal pada domain frekuensi. Hal ini bertujuan agar perbedaan antar pola kata yang satu dengan yang lain terlihat lebih jelas sehingga ekstraksi parameter sinyal memberikan hasil yang lebih baik. Hasil keluaran FFT ini akan di compare sebagai fungsi utama dari sistem untuk proses pengenalan.
LPC melakukan analisis dengan cara memperkirakan formant,
memisahkan formant dari sinyal, yang dinamakan proses inverse filtering,
lalu mengestimasi intensitas dan frekuensi dari sinyal percakapan yang tersisa, yang disebut residue.
Karena sinyal percakapan bervariasi seiring waktu, estimasi tersebut dilakukan untuk setiap potongan kecil dari sinyal, yang dinamakan frame.
Prosedur untuk mendapatkan koefisien LPC diperlihatkan pada gambar dibawah.
1. Preemphasis :
Proses dimana sinyal / speech ucapan sirubah menjadi sinyal
Preemphasis terhadap cuplikan sinyal dengan persamaan preemphasizer:
s (n) = s(n)- as(n -1) atau
s(n) = s(n) – 0.95 s(n − 1)
dengan s(n) adalah sampel ke-n dan harga a yang paling sering digunakan ialah 0.95.
jadi..pada langkah ini dilakukan filtering terhadap sinyal menggunakan FIR filter orde satu untuk meratakan spektral sinyal tersebut. Proses ini mencakup penambahan energi suara pada frekuensi tinggi.
di mana as(n) adalah sinyal yang ditekan, sedangkan s(n) adalah sinyal terdigitasi. Koefisien dengan nilai 0.95 menunjukkan sinyal yang diekstrak merupakan 95 % sinyal aslinya
2. Blocking into frames / Tracking :
Pada langkah ini sinyal ucapan yang telah teremphasis dibagi menjadi beberapa frame (bingkai)
dengan masing-masing frame memuat N sampel sinyal dan frame yang saling yang berdekatan dipisahkan sejauh M sample.
Menyusun sinyal ke dalam bingkai yang lebih pendek. Panjang frame yang membagi setiap
sample menjadi beberapa frame berdasarkan waktu terletak di antara 20 hingga 40 ms . Dengan asumsi bahwa frekuensi suara 18 kHz, maka sampel yang akan diekstrak adalah 0,025 detik * 18.000 Hz = 450 sampel.
3. FrameWindowing :
Windowing (Penjendelaan) merupakan proses pembobotan terhadap setiap frame yang telah dibentuk
pada langkah sebelumnya menggunakan fungsi Window. Ada dua fungsi window yang biasa digunakan, yaitu
Rectangular Window dan Hamming Window.
Fungsi window ini menghasilkan sinyal yang diskontinyu.
Salah satu cara untuk menghindari diskontinyu pada ujung window adalah dengan
meruncingkan sinyal menjadi nol atau dekat dengan nol sehingga dapat mengurangi kesalahan.
Jika definisikan sebuah window w(n) dan sinyal tiap bagian adalah x(n) .
Fungsi Hamming digunakan seperti bentuk jendela dengan mempertimbangkan blok berikutnya dalam rantai pemrosesan ekstraksi fitur dan memadukan semua
garis frekuensi terdekat.
Fungsi Hamming Window didefinisikan sebagai:
Artinya HammingWindow untuk sampel ke-n adalah: W(n) =0.54-0.46 cos (2Ï€n/N-1), 0 ≤ n ≤ N-1
4. Auto Correlation Analisys :
Tiap bagian yang telah diberi window kemudian akan dibentuk autokorelasinya.
Analisis autokorelasi terhadap setiap frame hasil windowing x1 (n) dengan persamaan:
r1(m)=Σ n-1-mn=0 x1(n)x1(n+m)
dengan m dimulai dari 0 dan nilai tertinggi dari m = p adalah orde LPC yang biasa bernilai 8 - 16
5. Analisa LPC :
Langkah berikutnya adalah analisa LPC dimana semua nilai aotukorelasinya yang telah dihitung pada tahap sebelumnya akan diubah menjadi parameter LPC
Mengubah p +1 buah hasil autokorelasi pada masing masing frame menjadi
koefisien LPC am = αm(p)
untuk m = 1,2,..., p dengan persamaan dibawah ini:
E(o)=r(0) (2.5)
km={r(m)-Σm-1j=1αj(m-1)r(|m-j|)/E(m-1), 1 ≤ m ≤ p
αm(m)= km αj(m) = αj(m-1)- km αm-j(m-1), 1 ≤ j ≤ m-1
E(m)=(1- km2) E(m-1)
dengan r(0)adalah hasil autokorelasi,
E(m) adalah error,
km adalah koefisien pantulan,
aj(m) adalah koefisien prediksi untuk 1 ≤ j ≤ m
6. Pengubahan parameter LPC menjadi koefisien cepstral :
Parameter LPC yang sangat penting yang bisa diturunkan dari koefisien LPC adalah koefisien cepstral LPC, c(m).
Mengubah parameter LPC am ke koefisien cepstral cm untuk mendapatkan kinerja yang lebih baik dan tahan terhadap noise,
yaitu dengan persamaan:
cm=am+Σm-1k=1(k/m)ck am-k, 1 ≤ m ≤ p
cm= Σm-1k=1(k/m)ck am-k, m > p
koefisien cepstral ini adalah koefisien dari representasi pada spectrum logaritmis.
clear all;
fs=10000;
[x,fs]=audioread('tes.wav');
xx=length(x)+1;
x(xx)=0;
alpha=0.96;
for i=2:xx
y0(i)=x(i-1);
end
for i=1:xx
y(i) = x(i) - alpha*y0(i);
end
subplot(211)
t=1:xx;
plot(t/fs,y);legend('input');grid
xlabel('waktu (dt)'); ylabel('magnitudo');axis([0 0.7 -0.25 0.25]);
subplot(212)
plot(t/fs,y0); legend('output');grid
xlabel('waktu (dt)'); ylabel('magnitudo'); axis([0 0.7 -1 1.5])
MFCC
Mel frequency Cepstral Coefficient adalah sebuah koefisien audio, dalam beberapa studi menunjukkan bahwa persepsi pendengaran manusia tidaklah dalam skala yang linier dalam bentuk frekuensi melainkan diukur dalam bentuk skala mel-frekuensi.
Sehingga Mel-Scale merupakan skala yang diambil berdasarkan pendekatan terhadap pendengaran manusia. Dimana penggunaannya adalah untuk mengestrak data sinyal suara. Tahapan proses dalam Mel Frequency Cepstral Coefficient adalah;
1. Frame Blocking
Dalam proses frame blocking sinyal suara yang masuk akan diblok menjadi frame frame dengan jumlah N sampel dan jarak antar sampel dengan spasi M dimana M < N. Nilai dari N biasanya adalah 256 dengan spasi M=100
2. Windowing
Proses windowing dilakukan pada setiap frame dengan tujuan untuk meminimumkan diskontinuitas antar dua frame yang adjacent, khususnya pada bagian awal dan akhir.
3. FFT ( Fast Fourier Transform ) Tahapan berikutnya adalah FFT, disini FFT akan mengubah masing-masing frame N sampel dari domain waktu menjadi domain frekuensi.
Pada langkah ini setiap frame hasil dari fungsi window dikenai proses FFT. Fungsi FFT digunakan
untuk mengubah sinyal yang semula merupakan time domain menjadi frequency domain. Langkah ini mengubah tiap frame N sampel dari domain waktu ke dalam domain frekuensi. Dalam pengolahan suara, Transformasi Fourier Cepat berguna untuk mengubah konvolusi getaran celah suara dan respon gelombang saluran suara dalam domain waktu.
4. Wrapping Skala mel-frekuensi adalah frekuensi linier berada dibawah 1000 Hz dan bentuk logaritmik berada diatas 1000 Hz. Pendekatan persamaan untuk mengitung mel dalam frekuensi f ( Hz ) adalah;
Mel ( f ) = 2595 x Log10( 1+ f / 700 )
5. Cepstrum Langkah terakhir adalah mengubah spektrum log-mel menjadi domain waktu. Hasil dari proses inilah yang disebut dengan Mel Frequency Cepstral Coefficient. Representasi cepstral dari spektrum sinyal suara berasal dari sifat spektrum sinyal untuk analisa frame yang ada.
Pada tahap ini dilakukan wrapping terhadap spektrum yang dihasilkan dari FFT sehingga dihasilkan Mel-scale
untuk menyesuaikan resolusi frekuensi terhadap properti pendengaran manusia. Kemudian Mel-scale
dikelompokkan menjadi sejumlah critical bank menggunakan filter bank. Jangkauan frekuensi dalam
spektrum sangatlah luas dan sinyal suara tidak mengikuti skala linear. Sehingga setelah spektrum
terkomputasi, data dipetakan dalam skala Mel menggunakan filter segitiga yang saling tumpang tindih.
Jumat, 10 Agustus 2018
MSGBOX UIWAIT
uiwait(questdlg('Are you sure, you want to stop Realtime?','CloseRequestFunction','Yes','No','Yes'),.2);
f = figure('pos',[30 800 250 150]);
h = uicontrol('Position', [20 20 200 40], 'String', 'Continue', ...
'Callback', 'uiresume(gcbf);close(gcbf)');
disp('This will print immediately');
uiwait(gcf);
disp('This will print after you click Continue');
uiwait(warndlg('You have an anomalous situation here. Click OK to continue'));
uiwait(msgbox('I will wait for you to click OK.'));
t=0:0.1:2*pi;y=sin(t);
plot(t,y)
uiwait(gcf)%
%at this point the program will wait you close the curent figure and the continue
y=cos(t);
plot(t,y)
f = figure('pos',[30 800 250 150]);
h = uicontrol('Position', [20 20 200 40], 'String', 'Continue', ...
'Callback', 'uiresume(gcbf);close(gcbf)');
disp('This will print immediately');
uiwait(gcf);
disp('This will print after you click Continue');
uiwait(warndlg('You have an anomalous situation here. Click OK to continue'));
uiwait(msgbox('I will wait for you to click OK.'));
t=0:0.1:2*pi;y=sin(t);
plot(t,y)
uiwait(gcf)%
%at this point the program will wait you close the curent figure and the continue
y=cos(t);
plot(t,y)
Kamis, 21 Juni 2018
OCR dan JST
businessCard = imread('contoh-gambar-plat-motor.jpg');
ocrResults = ocr(businessCard)
recognizedText = ocrResults.Text;
figure
imshow(businessCard)
text(600, 150, recognizedText,'BackgroundColor', [1 1 1])
Sedang HASIL JST:
I=get(handles.axes1,'Userdata');
g=rgb2gray(I);
ED=im2bw(g);
g=medfilt2(g,[3 3]);
set(handles.figure1,'CurrentAxes',handles.axes4);
imshow(g);
set(handles.axes4,'Userdata',g);
set(handles.figure1,'CurrentAxes',handles.axes8);
imshow(ED);
set(handles.axes8,'Userdata',ED);
%**********************************
conc=strel('disk',1);
gi=imdilate(g,conc);
ge=imerode(g,conc); %%%% morphological image processing
gdiff=imsubtract(gi,ge);
gdiff=mat2gray(gdiff);
whos gdiff
gdiff=conv2(gdiff,[1 1;1 1]);
gdiff=imadjust(gdiff,[0.5 0.7],[0 1],.1);
%B=logical(gdiff);
B=im2bw(gdiff);
[a1 b1]=size(B);
set(handles.figure1,'CurrentAxes',handles.axes5);
imshow(B);
set(handles.axes5,'Userdata',B);
er=imerode(B,strel('line',100,0));
out1=imsubtract(B,er);
F=imfill(out1,'holes'); %%%filling the object
H=bwmorph(F,'thin',1);
H=imerode(H,strel('line',3,90));
set(handles.figure1,'CurrentAxes',handles.axes6);
imshow(H);
set(handles.axes6,'Userdata',H);
%%
final=bwareaopen(H,floor((a1/15)*(b1/15)));
final(1:floor(.9*a1),1:2)=1;
final(a1:-1:(a1-20),b1:-1:(b1-2))=1;
set(handles.figure1,'CurrentAxes',handles.axes7);
imshow(ED);
set(handles.axes7,'Userdata',ED);
Iprops=regionprops(final,'BoundingBox','Image');
hold on
for n=1:size(Iprops,1)
V= rectangle('Position',Iprops(n).BoundingBox,'EdgeColor','g','LineWidth',2);
end
hold off
NR=cat(1,Iprops.BoundingBox)
load net.mat;
load datatarget.mat;
gab=[""];
mat=[];
n=1;
for i=1:size(NR,1)
M=NR(i,:)
A=imcrop(ED,M);
if size(A,2)>10
mat(n,:)=M;
n=n+1;
figure (i) , imshow(A);
Q=getEDmulti(A);
H=sim(net_keluaran,Q');
%%%%%%%%%%%%%%%%%%%%%%%%%
b=0;%0.02;
%T=1x126
hasil='1-3 bmp';
if H < T(1,3)+b
hasil='1-3 bmp/a';
elseif H < T(1,6)+b
hasil='4-6 bmp/b';
elseif H < T(1,9)+b
hasil='7-9 bmp/c';
elseif H < T(1,12)+b
hasil='10-12 bmp/d';
elseif H < T(1,15)+b
hasil='13-15 bmp/e';
elseif H < T(1,18)+b
hasil='16-18 bmp/f';
elseif H < T(1,21)+b
hasil='19-21 bmp/g';
elseif H < T(1,24)+b
hasil='22-24 bmp/h';
elseif H < T(1,27)+b
hasil='25-27 bmp/i';
elseif H < T(1,30)+b
hasil='28-30 bmp/j';
elseif H < T(1,33)+b
hasil='31-33 bmp/k';
elseif H < T(1,36)+b
hasil='34-36 bmp/l';
elseif H < T(1,39)+b
hasil='37-39 bmp/m';
elseif H < T(1,42)+b
hasil='40-42 bmp/n';
elseif H < T(1,45)+b
hasil='43-45 bmp/o';
elseif H < T(1,48)+b
hasil='46-48 bmp/p';
elseif H < T(1,51)+b
hasil='49-51 bmp/q';
elseif H < T(1,54)+b
hasil='52-54 bmp/r';
elseif H < T(1,57)+b
hasil='55-57 bmp/s';
elseif H < T(1,60)+b
hasil='58-60 bmp/t';
elseif H < T(1,63)+b
hasil='61-63 bmp/u';
elseif H < T(1,66)+b
hasil='64-66 bmp/v';
elseif H < T(1,69)+b
hasil='67-69 bmp/w';
elseif H < T(1,72)+b
hasil='70-72 bmp/x';
elseif H < T(1,75)+b
hasil='73-75 bmp/y';
elseif H < T(1,78)+b
hasil='76-78 bmp/z';
elseif H < T(1,81)+b
hasil='79-81 bmp/0';
elseif H < T(1,84)+b
hasil='82-84 bmp/1';
elseif H < T(1,87)+b
hasil='85-87 bmp';
elseif H < T(1,90)+b
hasil='88-90 bmp/2';
elseif H < T(1,93)+b
hasil='91-93 bmp/3';
elseif H < T(1,96)+b
hasil='94-96 bmp/4';
elseif H < T(1,99)+b
hasil='97-99 bmp';
elseif H < T(1,102)+b
hasil='100-102 bmp/5';
elseif H < T(1,105)+b
hasil='103-105 bmp/6';
elseif H < T(1,108)+b
hasil='106-108bmp/7';
elseif H < T(1,111)+b
hasil='109-111 bmp/8';
elseif H < T(1,114)+b
hasil='112-114 bmp/9';
end
gab=[gab num2str(H) '#' hasil ','];
%%%%%%%%%%%%%%%%%%%%%%%%%
end
end
toc
set(handles.edResult,'String',num2str(toc));
set(handles.edProses,'String',gab);
jadinya ...ada yg terbaca dan ada yg tak terbaca tergantung ukuran huruf plat dan ukuran tanggal masa berlakunyaaa....
Silakan teman2 kembangkan yaaaa u atur sensitivitasnyaaaa....
ocrResults = ocr(businessCard)
recognizedText = ocrResults.Text;
figure
imshow(businessCard)
text(600, 150, recognizedText,'BackgroundColor', [1 1 1])
Sedang HASIL JST:
I=get(handles.axes1,'Userdata');
g=rgb2gray(I);
ED=im2bw(g);
g=medfilt2(g,[3 3]);
set(handles.figure1,'CurrentAxes',handles.axes4);
imshow(g);
set(handles.axes4,'Userdata',g);
set(handles.figure1,'CurrentAxes',handles.axes8);
imshow(ED);
set(handles.axes8,'Userdata',ED);
%**********************************
conc=strel('disk',1);
gi=imdilate(g,conc);
ge=imerode(g,conc); %%%% morphological image processing
gdiff=imsubtract(gi,ge);
gdiff=mat2gray(gdiff);
whos gdiff
gdiff=conv2(gdiff,[1 1;1 1]);
gdiff=imadjust(gdiff,[0.5 0.7],[0 1],.1);
%B=logical(gdiff);
B=im2bw(gdiff);
[a1 b1]=size(B);
set(handles.figure1,'CurrentAxes',handles.axes5);
imshow(B);
set(handles.axes5,'Userdata',B);
er=imerode(B,strel('line',100,0));
out1=imsubtract(B,er);
F=imfill(out1,'holes'); %%%filling the object
H=bwmorph(F,'thin',1);
H=imerode(H,strel('line',3,90));
set(handles.figure1,'CurrentAxes',handles.axes6);
imshow(H);
set(handles.axes6,'Userdata',H);
%%
final=bwareaopen(H,floor((a1/15)*(b1/15)));
final(1:floor(.9*a1),1:2)=1;
final(a1:-1:(a1-20),b1:-1:(b1-2))=1;
set(handles.figure1,'CurrentAxes',handles.axes7);
imshow(ED);
set(handles.axes7,'Userdata',ED);
Iprops=regionprops(final,'BoundingBox','Image');
hold on
for n=1:size(Iprops,1)
V= rectangle('Position',Iprops(n).BoundingBox,'EdgeColor','g','LineWidth',2);
end
hold off
NR=cat(1,Iprops.BoundingBox)
load net.mat;
load datatarget.mat;
gab=[""];
mat=[];
n=1;
for i=1:size(NR,1)
M=NR(i,:)
A=imcrop(ED,M);
if size(A,2)>10
mat(n,:)=M;
n=n+1;
figure (i) , imshow(A);
Q=getEDmulti(A);
H=sim(net_keluaran,Q');
%%%%%%%%%%%%%%%%%%%%%%%%%
b=0;%0.02;
%T=1x126
hasil='1-3 bmp';
if H < T(1,3)+b
hasil='1-3 bmp/a';
elseif H < T(1,6)+b
hasil='4-6 bmp/b';
elseif H < T(1,9)+b
hasil='7-9 bmp/c';
elseif H < T(1,12)+b
hasil='10-12 bmp/d';
elseif H < T(1,15)+b
hasil='13-15 bmp/e';
elseif H < T(1,18)+b
hasil='16-18 bmp/f';
elseif H < T(1,21)+b
hasil='19-21 bmp/g';
elseif H < T(1,24)+b
hasil='22-24 bmp/h';
elseif H < T(1,27)+b
hasil='25-27 bmp/i';
elseif H < T(1,30)+b
hasil='28-30 bmp/j';
elseif H < T(1,33)+b
hasil='31-33 bmp/k';
elseif H < T(1,36)+b
hasil='34-36 bmp/l';
elseif H < T(1,39)+b
hasil='37-39 bmp/m';
elseif H < T(1,42)+b
hasil='40-42 bmp/n';
elseif H < T(1,45)+b
hasil='43-45 bmp/o';
elseif H < T(1,48)+b
hasil='46-48 bmp/p';
elseif H < T(1,51)+b
hasil='49-51 bmp/q';
elseif H < T(1,54)+b
hasil='52-54 bmp/r';
elseif H < T(1,57)+b
hasil='55-57 bmp/s';
elseif H < T(1,60)+b
hasil='58-60 bmp/t';
elseif H < T(1,63)+b
hasil='61-63 bmp/u';
elseif H < T(1,66)+b
hasil='64-66 bmp/v';
elseif H < T(1,69)+b
hasil='67-69 bmp/w';
elseif H < T(1,72)+b
hasil='70-72 bmp/x';
elseif H < T(1,75)+b
hasil='73-75 bmp/y';
elseif H < T(1,78)+b
hasil='76-78 bmp/z';
elseif H < T(1,81)+b
hasil='79-81 bmp/0';
elseif H < T(1,84)+b
hasil='82-84 bmp/1';
elseif H < T(1,87)+b
hasil='85-87 bmp';
elseif H < T(1,90)+b
hasil='88-90 bmp/2';
elseif H < T(1,93)+b
hasil='91-93 bmp/3';
elseif H < T(1,96)+b
hasil='94-96 bmp/4';
elseif H < T(1,99)+b
hasil='97-99 bmp';
elseif H < T(1,102)+b
hasil='100-102 bmp/5';
elseif H < T(1,105)+b
hasil='103-105 bmp/6';
elseif H < T(1,108)+b
hasil='106-108bmp/7';
elseif H < T(1,111)+b
hasil='109-111 bmp/8';
elseif H < T(1,114)+b
hasil='112-114 bmp/9';
end
gab=[gab num2str(H) '#' hasil ','];
%%%%%%%%%%%%%%%%%%%%%%%%%
end
end
toc
set(handles.edResult,'String',num2str(toc));
set(handles.edProses,'String',gab);
jadinya ...ada yg terbaca dan ada yg tak terbaca tergantung ukuran huruf plat dan ukuran tanggal masa berlakunyaaa....
Silakan teman2 kembangkan yaaaa u atur sensitivitasnyaaaa....
Kamis, 26 April 2018
Algoritma Genetika Dalam Toolbok
Misalkan kita dikasih rumus matematika:
y=(x-3)^2+10;
Lalu di tanyakan:
Berapakah nilai x agar menghasilkan nilai keluaran minimum? dengan range antara 0 s/d 20..
Tentu kita akan coba2 dan memasukkan semua angka range tersebut....dan didapat hasil yg minimum saat x=3.
Nah disinilah kita perlunya Genetika u optimasi.....
caanya sbb:
1.buat fungsi dan simpan ke suatu folder, misal sebagai berikut:
function [ y] = myRumus( x)
y=(x-3)^2+10;
end
2.pada CLI Matlab ketik : optimtool, lalu konfigurasi fform sbb:
atau bisa juga mengetikkan: optimtool(‘ga’)
Terahir klik start dan amati hasilnya:
Persamaan di atas akan menghasilkan nilai minimum saat x bernilai : 3
dengn hasil y/Objective function value: 10.000000000441915;
dari grafik bisa dipahami bahwa pada iterasi ke 3, hasil sudah rendah dan saat loop berikutnyapun hasilnya tidak berubah......sehingga iterasi 3 melakukan penguncian atau Elitisme nilai terendahnya.
Oh mudah yaaaaaaaaaaaaaaaaaaaa....
y=(x-3)^2+10;
Lalu di tanyakan:
Berapakah nilai x agar menghasilkan nilai keluaran minimum? dengan range antara 0 s/d 20..
Tentu kita akan coba2 dan memasukkan semua angka range tersebut....dan didapat hasil yg minimum saat x=3.
Nah disinilah kita perlunya Genetika u optimasi.....
caanya sbb:
1.buat fungsi dan simpan ke suatu folder, misal sebagai berikut:
function [ y] = myRumus( x)
y=(x-3)^2+10;
end
2.pada CLI Matlab ketik : optimtool, lalu konfigurasi fform sbb:
atau bisa juga mengetikkan: optimtool(‘ga’)
Terahir klik start dan amati hasilnya:
Persamaan di atas akan menghasilkan nilai minimum saat x bernilai : 3
dengn hasil y/Objective function value: 10.000000000441915;
dari grafik bisa dipahami bahwa pada iterasi ke 3, hasil sudah rendah dan saat loop berikutnyapun hasilnya tidak berubah......sehingga iterasi 3 melakukan penguncian atau Elitisme nilai terendahnya.
Oh mudah yaaaaaaaaaaaaaaaaaaaa....
Langganan:
Postingan (Atom)