2. 1 Postavka problema
U prostoriji se nalaze dva zvučna izvora (zvučnika) i mikrofonski niz sa 24 mikrofona. Geometrija i izgled
mikrofonskog niza prikazani su na slici 1. Skica eksperimentalne postavke data je na slici 2. Sa jednog izvora
emituje se MLS sekvenca, a sa drugog zvučnika beli šum. Signal koji se snima sa mikrofonskog niza ima 24
nezavisna kanala. Potrebno je dizajnirati adaptivni beamformer tako da se na izlazu beamformera dobija
signal sa jednog od zvučnika (ulaz u beamformer je signal sa mikrofonskog niza). Postupak ponoviti i za
drugi zvučnik.
Slika 1: Geometrija mikrofonskog niza i njegov fizički izgled
Slika 2: Skica merenja
Nakon toga na ulaz kreiranih beamformera dovesti signal sa mikrofonskog niza i analizirati da li beamformer
može da razdvoji signale u ovom slučaju. Pored objektivnih provera sličnosti originalnih signala i signala na
izlazu beamformera koristiti i subjektivne metode, odnosno slušanje.
Strana 2 of 14
3. 2 Uvod
2.1 Gradijentni algoritam
Važan rezultat teorije Vinerovog filtra je da je funkcija greške J(w) konveksni paraboloid sa jedinstvenim
minimumom. Ovaj karakteristični oblik funkcije greške može da se iskoristi da bi se do minimuma funkcije
greške došlo rekurzivno, umesto putem direktnog rešavanja normalnog sistema jednačina, a u cilju eliminisanja
potrebe za invertovanjem autokorelacione matrice R. Pošto je funkcija greške konveksni paraboloid, do
minimuma se može doći polazeći iz bilo koje tačke, ako se korak po korak ide nizbrdo. Pošto je funkcija greške
konveksni paraboloid, do minimuma se moe doći polazeći iz bilo koje tačke, ako se ide korak po korak ide ka
tački minimuma.
Slika 3: Funkcija greške gradijentnog algoritma
2.2 LMS algoritam
Gradijentni algoritam obezbedjuje stabilnu i determinističku konvergenciju koeficijenata adaptivnog filtra ka
optimalnim vrednostima, čime omogućava da se do optimalnih vrednosti koeficijenata dodje bez potrebe da
se invertuje autokorelaciona matrica - pod uslovom da poznajemo autokorelacionu funkciju ulaznog signala i
unakrsnu korelaciju ulaznog i aproksimiranog signala.
Ove veličine su neophodne da bi se izračunala tekuća vrednost gradijenta funkcije greške u svakoj iteraciji.
Ako ne raspolažemo ovim veličinama, moramo da u svakoj iteraciji izvršimo procenu gradijenta. Widrow i
Hoff su 1960. godine predložili jednostavan način da se ovaj gradijent proceni.
Njihova modifikacija gradijentnog algoritma, nazvana Least Mean Square (LMS) kao glavnu odliku ima
izuzetnu jednostavnost. Upravo zahvaljujui jednostavnosti, ovaj algoritam se veoma mnogo koristi u praksi.
LMS algoritam se oslanja na definiciju načina na koji se izraunavaju nove vrednosti koeficijenata adaptivnog
transverzalnog filtra u gradijentnom algoritmu.
Rekurzivna relacija LMS algoritma (adaptaciono pravilo) je w (n + 1) = w (n) + 1
2 µ (−∇ (n)).
Strana 3 of 14
4. 3 Adaptivni Beamformer
3.1 Treniranje koeficijenata filtra
Grane odgovaraju mikrofonima. U svakoj grani se koeficijent množe signalima sa mikrofona. Ti signali se
sabiraju i dovode nea ulaz adaptivnog algoritma.
Slika 4: Širokopojasni Beamforming
y(n) = w∗
x(n + 1)
e(n) = y(n) − d(n)
w(n + 1) = w(n) − 2µx(n + 1)e(n)
MSE(n) = E[|e(n)|2
]
3.2 Filtriranje signala sa željenog zvučnika
Sada se sa zvučnika puštaju violina i govor. Signali sa mikrofona se samo propuštaju kroz istrenirani filtar iz
prethodnog koraka.
Strana 4 of 14
5. 3.3 Matrično pakovanje koeficijenata
Posmatra se n-ta iteracija, n = L, . . . , N.
Koeficijenti filtra: w = [w1 · · · wKL]
T
W =
w1 · · · wL
w2 · · · w2L
.
.
.
.
.
.
...
wKL−L+1 · · · wKL
(1)
Ulazni signal: x = [x1 · · · xKL]
T
X =
x1 · · · xL
x2 · · · x2L
.
.
.
.
.
.
...
xKL−L+1 · · · xKL
(2)
Svaka kolona ovih matrica odgovara jednom mikrofonu grani beamformera.
Konvolucija po formuli: y(n) = w∗
x(n + 1)
Konvolucija preko proizvoda matrica: y(n) je zbir svih elemenata matrice WH
X.
Slika 5: Matrični raspored koeficijenata
Strana 5 of 14
6. 4 Poboljšanje adaptacije koristeći Hlibertovu transformaciju
Ulazni i referentni signali su realni. Hilbertovom transformacijom oni postaju analitički.
Frekvencijski odziv Hilbertovog transformatora je oblika H(ejw
) =
(
−j 0 ≤ ω < π
j −π ≤ ω < 0
.
Impulsni odziv Hilbertovog transformatora je oblika h(n) =
(1−cos(nπ)
nπ n 6= 0
0 n = 0
=
2sin2
(nπ
2 )
nπ n 6= 0
0 n = 0
.
Strana 6 of 14
7. 5 MATLAB simulacija
Kod 1.
clc;
close all;
clear all;
5 %pkg load signal;
%% ucitavanje signala
% emitovani signali sa levog i desnog izvora
10 [mls_sekvenca,Fs1] = audioread(’mls_sekvenca.wav’);
[beli_sum,Fs2] = audioread(’beli_sum.wav’);
% snimnjen signal
[niz_mls_sum,Fs4] = audioread(’mikrofonski_niz_MLS_beli_sum.wav’);
15
% signal na kom testiramo nas beamformer
[niz_violona_govor,Fs5] = audioread(’mikrofonski_niz_violina_govor.wav’);
% signal za kalibraciju
20 %[kalibracija,Fs6] = audioread(’kalibracija.wav’);
%% kalibracija signala
% rms_kalibracija=rms(kalibracija);
25 % rms_niz_mls_sum=rms(niz_mls_sum);
% max1=max(rms_niz_mls_sum);
%
% rms_niz_mls_sum_normalizovano=niz_mls_sum./max1;
% niz_mls_sum_kalibrisan=rms_niz_mls_sum_normalizovano(1:end,1:end).*rms_kalibracija(1:end);
30 % rms_niz_mls_sum_kalibrisan=rms(niz_mls_sum_kalibrisan);
%% parametri
L=24; % broj grana
K=360; % broj koeficijenata u svakoj grani
35 N=40000; % duzina signala
mu=1.5;
% definisanje nizova i matrica
W=zeros(K,L); % matrica koeficijenata u beamformer-u
40 X=zeros(K,L); % matrica odbiraka signala u beamformer-u
d=mls_sekvenca(1:N); % referentni signal ako se izdvaja violina
%d=beli_sum(1:N); % referentni signal ako se izdvaja govor
d=hilbert(d);
45 ulazni=niz_mls_sum(1:N,:); % da su istih duzina
ulazni=hilbert(ulazni);
% ulazni=hilbert(ulazni);
y=zeros(N,1); % zbirni signal
50 e=zeros(N,1); % signal greske
Strana 7 of 14
8. %% algoritam
for n=(K+1):N
55 for l=1:L
for k=K:-1:2
X(k,l)=X(k-1,l);
end
end
60
for l=1:L
X(1,l)=ulazni(n,l);
end
65 odziv_po_granama=((W)).*X;
y(n)=sum(sum(odziv_po_granama));
e(n)=y(n)-d(n);
for l=1:L
70 for k=1:K
W(k,l)=W(k,l)-2*mu*(conj(X(k,l))*e(n));
end
end
i f mod(n,1000)==0
75 n
end
end
%% grafik greske
80
MSE=(abs(e)).ˆ2;
fs=Fs1;
figure ,plot((K+1):N,MSE((K+1):N));
set(gca,’FontSize’,15)
85 xlabel(’Redni broj odbirka’);
ylabel(’Vrednost greske - MSE’);
y_real=real(y);
y_real_n=y_real./(max(abs(y_real)));
90
figure ,plot((N-8000:N-7880)/fs,mls_sekvenca(N-8000:N-7880),’LineWidth’,1);
hold on
plot((N-8000:N-7880)/fs,y_real_n(N-8000:N-7880),’LineWidth’,2);
ylim([-1.35 1.35]);
95 xlabel(’itt[s]’);
ylabel(’Normalizovana amplituda’);
legend({’originalna sekvenca’,’filtriran signal’});
set(gca,’FontSize’,15)
100
%% violina
% kalibracija signala
%
Strana 8 of 14
9. 105 % rms_kalibracija=rms(kalibracija);
% rms_niz_violona_govor=rms(niz_violona_govor);
% max1=max(rms_niz_violona_govor);
%
% rms_niz_violona_govor_normalizovano=niz_violona_govor./max1;
110 % niz_violona_govor_kalibrisan=rms_niz_violona_govor_normalizovano(1:end,1:end).*rms_kalibracija(1:en
% algoritam
115 N=363320;
ulazni2=niz_violona_govor(1:N,:);
ulazni2_h=hilbert(ulazni2);
y_test=zeros(N,1);
120 % pustamo kroz utrenirani beamform-er
for n=K+1:N
for l=1:L
125 for k=K:-1:2
X(k,l)=X(k-1,l);
end
end
130 for l=1:L
X(1,l)=ulazni2(n,l);
end
odziv_po_granama=W.*X;
135 y_test(n)=sum(sum(odziv_po_granama));
i f mod(n,1000)==0
n
end
end
140
% if mod(n,1000)==0
% n
% end
145
%%
% za nefiltrirani signal uzimamo npr. vrednost sa prvog mikrofona,
% pojacanu za neku konstantu (ne znamo kako tacno da dovedemo ulazni i
150 % izlazni signal na istu jacinu)
y_test_real=real(y_test);
y_test_real_n=y_test_real./(max(y_test_real));
y_test_real_n=y_test_real_n(K+1:N);
155
dd=niz_violona_govor(:,1);
dd=dd(K+1:N);
Strana 9 of 14
10. dd=20*dd;
%sound(dd,Fs5);
160
audiowrite(’Signal sa prvog mikrofona1.wav’,dd,Fs1);
audiowrite(’filtrirani signal1.wav’,y_test_real_n,Fs1);
%pause(9);
165 %sound(y_test_real_n,Fs5); % filtrirani signal
%%
Drugi način kodkoga se beamformer drugačije popunjava odbircima ulaznog signala:
Kod 2.
clear all; close all; clc;
%pkg load signal;
5
%[kalibracija, fs] = audioread (’kalibracija.wav’);
[mic_mls_belisum, fs] = audioread (’mikrofonski_niz_MLS_beli_sum.wav’);
[mls, fs] = audioread (’mls_sekvenca.wav’);
[belisum, fs] = audioread (’beli_sum.wav’);
10 [mic_violina_govor, fs] = audioread (’mikrofonski_niz_violina_govor.wav’);
% Kalibracija
% skalirani_mic_mls_belisum = zeros(size(mic_mls_belisum));
15 % max_rms = -1; % najglasniji mikrofon
% max_rms_ind = 1; % najglasniji mikrofon
% for br=1:24
% if rms(mic_mls_belisum(:,br)) > max_rms
% max_rms_ind = br;
20 % max_rms = rms(mic_mls_belisum(:,max_rms_ind));
% end
% end
% skalirani_mic_mls_belisum = mic_mls_belisum / max_rms .* rms(kalibracija);
25 % % --------------------------------------
% Slucaj kad signali mikrofona imaju isti rms kao zeljeni signal
% R = rms(mls);
% for br = 1:24
30 % in = mic_mls_belisum(:,br);
% a = sqrt((length(in)*R^2)/(sum(in.^2)));
% skalirani_mic_mls_belisum(:,br) = in*a;
% end
% rms(skalirani_mic_mls_belisum);
35 %%
N = 40000; % Ukupan broj odbiraka
x_t = mic_mls_belisum(1:N,:); % 24 ulaznih signala sa po N odbiraka
40
% R = rms(x_t(:,1));
Strana 10 of 14
11. % for br = 1:24
% in = x_t(:,br);
% a = sqrt((length(in)*R^2)/(sum(in.^2)));
45 % x_t(:,br) = in*a;
% end
% Psr = rms(x_t(:,1))^2
% 1/(N*Psr)
50 x_t=hilbert(x_t);
K = 24; % broj mikrofona
J = 360; % red filtra u jednoj grani, ovo se povecava,
% ovde ide for petlja za adaptivno menjanje, probali smo vise vrednosti,
55 % nema vidljive razlike u konacnom rezultatu
% Ukupan broj koeficijenata filtra celog sistema je K*J
60 mu = 1.5; % tek treba naci optimalnu vrednost
x = zeros(J*K,1); % vektor svih odbiraka signala unutar beamformera
w = zeros(J*K,1); % vektor svih koeficijenata beamformera
W = (reshape(w,K,J))’; % i-ta kolona su koeficijenti i-te grane bemaformera (ima 24 grane)
65 X = (reshape(x,K,J))’; % i-ta kolona su odbirci ulaznog signala u i-toj grani beamformera
MSE = zeros(N,1); % srednja kvadratna greska
y = zeros(N,1); % zbir odziva svake grane
d = hilbert(mls(1:N,1)); % zeljeni signal
70 % d = hilbert(belisum(1:N,1));
e = zeros(N,1); % vektor greske
for n = J:N
75 X(:,1:K) = x_t(n:-1:n-J+1,1:K); % popunjavanje svake grane odbircima ulaznih signala sa mikrofona
% odmah smo popunili celu matricu
% redjaju se unazad zbog racunanja konvolucije
odziv_po_granama = conj(W).*X; % matrica proizvoda signala i koeficijenata svake grane
80
% sum(odziv_po_granama) je vektor odziva svake grane u n-toj iteraciji
y(n) = sum(sum(odziv_po_granama)); % zbir odziva svake grane u n-toj iteraciji
e(n) = y(n) - d(n);
MSE(n,1) = abs(e(n).ˆ2);
85 w = reshape(W’,1,J*K); % matricu transformisemo u vektor
x = reshape(X’,1,J*K);
w = w - 2*mu*e(n)*(x); % mozda ovo treba popraviti
90 W = (reshape(w,K,J))’; % nove koeficijente vracamo nazad u svaku granu beamformera (u matricu)
i f mod(n,1000)==0
n
end
Strana 11 of 14
12. 95 end
figure ,plot((J+1):N,MSE((J+1):N));
set(gca,’FontSize’,15)
100 xlabel(’Redni broj odbirka’);
ylabel(’Vrednost greske - MSE’);
y_real=real(y);
y_real_n=y_real./(max(abs(y_real)));
105
figure ,plot((N-8000:N-7880)/fs,mls(N-8000:N-7880),’LineWidth’,1);
hold on
plot((N-8000:N-7880)/fs,y_real_n(N-8000:N-7880),’LineWidth’,2);
ylim([-1.35 1.35]);
110 xlabel(’itt[s]’);
ylabel(’Normalizovana amplituda’);
legend({’originalna sekvenca’,’filtriran signal’});
set(gca,’FontSize’,15)
115 N=363320;
y_test=zeros(N,1);
ulaz2 = hilbert(mic_violina_govor);
120 for n = J:N
X(:,1:K) = ulaz2(n:-1:n-J+1,1:K);
odziv_po_granama = conj(W).*X; % matrica proizvoda signala i koeficijenata svake grane
125
y_test(n) = sum(sum(odziv_po_granama)); % zbir odziva svake grane u n-toj iteraciji
i f mod(n,1000)==0
n
130 end
end
%%
dd=mic_violina_govor(:,1);
135 dd=dd(J+1:N);
dd=20*dd;
%sound(dd,Fs5);
y_test_real=real(y_test);
140 audiowrite(’Signal sa prvog mikrofona2.wav’,dd,fs);
audiowrite(’filtrirani signal2.wav’,y_test_real,fs);
%pause(9);
%sound(y_test_real_n,Fs5); % filtrirani signal
145 %%
Strana 12 of 14
13. 6 Rezultati
Slika 6: Grafik srednje kvadratne greške
Slika 7: Grafik referentnog i filtriranog signala
Zbog pojave Multipath-a, u realnim uslovima se dobija odstupanje filtriranog i željenog signala, čak i posle
dobro istreniranih koeficijenata filtra.
Strana 13 of 14
14. 7 Literatura
1. M.Bjelić, M.Stanojević: ”Comparison of LMS Adaptive Beamforming Techniques in Microphone Arrays”
(2015)
2. M.Bjelić, M.Stanojević, D.Š.Pavlović, M.Milić: Microphone array geometry optimization for traffic
noise analysis (2017)
3. S. Haykin: ”Adaptive Filter Theory” (2014)
4. A.D. Poularikas, Z.M. Ramadan: ”Adaptive Filtering Primer with MATLAB” (2006)
5. A.Greensted: ”Frost’s Algorithm, Microphone Array Beamforming” (2010)
Strana 14 of 14