Slide Transformasi dan Load Data Menggunakan Talend Open Studio
Buku speech processing_subp_pengkodean-sinyal-wicara-b
1. PraktikumPengkodean Sinyal Wicara
1
Pengolahan Informasi Wicara
Bab: Pengkodean Sinyal Wicara
Sub: Kegiatan Pembelajaran di Lab Menyusun Model Pengkodean Sinyal Wicara
Pada kegiatan di laboratorium ini kita akan melakukan proses pengkodean sinyal wicara
menggunakan standar pengolahan sinyal wicara yang memenuhi persyaratan Linear dan Time
Invariant seperti yang telah dibicarakan di dalam teori pada Bab xxx. Untuk melakukan proses
secara keseluruhan akan memakan waktu, untuk itu perlu dilakukan penyederhanaan dengan
melakukan simulasi tanpa harus mengorbankan pemahaman pada konsep system yang
sesungguhnya.
Ada dua model pengkodean sinyal wicara yang kita buat pada kegiatan lab ini, yaitu berbasis
Linear Predictive Code (LPC) untuk pengkodean atau kompresi, berbasis model Discrete
Cosines Transform (DCT), dan pengkodean CELP yang merupakan pengembangan dari bentuk
LPC pada sistem yang sudah diaplikasikan pada sistem celullar.
P.1.1. Model Pengkodean Sinyal Wicara dengan LPC
Menyusun Model Pengkodean LPC
Pemodelan dimulai dengan mengacu pada diagram blok pada Gambar 1 berikut. Pada gambar
sudah jelas langkah-langkah apa yang seharusnya dilakukan.
Sinyal
Wicara
Sampling
Frame
Blocking
Windowing
LPC
Encoder
LPC
Decoding
Reshape
Frame
Sinyal Wicara
Recovery
Hitung
Error
Pengiriman,
penyimpanan,
dsb
Gambar 1. Diagram blok model LPC coding.
2. PraktikumPengkodean Sinyal Wicara
2
Agar anda dapat menjalankan pemodelan ini, akan lebih baik jika anda memulai dengan melihat
cara kerja dari fungsi lpc.m yang ada di Matlab. Caranya adalah dengan memanfaatkan fasilitas
help. Anda ketikkan “help lpc”, tekan enter.
lpc Linear PredictorCoefficients.
A = lpc(X,N) finds the coefficients, A=[ 1 A(2) ... A(N+1) ], of an
Nthorder forward linear predictor.
Xp(n) = -A(2)*X(n-1) - A(3)*X(n-2) - ... - A(N+1)*X(n-N)
such that the sum of the squares of the errors
err(n) = X(n) - Xp(n) is minimized. X can be a vector or a matrix. If X
is a matrix containing a separate signal in each column, lpc returns a
model estimate for each column in the rows of A. N specifies the order of
the polynomial A(z) which must be a positive integer. N must be less or
equal to the length of X. If X is a matrix, N must be less or equal to
the length of each column of X.
If you do not specify a value for N, lpc uses a default
N =length(X)-1.
[A,E] = lpc(X,N) returns the variance (power) of the prediction error.
lpc uses the Levinson-Durbin recursion to solve the normal equations that
arise from the least-squares formulation. This computation of the linear
prediction coefficients is often referred to as the autocorrelation
method.
% Example:
% Estimate a data series using a third-order forward predictor, and
% compare to the original signal.
% Create signal data as the output of an autoregressive process
% driven by white noise. Use the last 4096 samples of the AR process
% output to avoid start-up transients:
randn('state',0);
noise = randn(50000,1); % Normalized white Gaussian noise
x = filter(1,[1 1/2 1/3 1/4],noise);
x = x(45904:50000);
a = lpc(x,3);
Langkah Pemrograman LPC Coding
Pemodelan dapat disusun dengan pembuatan program sbb:
1. Lakukan proses pengambilan sinyal wicara dari file yang sudah anda buat tsb, dan
gambarkan hasilnya. Untuk menyesuaikan dengan standar pengolahan wicara, anda
lakukan proses resampling. Tetapi jika anda merasa tidak terlalu urgent, anda dapat
melakukannya tanpa proses resample. Karena file yang anda ambil terdiri dari 2 kolom
(berbentuk matrix), maka anda cukup ambil salah satu kolom saja, agar proses bisa berjalan
dengan benar.
[y,Fs]=wavread('file_a.wav');
x0=y(:,1);
3. PraktikumPengkodean Sinyal Wicara
3
2. Agar anda dapat mengetahui kondisi asli dari sinyal wicara yang akan anda gunakan, akan
sebagai objek percobaan, maka tampilkan sinyal asli tsb.
N=320;
figure();
plot(x0);
Gambar 2. Sinyal file_a.wav
3. Dari gambar tersebut anda dapat memilih sampel ke 3201 sampai 3600 untuk diamati.
Karena anda sudah menetapkan satu frame berukuran N=320, maka anda dapat menyusun
program sbb:
x = filter(1,[1 1/2 1/3 1/4],x0);
x_LPC = x0(10*N+1:12*N);
a=lpc(x_LPC,6);
Anda dapat memiliki nilai N yang lain, jika ukuran frame anda berubah sesuai dengan
Frekuensi sampling yang anda pilih, atau bisa juga anda menentukan posisi sampel berbeda
dengan nilai tersebut di atas, asalkan pilihan anda tepat pada sinyal wicara yang masih
merepresentasikan ‘vokal a’.
4. Lanjutkan dengan memanfaatkan filter digital IIR sederhana, seperti telah ditetapkan nilainya
melalui variable ‘x’ di atas untuk melakukan pemulihan sinyal wicara pada frame tersebut.
0 0.5 1 1.5 2 2.5 3 3.5
x 10
4
-0.4
-0.3
-0.2
-0.1
0
0.1
0.2
0.3
0.4
4. PraktikumPengkodean Sinyal Wicara
4
est_x = filter([0 -a(2:end)],1,x); % Estimated signal
e = x - est_x; % Prediction error
[acs,lags] = xcorr(e,'coeff'); % ACS of prediction error
5. Jika tidak terjadi kesalahan pada program anda, coba tampilkan pembentukan frame sinyal
asli 2 frame, dengan sinyal hasil pemulihan yang telah dibuat. Dan anda dapat juga
menampilkan error estimasi dari perbedaan sampel sinyal asli dengan sinyal pemulihan.
figure();
%Compare the predicted signal to the original signal
plot(10*N+1:12*N,x(10*N+1:12*N),10*N+1:12*N,est_x(10*N+1:12*N),'r--
',10*N+1:12*N,e(10*N+1:12*N),'k--');
title('Original Signal vs. lpc Estimate');
xlabel('Sample Number'); ylabel('Amplitude'); grid;
legend('Original Signal','lpc Estimate')
Gambar 3. Perbandingan sinyal asli, hasil rekonstruksi dan error estimasi
6. Anda juga bisa melihat korelasi dari kesalahan prediksi yang terjadi. Tetapi bagian terakhir
ini sifatnya hanya pilihan.
%Look at the autocorrelation of the prediction error.
figure; plot(lags,acs);
title('Autocorrelation of the Prediction Error');
xlabel('Lags'); ylabel('Normalized Value'); grid;
3200 3300 3400 3500 3600 3700 3800 3900
-0.2
-0.15
-0.1
-0.05
0
0.05
0.1
0.15
Original Signal vs. lpc Estimate
Sample Number
Amplitude
Original Signal
lpc Estimate
5. PraktikumPengkodean Sinyal Wicara
5
7. Coba anda lakukan langkah 1 s/d 5 untuk jenis file suara (vocal yang lain)
P.1.2. Menyusun Model Pengkodean LPC untuk satu Sinyal Penuh
1. Langkah 1 sama dengan pada P.1.1, diawali dengan pengambilan data dan proses resampling.
%File Name:LPC_Code_Est_02.m
%dari Mathwork, 28 Maret 2020, sudah masuk akal...
%Untuk seluruh file
close all; clear all;clc;
[y,Fs]=wavread('file_a.wav');
y10=y(:,1);
%Proses resampling:
%------------------
fs1=16000;
y1r=resample(y10,fs1,Fs);
2. Atur agar panjang sampel adalah kelipatan dari ukuran satu frame sinyal, dalam hal ini
kelipatan dari 320 (0,02*fs1). Kemudian lakukan pembentukan frame dengan memanfaatkan
fungsi reshape.m.
%Pembentukan Frame
%------------------
N=0.02*fs1;
NN=floor(length(y1r)/N);
y1=y1r(1:NN*N);
y1_reshape=reshape(y1,N,NN);
x=y1_reshape;
3. Proses pengkodean LPC melibatkan perubahan sinyal sebelum diproses, dan dilakukan pada
setiap frame.
[m,n]=size(x);
for i=1:n,
x1(:,i) = x(:,i);
x2(:,i) = filter(1,[1 1/2 1/3 1/4],x1(:,i));
end
%Compute the predictor coefficients and the estimated signal.
a=lpc(x2,3);
4. Lakukan pemulihan ulang sinyal terkode LPC, dan hitung perbedaan antara sinyal pemulihan
dibanding sinyal asalnya.
%Estimated Signal at the receiver part:
%-------------------------------------
for j=1:n,
y_est(:,j)= filter([0 -a(j,2:end)],1,x2(:,j));
y_salah(:,j)=x2(:,j)-y_est(:,j);
end
6. PraktikumPengkodean Sinyal Wicara
6
5. Bandingkan bentuk sinyal asli dan sinyal estimasi hasil pemulihan dalam domain waktu
x2_filter=reshape(x2,N*NN,[]);
y1_recover=reshape(y_est,N*NN,[]);
y_salah_r=reshape(y_salah,N*NN,[]);
figure(1);
t=1:NN*N;
plot(t,x2_filter,'r',t,y1_recover,'g',t,y_salah_r,'k');
6. Bandingkan bentuk sinyal asli dan sinyal estimasi hasil pemulihan dalam domain frekuensi
%perbandingan domain frekuensi
%-----------------------------
figure();
pwelch(x2_filter,[],[],[],fs1,'onesided');title('PSD Estimate Sinyal
Asli')
figure();
pwelch(y1_recover,[],[],[],fs1,'onesided');title('PSD Estimate Sinyal
Recover')
P.1.3. Menyusun Model Pengkodean DCT
Menyusun Model Pengkodean
Pemodelan dimulai dengan mengacu pada diagram blok pada Gambar 4 berikut. Pada gambar
sudah jelas langkah-langkah apa yang seharusnya dilakukan.
Sinyal
Wicara
Sampling
Frame
Blocking
Windowing
DCT
Encoder
DCT
Decoder
Reshape
Frame
Sinyal Wicara
Recovery
Hitung
Error
Pengiriman,
penyimpanan,
dsb
Gambar 4. Diagram blok penyusunan pengkodean dengan DCT
Anda dapat memanfaatkan fungsi dct dan fungsi idct yang ada di Matlab. Untuk itu anda perlu
memahami cara kerja kedua fungsi tersebut.
dct Discrete cosine transform.
Y = dct(X) returns the discrete cosine transform of X.
The vector Y is the same size as X and contains the discrete cosine
transform coefficients.
7. PraktikumPengkodean Sinyal Wicara
7
Y = dct(X,N) pads or truncates the vector X to length N before
transforming.
If X is a matrix, the dct operation is applied to each column. This
transform can be inverted using IDCT.
% Example:
% Find how many dct coefficients represent 99% of the energy
% in a sequence.
x = (1:100) + 50*cos((1:100)*2*pi/40); % Input Signal
X = dct(x); % Discrete cosine transform
[XX,ind] = sort(abs(X)); ind = fliplr(ind);
num_coeff = 1;
while (norm([X(ind(1:num_coeff)) zeros(1,100-num_coeff)])/norm(X)<.99)
num_coeff = num_coeff + 1;
end;
num_coeff
idct Inverse discrete cosine transform.
X = idct(Y) inverts the DCT transform, returning the original vector if
Y was obtained using Y = DCT(X).
X = idct(Y,N) pads or truncates the vector Y to length N before
transforming.
If Y is a matrix, the idct operation is applied to each column.
% Example:
% Generate a 25 Hz sinusoidal sequence, sampled at 1000 Hz and
% compute the DCT of this sequence and reconstruct the signal using
% only those components with value greater than 0.1 (64 of the
% original 1000 DCT coefficients.
t = (0:1/999:1); % Time vector
x = sin(2*pi*25*t); % Sinusoid
y = dct(x); % Compute DCT
y2 = find(abs(y) < 0.9); % Use 17 coefficients
y(y2) = zeros(size(y2)); % Zero out points < 0.9
z = idct(y); % Reconstruct signal w/inverse DCT
Langkah Pemrograman DCT Coding
Pemodelan dapat disusun dengan pembuatan program sbb:
1. Lakukan proses pengambilan sinyal wicara dari file yang sudah anda buat tsb, dan
gambarkan hasilnya. Karena file yang anda ambil terdiri dari 2 kolom (berbentuk matrix),
maka anda cukup ambil salah satu kolom saja, agar proses bisa berjalan dengan benar.
%File Name: DCT_01.m
%Contoh program DCT 1 dimensi (untuk sinyal suara,dsb.)
clear al;clc;close all;
[y,Fs]=wavread('file_a.wav');
y1_0=y(:,1);
fs1=16000;
y1=resample(y1_0,fs1,Fs);
8. PraktikumPengkodean Sinyal Wicara
8
2. Pilih satu frame dari sinyal wicara tersebut, misal frame ke-3, hal ini ditujukan untuk
mendapatkan gambaran sinyal dalam durasi pendek yang memenuhi persyaratan linear dan
time invariant, LTI). Anda dapat memilih ukuran frame yang lain, jika ukuran frame anda
berubah sesuai dengan Frekuensi sampling yang anda pilih, atau bisa juga anda menentukan
posisi sampel berbeda dengan nilai tersebut di atas, asalkan pilihan anda tepat pada sinyal
wicara yang masih merepresentasikan ‘vokal a’.
i=3;%Frame ke-i
x=y1(0.02*fs1*(i-1)+1:0.02*fs1*i);%Frame ke-i
Gambar 5. Sinyal suara dari ‘file_a.wav’
3. Dapatkan koefisien-koefisien DCT, atau bentuk pengkodean dari ‘file_a’ menjadi terkode
DCT.
%x = (1:100) + 50*cos((1:100)*2*pi/40);
X_dct = dct(x);
Luaran dari langkah ini adalah suatu hasil pengkodean sinyal wicara dalam kondisi
terkompresi/terkode dengan DCT. Anda bisa mengamati bentuk sinyal hasil pengkodean
dengan menampilkan grafik dari variable terkait, dalam hal ini adalah X_dct.
0 0.5 1 1.5 2 2.5 3 3.5
x 10
4
-0.4
-0.3
-0.2
-0.1
0
0.1
0.2
0.3
0.4
9. PraktikumPengkodean Sinyal Wicara
9
4. Pada langkah ini anda dapat melakukan proses pemulihan (recovery) dengan memanfaatkan
fungsi idct seperti pada cuplikan program berikut. Dan coba lakukan evaluasi untuk
mengamati perbedaan hasil recovery dengan sinyal aslinya.
%Reconstruct the signal and compare it to the original signal.
x_rec = idct(X_dct);
%Perbedaan asli dan rekonstruksi
x_dif = x - x_rec;
5. Tampilkan bentuk sinyal asli pada frame yang diamati, bandingkan dengan sinyal hasil
recovery (pemulihan), dan lihat error atau beda nilai antara sinyal asli dengan sinyal
recovery.
%Penggambaran
t=1:length(x);
figure();plot(t,x,'k',t,x_rec,'r--',t,x_dif,'b');
legend('Original',['Reconstructed, N = '
int2str(needed)],'Beda','Location','SouthEast');
Gambar 6. Sinyal suara dari ‘file_a.wav’, frame ke-3 dalam versi asli,
recovery dengan DCT, dan nilai error
6. Bandingkan bentuk spectral sinyal asli dengan sinyal hasil rekonstruksi, memanfaatkan
fungsi ‘periodogram.m’ atau ‘pwelch.m’
figure();
pwelch(x,[],[],[],fs1,'onesided');title('PSD Estimate Sinyal Asli')
600 650 700 750 800 850 900 950 1000
-0.1
-0.08
-0.06
-0.04
-0.02
0
0.02
0.04
0.06
0.08
0.1
Original
Reconstructed, N = 14
Beda
10. PraktikumPengkodean Sinyal Wicara
10
figure();
pwelch(x_rec,[],[],[],fs1,'onesided');title('PSD Estimate Sinyal
Recover')
P.1.4. Menyusun Model DCT Code untuk Satu Sinyal Penuh
7. Langkah 1 sama dengan pada P.1.3, diawali dengan pengambilan data dan proses resampling.
%Contoh program DCT 1 dimensi (untuk sinyal suara,dsb.)
%Untuk seluruh Sinyal
clear al;clc;close all;
fs1=16000;
[y,fs]=wavread('file_a.wav');
%================
%bagian pemancar:
%----------------
y10=y(:,1);
N=0.02*fs1;
y1r=resample(y10,fs1,fs);
8. Atur agar panjang sampel adalah kelipatan dari ukuran satu frame sinyal, dalam hal ini
kelipatan dari 320 (0,02*fs1). Kemudian lakukan pembentukan frame dengan memanfaatkan
fungsi reshape.m.
NN=floor(length(y1r)/N);
y1=y1r(1:NN*N);
y1_reshape=reshape(y1,N,NN);
x=y1_reshape;
9. Lakukan proses dct pada keseluruhan data yang sudah dalam bentuk frame
X_dct = dct(x);
10. Kembalikan data terkoding DCT menjadi nilai aslinya, dan lanjutkan dengan
menggabungkan kembali frame-frame sinyal menjadi satu sinyal utuh.
x1=idct(X_dct);
%================
%bagian penerima:
%----------------
y1_recover=reshape(x1,N*NN,[]);
11. Coba amati bagaimana perbandingan bentuk sinyal dalam domain waktu dan domain
frekuensi.
%perbandingan domain waktu
%-------------------------
t=1:length(y1);
figure();
subplot(211);plot(t,y1,'b');xlabel('Sinyal Asli');
11. PraktikumPengkodean Sinyal Wicara
11
subplot(212);plot(t,y1_recover,'r');xlabel('Sinyal Recovery');
title('Perbandingan Input - Output dg DCT');
%perbandingan domain frekuensi
%-----------------------------
figure();
pwelch(y1,[],[],[],fs1,'onesided');title('PSD Estimate Sinyal Asli')
figure();
pwelch(y1_recover,[],[],[],fs1,'onesided');title('PSD Estimate Sinyal
Recover')
P.1.5. Model Pengkodean Sinyal Wicara dengan CELP
Menyusun Model Pengkodean CELP
Untuk melakukan penyusunan model pengkodean CELP anda harus memiliki file-file
pendukung berikut ini: celpana.m, celpexit.m, celpsyn.m, durbin.m, lpcana.m, lpxcrespith.m,
lpcweight.m, rf2lpc.m, celp16k.m, celp9600.m, dan file suara file_a.wav, handel.wav, atau file
wav lainnya. Jika anda kesulitan untuk mendapatkan file-file tersebut, coba konsultasikan kepada
dosen pengampu. Selanjutnya langkah pemodelan dilakukan sebagai berikut.
1. Langkah 1 sama dengan pada P.1.3, diawali dengan pengambilan data dan proses resampling.
%File Name: CELP_RUN.m
% The script to run the CELP codecs: 16 kbps CELP & 9.6 kbps CELP
clc;clear all;close all;
% %coba dengan model baru, berawal dari sini...
[x0,Fs] = wavread('file_a.wav');
x10 = x0(:,1);
%Proses resampling:
fs1 = 8000;
y1r = resample(x10,fs1,Fs);
2. Tetapkan variable-variabel untuk pembentukan frame, dsb.
% Taking the input data from speech file
x = y1r;
N = 160; % Frame length
L = 40; % Sub-frame length
M = 12; % Order of LP analysis
c = 0.85; % constant parameter for perceptual weighted filter
Pidx = [16 160];
3. Masukkan data ke CELP analysis-by-synthesis untuk menghasilkan suatu Gaussian
codebook
% Entering into the CELP analysis-by-synthesis codec
% creating the Gaussian codebook
randn('state',0);
12. PraktikumPengkodean Sinyal Wicara
12
cb = randn(L,1024);
% invoking the CELP codecs
[xhat1, e, k, theta0, P, b] = celp9600(x,N,L,M,c,cb,Pidx);
[xhat2, e, k, theta0, P, b] = celp16k(x,N,L,M,c,cb,Pidx);
4. Cek hasil pengkodean dengan memanfaatkan wavplay. Pada beberapa versi Matlab terbaru
wavplay akan digantikan dengan fungsi lain.
% playing all the sound files
tunda=zeros(8000,1);
for i = 1:3,
if(i==1),
display('Playing the original sound file...');
wavplay(x,8000);
elseif(i==2),
display('Playing the 16 kbps CELP generated sound file...');
wavplay(tunda,8000);
wavplay(xhat1,8000);
elseif(i==3),
display('Playing the 9.6 kbps CELP generated sound file...');
wavplay(tunda,8000);
wavplay(xhat2,8000);
end
end
5. Gambarkan hasilnya dalam bentuk perbandingan beberapa frame gambar menjadi satu, atau
setiap hasil pengkodean dengan yang asli
% plotting all the speech profiles
figure(1)
subplot(3,1,1)
plot(x)
axis([0 length(x) min(x) max(x)]);
%axis([0 7*10^4 -1 1]);
xlabel('time'); ylabel('Amplitude');
title('The original speech samples');
subplot(3,1,2)
plot(xhat1,'m')
axis([0 length(xhat1) min(xhat1) max(xhat1)]);
%axis([0 7*10^4 -1 1]);
xlabel('time'); ylabel('Amplitude');
title('The CELP 16 kbps synthetic samples');
subplot(3,1,3)
plot(xhat2,'c')
axis([0 length(xhat2) min(xhat2) max(xhat2)]);
%axis([0 7*10^4 -1 1]);
xlabel('time'); ylabel('Amplitude');
title('The CELP 9.6 kbps synthetic samples');
% comparing all the synthetic speech profiles with original speech
kk=1:length(x);
figure(2)
%plot([x xhat1]);
plot(kk,x,'b',kk,xhat1,'r')
13. PraktikumPengkodean Sinyal Wicara
13
axis([0 length(x) min(x)-.1 max(x)+.1]);
legend('original speech','16 kbps CELP speech');
xlabel('time'); ylabel('Amplitude');
title('The comparison of original speech & 16 kbps CELP synthetic
samples');
figure(3)
%plot([x xhat2]);
plot(kk,x,'b',kk,xhat2,'r')
axis([0 length(x) min(x)-.1 max(x)+.1]);
%axis([0 7*10^4 -1 1]);
legend('original speech','9.6 kbps CELP speech');
xlabel('time'); ylabel('Amplitude');
title('The comparison of original speech & 9.6 kbps CELP synthetic
samples');
Gambar 7. Perbanding sinyal versi asli file_a.wav dengan hasil coding-by-synthesis CELP.
6. Anda lakukan pengamatan dalam domain frekuensi dengan memanfaatkan fungsi
periodogram.m atau pwelch.m. Dan berikan penjelasan secukupnya dari gambar-gambar
yang telah anda peroleh, sejauh mana pengaruh pengkodean dan synthesa dibandingkan
dengan sinyal aslinya.
0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000
-0.2
0
0.2
time
Amplitude
The original speech samples
0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000
-0.2
0
0.2
time
Amplitude
The CELP 16 kbps synthetic samples
0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000
-0.2
0
0.2
time
Amplitude
The CELP 9.6 kbps synthetic samples