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"');



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:
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.
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:
  1. Multiply each frame by a Hamming window to increase its continuity at the first and last points.
  2. Take a frame of a variable size such that it always contains a integer multiple number of the fundamental periods of the speech signal.
The second strategy encounters difficulty in practice since the identification of the fundamental period is not a trivial problem. Moreover, unvoiced sounds do not have a fundamental period at all. Consequently, we usually adopt the first strategy to mutiply the frame by a Hamming window before performing FFT. The following example shows the effect of multiplying a Hamming window.


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');


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)
%%     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) .




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)