studi di ancona
TRANSCRIPT
studi di Ancona
Tesina per il corso di
circuiti e algoritmi per il trattamento deisegnali
prof. FRANCESCO PIAZZA
Titolo:
Beamforming adattativo: l’algoritmo diFROST
Studente:
Simone Barbabella
Sommario
1. DELAY AND SUM BEAMFORMING. 1
1.1. IL GUADAGNO DELL’ARRAY. 4
2. BEAMFORMING NEL DOMINIO DELLA FREQUENZA. 7
2.1. BEAMFORMING PER SEGNALI DI DURATA FINITA. 72.2. BEAMFORMING ATTRAVERSO LO SCHEMA OVERLAP AND SAVE. 8
3. BEAMFORMING ADATTATIVO: L’ALGORITMO DI FROST 12
3.1. L’ALGORITMO ADATTATIVO 163.2. PRIMA APPLICAZIONE DELL’ALGORITMO DI FROST 173.3. SIMULAZIONE 183.4. SECONDA APPLICAZIONE DELL’ALGORITMO DI FROST 243.5. SIMULAZIONE 25
4. APPLICAZIONE DELL’ALGORITMO DI FROST A SEGNALI VOCALI 30
4.1. LA GENERAZIONE DEI SEGNALI IN INGRESSO ALL’ALGORITMO 304.2. L’ALGORITMO DI FROST PER SEGNALI A LARGA BANDA 324.3. ANALISI DEI RISULTATI 354.4. IMPLEMENTAZIONE IN TEMPO REALE DELL'ALGORITMO DI FROST 48
APENDICE 53
BIBLIOGRAFIA
Introduzione
contemporaneamente presenti in un ambiente: vogliamo studiare unalgoritmo che distingua uno solo di questi segnali in base alla loro direzionedi arrivo. Dunque lo scopo di questa tesina è quello di realizzare un filtrospaziale, cioè un filtro che lascia passare senza alterare segnali che gliarrivano da una certa direzione, mentre attenua segnali che gli arrivano daaltre direzioni. Gli algoritmi che presentiamo si basano sull’uso di un arraydi micrifoni e per questo, in letteratura, si trovano su libri e riviste chetrattano di array signal processing e trovano applicazioni nel sonar enell’esplorazione del sottosuolo terrestre attraverso onde sismiche.
Il più semplice algoritmo che presentiamo è il delay and sumbeamforming, realizzato nel dominio del tempo. Questo è molto semplice marealizza un filtro spaziale alquanto scadente, presenta difficoltà ad essereimplementato e non è adattativo, dunque non è in grado di apprendere daquale parte gli arriva il segnale o il disturbo. Il delay and sum beamformingnel dominio della frequenza risolve le difficoltà implementative del delay andsum nel tempo e può essere implementado in modo efficiente, quindi anchein tempo reale, ma rimane un algoritmo non adattativo. Lo scopo di questatesina è quello di studiare e implementare su calcolatore l’algoritmo scopertoda Frost nel 1971. Questo è un algoritmo adattativo di tipo nonsupervisionato che riconosce la direzione di arrivo del rumore e piazza deinulli in tale direzione. Essendo non supervisionato non ha bisogno peradattarsi del segnale desiderato con il quale ricavare l’errore, ma ha solobisono di conoscere la direzione di arrivo del solo segnale che non si vuoleattenuare.
Realizziamo l’algoritmo di Frost in diversi modi e lo faremo funzionaresu segnali audio reali ottenuti campionando la vove. Insieme alla tesina èstato dunque allegato un cd dei file audio prodotti dall’algoritmo e i giudiziche daremo sull’algoritmo saranno anche basati sull’ascolto di questi.
Delay and sum beamforming
1
1. DELAY AND SUM BEAMFORMING.Il delay and sum beamformiong è il più semplice e vecchio algoritmo
dell’array signal processing. L’algoritmo è descritto dal circuito di figura 1.
∆1
∆2
∆M
+z
.....
sensore 1
sensore 2
sensore M
w1
w2
wM
Figura 1.1 Delay and sum beamforming.
I segnali da ciascuno degli M sensori vengono ritardati di un tempo ∆i,moltiplicati per una costante wi (peso) e sommati tra loro. I ritardi ∆i sonocalcolati in base alla posizione dei microfoni e in base alla direzione in cui sivuole puntare l’array. La geometria dell’array può essere arbitraria, ma devecomunque rispettare un vincolo: la distanza tra i microfoni non deve essereinferiore a λ/2, dove λ è una lunghezza d’onda.
Consideriamo un’onda piana che si propaga attraverso l’array:
f( x, t )=s( t - r x⋅
c)
r Versore che indica la direzione di propagazione dell’onda.x Vettore che indica una posizione.c Velocità dell’onda.s(.) Segnale trasportato dall’onda.Per semplicità sia il segnale una cosinusoide, cioè s(t)=cos(ωt), così
che possiamo lavorare con i fasori.
f( x, t )=s( t - r ⋅ x
c) = Re exp j t jω
ω− ⋅
cr x
f( x, t ) ⇒ fasore ( )&( ) exp expf jc
jx r x k x= − ⋅
= − ⋅ω
dove rrkλπ
=ω
=2
c è il vettore d’onda.
Calcoliamo il fasore dell’uscita &z
( ) ( ) ( ) ( )( )& & exp expz w f j w ji ii
M
i ii
M
k x k xi i= − = − ⋅ ⋅ += =∑ ∑ω∆ ω∆
1 1
Delay and sum beamforming
2
&z è funzione di k, che dipende dalla direzione dell’onda. Se k0 è ilvettore d’onda del segnale verso il quale vogliamo puntare l’array, basta
imporre k0⋅⋅xi+ω∆i=0 i=1,2,..,M. Imponendo i ritardi ∆ i =− ⋅k x0 i
ω,
otteniamo:
( )&z w ii
M
k 0 ==∑
1
generalmente si scelgono i wi in modo che la loro somma sia 1.L’uscita per k diverso da k0 risulta:
( ) ( )( ) ( )( )& exp expz w j w ji ii
M
i ii
M
k k x k xi i= − ⋅ − ≤ − ⋅ + == =∑ ∑ω∆ ω∆
1 1
( )= ==∑ w zii
M
1
& .k 0
Tutte le onde che non hanno vettore d’onda k0 vengono attenuate.Vediamo un semplice esempio. Consideriamo un array di tre microfoni
disposti secondo i vertici di un triangolo equilatero di lato l . Calcoliamo irittardi da imporre in modo che l’array punti verso onde con vettore d’ondak0, disposto come in figura 1.2.
2i2
l−=x
2i3
l=x
l
k0
j
i
l23
jx1 =
Figura 1.2 Array triangolare di tre microfoni.
k0= −2πλ
j ∆ i = −⋅k x0 i
ω i=1,2,3.
∆∆ 1
3
2=
cl , ∆2 = 0, ∆3 = 0.
E’ comodo definire il vettore di steering, d, che ha per componenti deifasori i cui esponenti sono le fasi, su ciascun sensore, che un’onda piana ha
d è funzione del vettore d’onda k.
Delay and sum beamforming
3
( )( )( )( )
d k
k x
k x
k x
1
=− ⋅− ⋅− ⋅
exp
exp
exp
j
j
j2
3
Possiamo pensare al vettore d come funzione dell’angolo θ di arrivodell’onda:
( )k r i j= = − −2 2πλ
πλ
θ θcos sin
x2
θ
k
x3
x1
Figura 1.3
( )d θ
πλ
θ
πλ
θ
πλ
θ
=
−
exp
exp cos
exp cos
j sin
j
j
l
l
l
3
Definito il vettore dei pesi w :( )( )( )
w =
w j
w j
w j
1 1
2 2
3 3
exp
exp
exp
ω∆ω∆ω∆
,
possiamo scrivere il fasore &z (θ) attraverso una notazione moltosemplice:
( )&z θ = wH ⋅⋅ d(θ)Dove l’apice H sta per Hessiano (complesso coniugato e trasposto del
vettore). Graficando il modulo quadro di &z per diversi valori dell’angolo θ siottiene la figura 1.4.
Delay and sum beamforming
4
0.2
0.4
0.6
0.8
1
30
210
60
240
90
270
120
300
150
330
180 0
Figura 1.4 Risposta spaziale dell’array triangolare alla frequenza di 1000 Hz.
I problemi legati a questo algoritmo sono i seguenti:• l’attenuazione del segnale al di fuori della direzione di puntamento è
modesta per cui il filtro spaziale che l’algoritmo realizza è alquanto blando,• il segnale che esce dai microfoni è numerico, quindi, il ritardo deve
essere intero. Questo porta a delle incertezze che potrobbero risultaresignificative.
1.1. Il guadagno dell’array.Si definisce guadagno dell’array e lo si indica con G il rapporto:
GSNR
SNRarray
sore
=sen
.
Dove SNRarray e SNRsensore sono il rapporto segnale rumorerispettivamente all’uscita dell’array e su di un singolo sensore. G non tieneconto del rumore introdotto dal sensore, ma vuole essere una misura dellacapacità dell’algoritmo di rinforzare il segnale. G può essere scritto infunzione dei vettori d e w prima introdotti, infatti:
( )( )[ ]2
2
sensoret,n
s
2
1SNR
i
i
x
x
&
&
ε=
dove ( )ixs& e’ il fasore dell’onda di segnale sull’i-esimo sensore,
( )t,n ix& e’ il fasore del rumore ancora sullo stesso sensore, mentre ε indica ilvalore atteso. Nota, mentre il senale ha fasore non dipendente dal tempo, ilrumore e’ tempovariante.
( ) ( ) ( ) ( )∑∑==
∆ω−+∆ω−=M
1iiii
M
1ii jexpt,nwjexpswz ii xx &&&
Delay and sum beamforming
5
Nel fasore dell’uscita si riconoscono due termini: uno legato solo alsegnale, mentre l’altro legato al solo rumore. La potenza di segnale utilevale:
( ) RwwwSSwww HHHHHH2
z 21
21
SS21
s21
===&
dove abbiamo indicato con S il vettore dei fasori di segnale sui sensori:( )( )
( )
=
M
2
s
.
s
s
x
x
x
S
1
&
&
&
,
(nota, nel caso il segnale e’ un’onda piana S = d vettore di steering)R = SSH e’ la matrice di correlazione del segnale. Nota R è una matrice
hessiana (R = RH). La potenza di rumore vale:
( ) ( ) QwwwNNw HHH2
zn =ε=εAbbiamo indicato con N il vettore dei fasori di rumore sui sensori:
( )( )
( )
=
t,n
.
t,n
t,n
M
2
x
x
x
N
1
&
&
&
,
Q = ε(NNH) e’ la matrice di correlazione del rumore e ε indica il valoreatteso.
Risulta:
QwwRww
H
H
array 21
SNR =
Se i sensori sono tutti uguali sulla diagonale principale delle matrici Re Q gli elementi sono tutti uguali e coincidenti con il numeratore edenominatore dell’equazione di SNRsensore. Sostituendo nell’equazione chedefinisce G si ottiene:
G(f) = )f()f()f()f()f()f(
H
H
wQwwRw
⋅⋅⋅⋅
In questa equazione si e’ messo in evidenza che tutte le matrici che vicompaiono, essendo matrici di fasori, sono funzioni della frequenza. Lematroci R(f) e Q(f) sono le matrici di correlazione del segnale e del rumoreentrambe divise per la loro traccia.
La formula del guadagno ricavata sopra e’ molto importante, perche’molti algoritmi dell’array signal processing si costruiscono andando a travare
Delay and sum beamforming
6
dei vettori w che rendano massimo il guadagno G. Ad esempio, attraverso ilmetodo dei moltiplicatori di Lagrange, il massimo di G rispetto al vettore deipesi w e’ dato:
wQ d
d Q d
1
H 1=
−
−
valida nell’ipotesi che il segnale sia un’onda piana.
Beamforming nel dominio della frequenza
7
2. BEAMFORMING NEL DOMINIO DELLA FREQUENZA.Discutiamo in questo capitolo come implementare in tempo reale il
beamforming estendendolo anche per segnali a larga banda. Parlando deldelay and sum beamforming abbiamo sempre supposto che il segnaletrasportato dall’onda sia cosinusoidale, cioè un segnale monocromatrico. Sequesta ipotesi cade, si può sempre pensare di dividere lo spettro del segnalein tante fettine e applicare il beamforming separatamente a ciascuna singolafettina. Questa è l’idea di fondo del beamforming nel dominio dellafrequenza.
I segnali prodotti dai microfoni sono segnali tempo-discreto, dunque lostrumento matematico che definisce lo spettro di questi segnali è latrasformata discreta di Fourier (DFT) e con questa lavoreremo. La DFTprevede che i segnali da trasformare siano di durata finita, dunque, perrealizzare un filtraggio del segnale in tempo reale è necessario implementarel’algoritmo su di una finestra di durata D che scorre sui segnali di ingressosecondo una modalità del tipo overlap and save, molto utilizzata quando sirealizzano in tempo reale algoritmi del campo del DSP.
In questo capitolo discuteremo prima della realizzazione delbeamforming nel dominio della frequenza con segnali di durata finita, poi dicome la finestra si deve sovrapporre ai segnali di ingresso.
2.1. Beamforming per segnali di durata finita. Indichiamo con si[n], per i=1,2,..,M , i segnali, di durata non finita,
prodotti dagli M microfoni. Chiamiamo xi[n] i segnali ottenuti dagli si[n]finestrandoli :
xi[n] = si[n] f[n] per i = 1,2,..,Mdove f[n] indica la finestra rettangolare di durata D,f[n] = 1 per 0≤ n ≤ D -1.f[n] = 0 altrove.La DFT per i segnali xi [n] è definita:
Xi [k] = [ ]x n Wi D
kn
n
D
=
−
∑0
1
per k = 0,1,...,D-1.
per i = 1,2,...,M.dove WD = exp (- j 2π/D).Come noto, la Xi [k] e’ il campionamento della DTFT (trasformata
tempo discreto di Fourier) della sequenza xi [n] sul cerchio unitario:
[ ] ( )ωπ=ω
= ji eX
D/k2i kX per k = 0,1,...,D-1.
Il ritardo nel delay and sum beamforming era ottenuto moltiplicando ilfasore dell’ingresso per il termine:
Beamforming nel dominio della frequenza
8
⋅⋅
π− i0 xrf
c
2jexpw i per i = 1,2,..,M. (1)
Vediamo cosa succede se ad ogni bin della Xi [k] lo moltiplichiamo perla 1 in cui alla frequenza analogica f si sostituisce la frequenza digitale fck/Ddove fc è la frequenza di campionamento del segnale. Con tale sostituzione la1 diventa:
c/kf
DicWw i0xr per i = 1,2,...,M.
La DFT dell’uscita si ottiene:
Z[k] = [ ]∑=
M
1i
c/kf
DiicWkXw i0xr (2)
Per le proprietà della DFT, il termine [ ] c/kf
DicWkX i0xr e’ la DFT della
sequenza xi [n] che ha subito una traslazione circolare di ∆i=r0 xi fc/c. Risulta:
[ ] ( )( )z n w x ni i ii
M
D
= −=∑ ∆
1. (3)
Se ∆i non è intero la traslazione circolare opera anche unricampionamento del segnale:
D
k iW ∆
xi[n] xi((n-∆i))D
∆I intero
D
k iW ∆
xi[n] xi((n-∆i))D
∆I non interoD D
Figura 2.1
2.2. Beamforming attraverso lo schema overlap and save.Nel beamforming, quando l’onda di segnale arriva dalla direzione di
puntamento, i segnali che escono dai microfoni vengono ritardati di unopportuno ritardo in modo da trovarsi tutti in fase. Questo è sinteticamenteriassunto nella successiva figura.
Beamforming nel dominio della frequenza
9
∆1=0
∆2=3
∆3=5
figura 2.2
Realizzando l’algoritmo attraverso DFT il ritardo si produce attraversola traslazione circolare introdotta dalla formula 3.
∆1=0
∆2=3
∆3=5
D D
figura 2.3
Dalla figura 2.3 notiamo che realizzando il ritardo per mezzo di unatraslazione circolare gli ultimi 5 campioni non sono correttamente allineati,dunque debbono essere scartati.
In generale, siccome i ritardi possono essere sia positivi che negativisi dovranno scartare i primi e gli ultimi N campioni dove N coincide con ilmassimo ritardo temporale. E’ ovvio che la durata della finestra deve esserealmeno pari a 2N+1 campioni, perché altrimenti tutta l’uscita verrebbescartata.
Beamforming nel dominio della frequenza
10
E’ necessario che la successione delle finestre di ingresso sianoparzialmete sovrapposte di 4N campioni per fare in modo che concatenandole uscite nelle diverse finestre si ottiene la giusta sequenza di valori. ciò èquanto indicato in figura:
Figura 2.4
Quando i pesi wi sono funzioni dell’indice di frequenza k, questoschema non è più valido, infatti la 2 diventa :
[ ] [ ] [ ]∑=
=M
1i
c/kf
DiicWkwkXkZ i0xr (4)
e da questa non è possibile ricavare la 3. Possiamo pensare a z[n] comealla somma, su indice i, delle convoluzioni circolari tra l’antitrasformata di
[ ] c/kf
DicWkw i0xr (wi[n]) e xi[n]:
z[n] = i
M
=∑
1
wi[n] xi[n]. (5)
I pesi in frequenza realizzano un filtro sul segnale, cioè unaconvoluzione lineare che noi dobbiamo realizzare sfruttando la convoluzionecircolare introdotta con la 4 e 5. Secondo lo schema overlap and save, sewi[n] è lungo P campioni dobbiamo finestrare il segnale con finestre lungheD che si sovrappongono di P-1 campioni, come nella fig. 2.5.
Beamforming nel dominio della frequenza
11
DD D
P-1campioni
dascartare
D-P+1 campionibuoni
Figura 2.5
Deve essere rispettato il vincolo che D>2(P-1) campioni, altrimentitutti i campioni verranno scartati. La difficoltà di questa implementazione è
i [n] rispetta tale vincolo.
Beamforming adattativo: l’algoritmo di Frost
12
3. BEAMFORMING ADATTATIVO: L’ALGORITMO DIFROSTNel capitolo 1 avevamo introdotto un criterio di calcolo dei pesi w
basato sulla ricerca del guadagno ottimo G. Questo criterio, classificato inletteratura come optimum beamforming , è basato sulla conoscenza a prioridelle matrici R e Q, matrici di autocorrelazione del segnale e del rumore.
Il beamforming adattativo aumenta il guadagno dell’array senza alcunaconoscenza sul rumore, aggiustando i pesi w a partire dalla sola conoscenzadei dati in ingresso come rappresentato in figura 3.1.
W1*
W2*
WM*
+
X1
X2
XM
algoritmo diadattamento
Z
Figura 3.1 Beamforming adattativo.
L’algoritmo di Frost si basa sull’idea di minimizzare la potenza totaledi uscita, che è direttamente misurabile, sotto il vincolo di mantenere larisposta uniteria per segnali che arrivano dalla direzione di puntamento. Informule:
Minw wH R w vincolato dH w = 1
dove d è il vettore di steering nella direzione di puntamento. Più ingenerale si può generalezzare e introdurre una matrice dei vincoli CH w = g,che, come minimo, deve contenere il vincolo dH w = 1. In C possono esserecontenuti dei vincoli che introducono dei nulli in particolari direzioni o ingenerale dei vincoli sulla forma della risposta spaziale dell’array. Il problemaposto diventa:
Minw wH R w vincolato CH w = g
La matrice CH ha dimensionbe K × M dove assumiamo che il numerodi vincoli K siano linearmente intipendenti e sia K < M.
13
Calcoliamo il minimo con il metodo dei moltiplicatori di Lagrange : ilproblema vincolato si riconduce al calcolo del minimo della funzione :
f(w) = wH R w + λ1 v1 (w) + λ2 v2 (w) + . . . + λK vK (w)
che si può scrivere:
f(w) = wH R w + (CH w - g )H λλ
dove λi ≥ 0 sono i moltiplicatori di Lagrange, λλ è il vettore K×1 deimoltiplicatori, v i (w) sono i vincoli, cioè le righe dell’equazione CH w - g .La f(w) raggiunge il minimo per quel wopt tale che rende nullo il gradiente dif. E’ necessario calcolare ∆∆ w f:
∆∆ w f =
∂∂
∂∂
∂∂
∂∂
∂∂
∂∂
f
wj
f
wf
wj
f
w
f
wj
f
w
1 1
2 2
M M
Re Im
Re Im.
Re Im
+
+
+
Calcoliamo il gradiente per ciascun termine di f:∂∂w RwH
Rew k
= ∂∂Rew k
w r wp pq qq
M
p
M*
==∑∑
11
= (∂∂ Rew
w r w w r wk
1
*
1q q 2
*
2q q+ +∑ ∑ ..
..+ )w r w w r w w r wk
*
kq q k+1
*
k+1q q M
*
Mq q+ + + =∑∑∑ ..
= + + + + + + + +− − + +∑w w r w r w r w r w rk k k k k kk k k k M Mk1 2 2 1 1, 1 1,
* * * * * *... ...r r w1k kq q =
= r w r wpk pp
M
kp pp
M*
= =∑ ∑+
1 1
Questa ultima formula è la K-esima riga del vettore M×1(wHR)T + Rw =1 R*w* + Rw = 2 Re (Rw).
∂∂w RwH
Imw k
= ∂∂Imw k
w r wp pq qq
M
p
M*
==∑∑
11
= (∂∂ Im w
w r w w r wk
1
*
1q q 2
*
2q q+ +∑ ∑
1Ricordiamo che R R = RH
Beamforming adattativo: l’algoritmo di Frost
14
)w r w w r w w r wk
*
kq q k+1
*
k+1q q M
*
Mq q+ + + =∑∑∑ ..
= + + − + + + +∑jw r jw r j r w jw r jw r jw r1
*
1k 2
*
2k kq q k
*
kk k+1
*
k+1,k M
*
Mk... .. =
= j r w j r wpk p
*
kp pp
M
p
M
= =∑ ∑−
1 1
Questa ultima formula è la K-esima riga del vettore M×1
j[ (wHR)T - Rw ] = j( R*w* - Rw) = 2 Im (Rw).
Risulta:
∆∆ w ( wH R w ) = 2 Re (Rw) + j 2 Im (Rw) = 2 Rw
Con formule altrettanto noiose di quelle viste sopra si calcola ilgradiante del secondo termine di f:
∆∆ w (C* w - g )H λλ = C λλ
Il sistema di equazioni :
∆∆ w
H
w
C w g
f( ) ==
0⇒
2Rw C
C w gH
= −=
λ
è composto da M + K equazioni, dunque può essere risolto rispetto a we λλ ( rispettivamente M e K incognite). Ricavando w dalla prima esostituendo nella seconda:
w = - 1
2 R-1 C λλ
- 1
2 CH R-1 C λλ = g
Ricavando λλ dalla seconda e sostituendo nella prima:
λλ = - 2 ( CH R-1 C )-1 g ( ip. sia ( CH R-1 C )-1invertibile)w = R-1 C ( CH R-1 C )-1 g (1)
E’ utile vedere w come un vettore di CM e decomporlo nei vettori:
w = wc + v
15
dove wc è la proiezione di w nel sottospazio delle colonne di C, (ℜ(C) ), mentre v è la proiezione di w nello spazio ortigonale alle colonne diC, ℜ(C)⊥. L’algebra lineare dimostra che lo spazio ortogonale di ℜ(C) è lospazio nullo o nucleo di CH ( ℵ ( CH ) )2:
ℜ(C) =(ℵ ( CH ) )⊥.
Siccome la base di ℜ(C) è composta dalle K colonne di C ( per ipotesile colonne di C sono linearmente indipendenti: rango di C = K), allora si puòcalcolare esplicitamente wc.
w
wc = C x’
v = w-C x’
ℜ ( C )
Figura 3.2 Scomposizione intuitiva di w nelle componenti wc e v.
Il problema può essere posto in questo modo: trovare ∈ CK tale chewc = C x’ . Risulta v = w - C x’ , ma v deve essere ortogonale a ℜ(C) ecioè per ogni y ∈ ℜ(C) deve essere yH v = 0, oppure per ogni x ∈ CK vale(C x )H v = 0.
(C x )H ( w - C x’ ) = 0 ∀ x ∈ CK
xH ( CH w - CH C x’ ) = 0 ∀ x ∈ CK
Queste equazioni sono vere ∀ x ∈ CK se e solo se :
CH w - CH C x’ = 0 ⇒⇒ CH C x’ = CH w
Si può dimostrare che se C è una matrice M×K di rango K allora lamatrice CHC è una matrice K×K, hessiana e di rango K, dunque invertibile.Allora:
x’ = ( CH C )-1 CH w
Possiamo calcolare wc :
2Sia C una matrice complessa M×K, con K < M e rango K.Si definisce spazio delle colonne di C ℜ(C) il sottospazio vettoriale di tutti gli y ∈ CM : y = C x ∀ x
∈ CK. Si dimostra che la dimensione di ℜ(C) è K.
Si definisce spazio nullo di CH, ℵ ( CH ), ( detto anche spazio nullo sinistro di C) il sottospazio
vettoriale di tutti gli x ∈ CM : CH x = 0. Si dimostra che la dimensione di ℵ ( CH ) è M-K.
Teorema fondamentale dell’algebra lineare ℜ(C) =(ℵ ( CH ) )⊥.
16
wc = C ( CH C )-1 CH w, (2)
mentre
v = w - C ( CH C )-1 CH w .
Definita Pc = C (CH C )-1 CH , matrice di proiezione, risulta:
wc = Pc w
v = ( I - Pc ) w
Sostituendo nella 2 il valore ottimo di w troviamo una nuova formulaper wc :
wc = C ( CH C )-1 CH R-1 C (CH R-1 C)-1 g
wc = C ( CH C )-1 g
3.1. L’algoritmo adattativo
E’ importante notare che wc non dipende dalla matrice R, il cheequivale a dire che non dipende dai segnali in ingresso all’algoritmo, ma solodai vincoli che abbiamo imposto. Possiamo intuire che comunque variamo vnello spazio ℵ ( CH ) i vincoli imposti sono rispettati in modo esatto. Allorasembra conveniente adattare v in modo da minimizzare la potenza di uscitamuovendolo nella direzione dell’antigradiente secondo l’algoritmo steepestdescend. L’algoritmo di adattamento di Frost è dunque il seguente:
w( t + 1) = wc + ( I - Pc ) [ w( t ) - µ R w( t ) ] (3)
µ è il tasso di adattamento, mentre R w( t ) è il gradiente della potenzadi uscita (wH R w). Il termine ( I - Pc) garantisce che w varia solo nellacomponente v così in ogni istante saranno rispettati i vincoli.
E’ scomodo che nella 3 compaia R, perché questa è difficile da stimare,allora si può adottare un approccio di tipo LMS in cui a R si sostituisce unasua stima. La più semplice : R ( t) = x (t) xH (t) , sostituendo nella 3
17
w( t + 1) = wc + ( I - Pc ) [ w( t ) - µ x (t) xH (t) w( t ) ]
w( t + 1) = wc + ( I - Pc ) [ w( t ) - µ x (t) z*(t) ] (4)
La 4 è di più facile implementazione rispetto la 3. Frost dimostrò chel’algoritmo converge se il tasso di adattamento µ verifica il vincolo:
[ ]0
2
3< <µ
ε x xH
3.2. Prima applicazione dell’algoritmo di Frost
Consideriamo un array di tre microfoni disposti come i vertici di untriangolo equilatero di lato l , come gia avevamo studiato nel capitolo 1.
1
2 3
Kl
θ
O
Figura 3.3. Array triangolare di microfoni.
Ricordiamo il vettore di steering:
d(θ) =
θπ
θπ−
θ
π
coscf
jexp
coscf
jexp
sinc
3fjexp
l
l
l
Imponiamo due vincoli:• potenza di segnale unitaria per onde che incidono nella direzione θ =
π/2. dH (π/2 ) w = 1.
• potenza di segnale nulla per onde che arrivano dal centro O dell’array.Questo vincolo potrebbe avere senso se l’array è usato come microfoni in untelefono ‘viva voce’ e nel punto O è posto l’altoparlante del telefono.
18
Siccome la onde dal punto O giungono in fase ai tre microfoni, tale vincolo siesprime imponendo che la somma dei pesi w1 + w2 + w3 sia nulla: [1 1 1] w =0.
I due vincoli costruiscono le matrici C e g di seguito.
C =
( )
β
11
11
1jexp
g = 1
0
Dove si è indicato β = πl 3
c. Con le formule dimostrate sopra si
calcolano:
wc = 11
0 5
0 25
0 25
−−
−
jsinβ
βcos
.
.
.
Pc =
1 0 0
0 0 5 0 5
0 0 5 0 5
. .
. .
I - Pc =
−−
5.05.00
5.05.00
000
Secondo la formula 4 e le matrici sopra riportate calcoliamol’algoritmo di adattamento dei pesi:
w01(t +1) = 0
w02(t +1) = 1
2( w02(t ) - w03 (t ) ) +
1
2µ ( x3 (t ) – x2 (t ) ) z
*(t )
w03(t +1) = - w02 (t +1)
3.3. Simulazione
Vogliamo verificare le prestazioni dell’algoritmo attraverso dellesimulazioni con il linguaggio MATLAB. Il programma ‘frost1.m’, riportratoin apendice, simula l’algoritmo di Frost generando un’onda piana (segnale)che incide sull’array con angolo π/2 e un’onda piana (rumore) che incide conangolo parametrizzato dalla costante ‘a_rumore’.
L’algoritmo, così come è stoto presenato, si applica per segnalimonocromatici e le grandezze in ingresso, segnale e rumore, sono dei fasori.In ‘frost1.m’, a ogni iterazione, il segnale è un fasore 1+j 0, dunque su ogni
Beamforming adattativo: l’algoritmo di Frost
19
microfono il farore di segnale è sfasato di una quantità che è il vettore disteering relativo alla direzione di arrivo del segnale. Il rumore a ogniiterazione è un fasore che ha parte reale e parte immaginaria pariseparatamente a un numero casuale compreso tra –1 e 1. Il rumore su ciascunmicrofono è ottenuto sfasando il fasore del rumore di una quantità pari alvettore di steering calcolato nella direzione di arrivo del rumore (‘a_rumore’).Per testare anche il vincolo 2 (zero al centro dell’array), creiamo un secondorumore random proveniente dal punto O.
I risultati della simulazione è la risposta spaziale dell’array in dB su undigramma polare e il fasore dell’uscita. Siccome non si possono rappresentaredB negativi su un diagramma polare, è stato sommato 30 a ogni dato, così lalettura 30 dB corrrisponde a 0 dB.
La prima simulazione vogliamo vedere come si adatta l’algoritmo alvariare dell’angolo di arrivo del rumore ‘a_rumore’:
Numero di iterazioni = 8000Rumore dal centro dell’arrayµ = 0.05Frequenza = 1000 Hz
11.9564
35.8692
30
210
60
240
90
270
120
300
150
330
180 0
0 2000 4000 6000 8000-2
-1
0
1
2
3
4Fasore dell'usc ita. Angolo rumore 60°
Beamforming adattativo: l’algoritmo di Frost
20
10.0027
20.0055
30.0082
30
210
60
240
90
270
120
300
150
330
180 0
0 2000 4000 6000 80000.7
0.8
0.9
1
1.1
1.2
1.3
1.4Fasore dell'usc ita. Angolo rumore 0°
11.9359
23.8718
35.8076
30
210
60
240
90
270
120
300
150
330
180 0
0 2000 4000 6000 8000-2
-1
0
1
2
3
4Fasore dell'usc ita. Angolo rumore -60°
15
30
30
210
60
240
90
270
120
300
150
330
180 0
0 2000
Fasore dell'usc ita. Angolo rumore -90°
Beamforming adattativo: l’algoritmo di Frost
21
Nota: l’algoritmo si adatta bene a qualsiasi angolo di arrivo del rumoreπ/2. Guardando i diagrammi direzionali precedenti
sembra che ci sia il vincolo di potenza di segnale unitaria nella direzione -π/2. Vista la simmetria geometrica dell’array il comportamento dell’algoritmosarà simile per angoli di arrivo del rumore simmetrici a qusti simulati.
Nella simulazione successiva vediamo il comportamento dell’algoritmoal variare della frequenza di lavoro.
Rumore con angolo 135o
Rumore dal centro dell’arrayµ = 0.05
10.9358
21.8715
32.8073
30
210
60
240
90
270
120
300
150
330
180 0
0 2000 4000 6000 8000-1
0
1
2
3Fasore dell'usc ita. Frequenza 2000Hz
10.9993
21.9987
32.998
30
210
60
240
90
270
120
300
150
330
180 0
0 2000 4000 6000 8000-0.5
0
0.5
1
1.5
2
2.5
3Fasore dell'usc ita. Frequenza 1000Hz
Beamforming adattativo: l’algoritmo di Frost
22
Nota: il comportamento dell’algoritmo è completamente differente allevarie frequenze! Mentre a 2000Hz bastano 500 passi per adattarsi a 100Hznon bastano 8000 passi.
Nella successiva simulazione vediamo il comportamento dell’algoritmoper diversi valori di µ:
Rumore con angolo 135o
Rumore dal centro dell’arrayFrequenza 800Hz
10.9633
21.9267
32.89
30
210
60
240
90
270
120
300
150
330
180 0
0 2000 4000 6000 8000
Fasore dell'usc ita. Frequenza 500Hz
10.0234
20.0468
30.0702
30
210
60
240
90
270
120
300
150
330
180 0
0 2000 4000 6000 8000-2
-1
0
1
2
3
4Fasore dell'usc ita. Frequenza 100Hz
Beamforming adattativo: l’algoritmo di Frost
23
10.9799
21.9598
32.9397
30
210
60
240
90
270
120
300
150
330
180 0
0 500 1000 1500 2000-1
0
1
2
3Fasore dell'usc ita. mu = 0.1
11.0364
22.0727
33.1091
30
210
60
240
90
270
120
300
150
330
180 0
0 500 1000 1500 2000-0.5
0
0.5
1
1.5
2
2.5Fasore dell'usc ita. mu = 0.5
10.8633
21.7267
32.59
30
210
60
240
90
270
120
300
150
330
180 0
0 500
Fasore dell'usc ita. mu = 1
Beamforming adattativo: l’algoritmo di Frost
24
Riconosciamo un fenomeno sempre ricorrente nella convergenza deifiltri adattativi: valori elevati di µ fanno convergere in pochi passi, malasciano un rumore residuo elevato.
3.4. Seconda applicazione dell’algoritmo di Frost
Consideriamo lo stesso array di microfoni e applichiamo l’algoritmo diFrost imponendo due vincoli differenti:
• potenza di segnale unitaria per onde che incidono nella direzione θ= π/2. dH (π/2 ) w = 1.
• potenza di segnale nulla per onde che incidono nella direzione θ = -π/2. dH (-π/2 ) w = 0.
tali vincoli conducono alle matrici:
C =
( ) ( )
β−β
11
11
jexpjexp
g =
0
1
Dove si è indicato β = πl 3
c.
11.2845
22.569
33.8534
30
210
60
240
90
270
120
300
150
330
180 0
0 500 1000 1500 20000
0.5
1
1.5
2Fasore dell'usc ita. mu = 5
Beamforming adattativo: l’algoritmo di Frost
25
wc =
β−
β−
β
tg
1j
4
1
4
1tg
1j
4
1
4
1sin
1j
2
1
Pc =
21
21
21
21
0
0
001
I - Pc =
−
−
21
21
21
21
0
0
000
Nota: la matrice Pc è uguale a quella dell’esempio precedente, questovuol dire che pure l’algoritmo di adattamento sarà uguale.
w01(t +1) = 0
w02(t +1) = 1
2( w02(t ) - w03 (t ) ) +
1
2µ ( x3 (t ) – x2 (t ) ) z
*(t )
w03(t +1) = - w02 (t +1)
3.5. SimulazioniCome prima riportiamo alcune simulazioni MATLAB di questo
secondo algoritmo. I listati di queste simulazioni sono riportati nel filefrost2.m dell’apendice.
A differenza di prima abbiamo tolto il rumore proveniente dal centrodell’array e abbiamo messo un rumore con angolo di incidenza -π/2.
Nella prima simulazione vediamo come si adatta l’algoritmo al variaredell’angolo di arrivo del rumore, dunque variamo il parametro a_rumore eteniamo fissi tutti gli altri:
Numero di iterazioni = 8000Rumore da -π/2µ = 0.05Frequenza = 1000 Hz
Beamforming adattativo: l’algoritmo di Frost
26
12.5079
25.0158
37.5237
30
210
60
240
90
270
120
300
150
330
180 0
2000 4000 8000-2
0
1
3Fasore dell'usc ita. Angolo rumore 60°
10.5741
21.1482
31.7223
30
210
60
240
90
270
120
300
150
330
180 0
0 2000 4000 6000 80000
0.5
1
1.5
2
2.5Fasore dell'usc ita. Angolo rumore 0°
10.0126
20.0252
30.0377
30
210
60
240
90
270
120
300
150
330
180 0
0 2000 4000 6000 80000.7
0.8
0.9
1
1.1
1.2
1.3
1.4Fasore dell'usc ita. Angolo rumore -60°
Beamforming adattativo: l’algoritmo di Frost
27
Vediamo il comportamento dell’algoritmo per diverse frequenze.Parametrizziamo f tenendo fissi:
Numero di iterazioni = 8000Rumore da -π/2µ = 0.05Angolo rumore 135°
11.7968
23.5936
35.3904
30
210
60
240
90
270
120
300
150
330
180 0
0 2000 4000 6000 8000-0.5
0
0.5
1
1.5
2
2.5Fasore dell'usc ita. Frequenza 2000Hz
11.725
23.4501
35.1751
30
210
60
240
90
270
120
300
150
330
180
0 2000 4000 6000 8000-2
-1
0
1
2
3
4Fasore dell'usc ita. Frequenza 1000Hz
Beamforming adattativo: l’algoritmo di Frost
28
adattamento dell’algoritmo.Con l’ultima simulazione vediamo come si adatta l’algoritmo al variare
di tenendo fissi tutti gli altri parametri:Numero di iterazioni = 2000
π/2π/4
11.6686
23.3373
35.0059
30
210
60
240
90
270
120
300
150
330
180 0
0 2000 4000 6000 8000-2
-1
0
1
2
3
4Fasore dell'usc ita. Frequenza 500Hz
10.068
20.1361
30.2041
30
210
60
240
90
270
120
300
150
330
180 0
0 2000 4000 6000 8000-3
-2
-1
0
1
2
3
4Fasore dell'usc ita. Frequenza 100Hz
11.7054
23.4108
35.1162
30
210
60
240
90
270
120
300
150
330
180 0
0 500 1000 1500 2000-1
0
1
2
3Fasore dell'usc ita. mu = 0.1
11.6393
23.2786
34.918
30
210
60
240
90
270
120
300
150
330
0
0 500 1000 1500 2000-0.5
0
0.5
1
1.5
2
2.5Fasore dell'usc ita. mu = 1
11.5709
23.1418
34.7128
30
210
60
240
90
270
120
300
150
330
180 0
0 500 1000 1500 20000
0.5
1
Fasore dell'usc ita. mu = 5
Applicazione dell’algoritmo di Frost
30
4. APPLICAZIONE DELL’ALGORITMO DI FROST ASEGNALI VOCALI
Vorremmo utilizzare l’algoritmo di Frost per filtrare un segnaleacustico prodotto da una sorgente localizzata dentro una stanza in presenza dialtre sorgenti disturbanti. L’array è composto da tre microfoni disposti aforma di triangolo equilatero di lato 4.25 cm (lo stesso usato nellesimulazioni). La distanza tra i microfoni pone un limite superiore alla bandadi segnale, infatti la condizione per non avere aliesing spaziale è che ladistanza tra i microfoni deve essere minore o uguale a metà della più piccola
≤λm/2) cioè λm≥2d che equivale fm ≤c/2d =4000 Hz. Lavoriamo con segnali di banda 4 kHz (banda telefonica)campionandoli a 8 kHz.
4.1. La generazione dei segnali in ingresso all’algoritmoI segnali raccolti da ciascuno dei tre microfoni sono ottenuti a partire
dalle risposte impulsive della stanza tra sorgente e microfoni e dalle risposteimpulsive tra rumore e microfoni. Le risposte impulsive sono prodotte dalprogramme ‘mechosim’ che simula il comportamento acustico di una stanzanella quale si possono impostare diversi parametri: lunghezza della rispostaimpulsiva, dimensioni della stanza, coefficienti di riflessione delle pareti,posizione della sorgente, posizione del microfono.
La figura 4.1 riassume come sono stati ottenuti i segnali sui tremicrofoni.
31
micr. 2 micr. 3
micr. 1
segnale
rumorehr1
hr3
hr2
hs2 hs1 hs3
stanza
Figura 4.1
Il programma ‘mechosim’ impone che tutte le dimensioni non sianoespresse in metri, ma siano indicate con numeri interi dati dal rapporto tra lalunghezza in metri e la lunghezza d’onda relativa alla frequenza dicampiomamento:
lung. in campioni=lung. in metri / c Tc velocità del suono 340 m/sT periodo di campionamento della risposta impulsivaI microfini possono essere posti su di una griglia la cui distanza
minima è pari a cT = 0.0425 m (campionando a 8 kHz T = 125µs). Talegriglia di punti è incompatibile con la posizione dei microfoni dell’array. Sirisolve questo problema generando con ‘mechosim’ una rispostasovracampionata a 64 kHz così che la griglia di punti sui quali posizionare imicrofoni ha distanza minima 5.3125 mm, abbastanza piccola da permetteredi posizionare con sufficiente cura i microfoni.
Questo accorgimento complica leggermente lo schema di filtraggio,infatti per ottenere la risposta campionata a 8 kHz è necessari prima filtrare larisposta impulsiva a 64 kHz con filtro passa-basso antialiesing e poi decimarela stessa di un fattore 8: figura 4.2.
Applicazione dell’algoritmo di Frost
32
Risposta impulsiva a64 kHz
Risposta impulsiva a8 kHz
Filtro antialiasing Decimatore di unfattore 8
8
Figura 4.2
Il file ‘stanza.m’ in apendice genera i segnali in ingresso all’arrayseguendo lo schema di filtraggio sopra descritto. ‘stanza.m’ riceve in ingressoi file ‘segnale1.fil’, ‘segnale2.fil’, ‘segnale3.fil’, ‘rumore1.fil’, ‘rumore2.fil’,‘rumore3.fil’ contenenti le risposte impulsive segnale-microfono e rumore-microfono campionate a 64 kHz. La sorgente di segnale emette una vocecontenuta dentro al file audio ‘poesia8k.wav’, mentre la sorgente di rumoreemette un rumore bianco gaussiano a valor medio nullo prodotto attraverso lafunzione MATLAB ‘rand()’. ‘stanza.m’ produce in uscita i tre file audiocontenenti i segnali raccolti da ciascuno dei tre microfoni: ‘signal1.wav’,
4.2. L’algoritmo di Frost per segnali a larga bandaNelle simulazioni al capitolo 3 i segnali in ingresso all’algoritmo erano
fasori, cioè segnali monocromatici. La voce non è un segnalemonocromatico, dunque si procede dividendo lo spettro sonoro in tantefettine ciascuna delle quali può essere interpretata come una sinusoide eapplicando l’algoritmo a ciascuna fettina separatamente.
Un modo per dividere a fettine il segnale vocale è quello di utilizzarel’operazione DFT, che può essere vista come un banco filtri. La figure 4.3riporta lo schema dell’algoritmo di Frost per segnali vocali.
33
+
x1[n-63]
x1[n]
x1[n-1]
w1
x2[n-63]
x2[n]
x2[n-1]
w2
x3[n-63]
x3[n]
x3[n-1]
w3
+
+Z[0]
Z[1]
Z[63]
z[n]
Figura 4.3
Al segnale prodotto da ogni microfono si applica la DFT (attraversol’algoritmo di FFT) su di una finestra di 64 campioni: questo equivale asuddividere lo spettro del segnale acustico in 64 fettine tutte della stessagrandezza. Le uscite del blocco FFT corrispondono ai fasori di segnale suciascuna fettina dello spettro, dunque è su questi che si applica Frost.
In uscita si deve ricostruire il segnale nel tempo z[n]. Non è necesseriorealizzare per intero l’algoritmo IFFT su Z[0], Z[1],..,Z[63] perché interessasolo la prima componente z[n], allora questa si calcola applicandodirettamente la formula della DFT-1 sula prima componente:
z[n] = [ ]∑−
=
1D
0k
kn
DWkZD
1 ⇒ n = 0 ⇒ z[0] = [ ]∑
−
=
1D
0k
kZD
1
L’algoritmo richiede una grossa quantità di calcoli! Per ogni campionein ingressso si debbono calcolare 3 FFT a 64 campioni (64log264=384prodotti complessi) e 64 prodotti scalari del tipo wH x (3×64=192 prodotticomplessi) per un totale di 576 prodotti complessi, senza considerare lesomme e le operazione per aggiornare i pesi. L’algoritmo implementato inMATLAB impiega più di 15 ore per filtrare 30 s di voce! E’ improbonibilel’implementazione di questo algoritmo in tempo reale.
Applicazione dell’algoritmo di Frost
34
L’algoritmo di figura 4.3 è implementato nei file ‘A_frost1.m’ e‘A_frost2.m’. Il primo implementa l’algoritmo di Frost con il vincolo di porreuno zero per segnali che provengono dal centro dell’array, mentre nelsecondo si è imposto lo zero per segnali che arrivano dalla direzione oppostaa quella di puntamento. L’algoritmo è implementato su segnali vocaliprodotti come descritto sopra, dunque giudicheremo l’efficienzadell’algoritmo ascoltando il segnale in uscita. Un altro criterio più oggettivoper giudicare l’efficienza dell’algoritmo sarebbe quello di confrontare ilrapporto segnale rumore del segnale all’ingresso e di quello all’uscita. Ilprogramma ‘stanza.m’ esegue una stima del rapporto segnale rumore sulsegnale dei microfoni, ma non siamo in grado di stimare lo stesso per ilsegnale in uscita all’algoritmo, perché non sappiamo dividere il segnale dalrumore.
Con i programmi ‘A_frost1.m’ e ‘A_frost2.m’ abbiamo filtrato isegnali sonori prodotti nella stanza descritta in figura 4.4.
4 m
4 m
1 m
1 m
1.5 m
1.5 m
segnale
disturboarray
Figura 4.4
I parametri significativi della stanza sono le dimensioni, (4m,4m,3m) ei coefficienti di riflessione delle pareti 0.1.
Siccome la stanza attenua il segnale e il rumore, per rendere questiudibili è necessario amplificarli leggermente. Il rapporto segnale rumore delsegnale(S/N) è stimato a circa 2 dB. Si parla di stima perché è statoconsiderato come segnale ciò che esce dopo il filtro della risposta impulsivatra sorgente del segnale e microfono; dunque è stato considerato come
Applicazione dell’algoritmo di Frost
35
segnale sia l’onda diretta incidente sull’array, sia le onde riflesse dalle paretisull’arry. Visto il coefficiente di riflessione delle pareti molto basso (0.1) la
4.3. Analisi dei risultatiVediamo come varia la risposta spaziale dell’array prima e dopo
l’adattamento per l’algoritmo implementato in ‘Afrost1.m’ (zero al centro
15
30
30
210
60
240
90
270
120
300
150
330
180 0
k=2 frequenza=250Hz
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=4 frequenza=500Hz
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=6 frequenza=750Hz
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=8 frequenza=1000Hz
Figura 4.5 Risposta spaziale dell’array con i pesi iniziali.
36
Nota come il vincolo di potenza di segnale unitaria nella direzione dipuntamento sia rispettato per tutte le frequenze. Nella direzione di arrivo delrumore, 0° è gia presente un minimo della risposta spaziale questo èsicuramente un vantaggio per ridurre il rumore.
L’evolvere della risposta spaziale è fortemente legata al segnale diingresso: negli istanti in cui la potenza di ingresso è elevata l’algoritmo siadatta in modo strano, infatti la variazione dei pesi ∆w dipende da x, quandox è elevato i pesi variano notevolmente da un passo al successivo. Alcontrario, negli istanti in cui x è piccolo i pesi variano poco in un passo, cosìche l’algoritmo riesce a piazzare il nullo proprio nella direzione del rumore.Questo fenomeno è ben noto nel campo dei filtri adattativi e si risolve contecniche che vanno sotto il nome di LMS normalizzato.
Per mettere bene in evidenza questo fenomeno rappresentiamo sia ilsegnale all’uscita dell’algoritmo che le risposte spaziali a diversi passi diadattamento.
15
30
30
210
60
240
90
270
120
300
150
330
180 0
k=10 frequenza=1250Hz
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=16 frequenza=2000Hz
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=22 frequenza=2750Hz
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=28 frequenza=3500Hz
Figura 4.6 Risposta spaziale dell’array con i pesi iniziali.
37
Figura 4.8 Risposta spaziale dell’array dopo 4000 passiµ=0.05
0 2000 4000 6000 8000 10000 12000 14000 16000 18000-0.5
0
0.5
Figura 4.7 Primi 16000 campioni dell’uscita.
15.0009
30.0017
30
210
60
240
90
270
120
300
150
330
180 0
k=2 frequenza=250Hz
15.0251
30.0501
30
210
60
240
90
270
120
300
150
330
180 0
k=4 frequenza=500Hz
15.0484
30.0967
30
210
60
240
90
270
120
300
150
330
180 0
k=6 frequenza=750Hz
15.5452
31.0904
30
210
60
240
90120
300
150
330
180 0
k=8 frequenza=1000Hz
15.0678
30.1355
30
210
60
240
90
270
120
300
150
330
180 0
k=10 frequenza=1250Hz
15.0626
30.1251
30
210
60
240
90
270
120
300
150
330
180 0
k=16 frequenza=2000Hz
15.4797
30.9593
30
210
60
240
90
270
120
300
150
330
180 0
k=22 frequenza=2750Hz
15.436
30.8721
30
210
60
240
90
270
120
300
150
330
180 0
k=28 frequenza=3500Hz
Applicazione dell’algoritmo di Frost
38
15.0081
30.0161
30
210
60
240
90
270
120
300
150
330
180 0
k=2 frequenza=250Hz
15.01
30.0199
30
210
60
240
90
270
120
300
150
330
180 0
k=4 frequenza=500Hz
15.023
30.0459
30
210
60
240
90
270
120
300
150
330
180 0
k=6 frequenza=750Hz
15.0346
30.0692
30
210
60
240
90
270
120
300
150
330
180 0
k=8 frequenza=1000Hz
15.0749
30.1499
30
210
60
240
90
270
120
300
150
330
180 0
k=10 frequenza=1250Hz
15.0337
30.0674
30
210
60
240
90
270
120
300
150
330
180 0
k=16 frequenza=2000Hz
15.1158
30.2317
30
210
60
240
90
270
120
300
150
330
180 0
k=22 frequenza=2750Hz
15.6991
31.3983
30
210
60
240
90120
300
150
330
180 0
k=28 frequenza=3500Hz
Figura 4.9 Risposta spaziale dell’array dopo 8000 passiµ=0.05
Applicazione dell’algoritmo di Frost
39
15.007
30.0141
30
210
60
240
90
270
120
300
150
330
180 0
k=2 frequenza=250Hz
15.0029
30.0058
30
210
60
240
90
270
120
300
150
330
180 0
k=4 frequenza=500Hz
15.0142
30.0284
30
210
60
240
90
270
120
300
150
330
180 0
k=6 frequenza=750Hz
15.0607
30.1214
30
210
60
240
90
270
120
300
150
330
180 0
k=8 frequenza=1000Hz
15.0564
30.1128
30
210
60
240
90
270
120
300
150
330
180 0
k=10 frequenza=1250Hz
15.0088
30.0176
30
210
60
240
90
270
120
300
150
330
180 0
k=16 frequenza=2000Hz
15.0089
30.0178
30
210
60
240
90
270
120
300
150
330
180 0
k=22 frequenza=2750Hz
15.3383
30.6766
30
210
60
240
90
270300
150
330
180 0
k=28 frequenza=3500Hz
Figura 4.10 Risposta spaziale dell’array dopo 12000 passiµ=0.05
Applicazione dell’algoritmo di Frost
40
15.1005
30.2011
30
210
60
240
90
270
120
300
150
330
180 0
k=2 frequenza=250Hz
20.8986
41.7971
30
210
60
240
90
270
120
300
150
330
180 0
k=4 frequenza=500Hz
15.4247
30.8494
30
210
60
240
90
270
120
300
150
330
180 0
k=6 frequenza=750Hz
15.0116
30.0232
30
210
60
240
90
270
120
300
150
330
180 0
k=8 frequenza=1000Hz
15.121
30.2419
30
210
60
240
90
270
120
300
150
330
180 0
k=10 frequenza=1250Hz
15.1783
30.3566
30
210
60
240
90
270
120
300
150
330
180 0
k=16 frequenza=2000Hz
15.1107
30.2213
30
210
60
240
90
270
120
300
150
330
180 0
k=22 frequenza=2750Hz
15.3844
30.7688
30
210
60
240
90
270
120
300
150
330
180 0
k=28 frequenza=3500Hz
Figura 4.11 Risposta spaziale dell’array dopo 16000 passiµ=0.05
Applicazione dell’algoritmo di Frost
41
Ascoltando i file audio del segnle sui microfini e quello all’uscitadell’algoritmo si nota che il rumore è ridotto anche se non eliminato del tutto.Si nota anche un lieve abbassamento del tuno della voce.
Per il programma ‘A_frost2.m’ valgono le stesse considerazioni fattesopra, dunque andiamo a elencare la risposta spaziale dell’array con i pesiiniziali, il segnle all’uscita, la risposta spaziale con i pesi in diversi istanti diadattamento.
10
30
30
210
60
240
90
270
120
300
150
330
180 0
k=2 frequenza=250Hz
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=4 frequenza=500Hz
15
30
30
210
60
240
90
270
120
300
150
330
180 0
k=6 frequenza=750Hz
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=8 frequenza=1000Hz
Applicazione dell’algoritmo di Frost
42
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=10 frequenza=1250Hz
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=16 frequenza=2000Hz
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=22 frequenza=2750Hz
15.0347
30.0695
30
210
60
240
90
270
120
300
150
330
180 0
k=28 frequenza=3500Hz
Figura 4.12 Risposta spaziale dell’array con pesi iniziali.
0 4000 6000 10000 12000 16000 18000
-0.2
0
0.4
Figura 4.13 Primi 16000 campioni dell’uscita.
Applicazione dell’algoritmo di Frost
43
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=2 frequenza=250Hz
15.0013
30.0026
30
210
60
240
90
270
120
300
150
330
180 0
k=4 frequenza=500Hz
15.0301
30.0602
30
210
60
240
90
270
120
300
150
330
180 0
k=6 frequenza=750Hz
15.0766
30.1532
30
210
60
240
90
270
120
300
150
330
180 0
k=8 frequenza=1000Hz
15.3426
30.6851
30
210
60
240
90
270
120
300
150
330
180 0
k=10 frequenza=1250Hz
15.7597
31.5194
30
210
60
240
90
270
120
300
150
330
180 0
k=16 frequenza=2000Hz
16.1363
32.2726
30
210
60
240
90
270
120
300
150
330
180 0
k=22 frequenza=2750Hz
17.0575
34.1151
30
210
60
240
90
270
120
150
330
180 0
k=28 frequenza=3500Hz
Figura 4.14 Risposta spaziale dell’array dopo 4000 passi. µ =0.01.
Applicazione dell’algoritmo di Frost
44
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=2 frequenza=250Hz
15.0045
30.0091
30
210
60
240
90
270
120
300
150
330
180 0
k=4 frequenza=500Hz
15.1601
30.3202
30
210
60
240
90
270
120
300
150
330
180 0
k=6 frequenza=750Hz
15.2818
30.5635
30
210
60
240
90
270
120
300
150
330
180 0
k=8 frequenza=1000Hz
15.6405
31.2809
30
210
60
240
90
270
120
300
150
330
180 0
k=10 frequenza=1250Hz
15.8306
31.6612
30
210
60
240
90
270
120
300
150
330
180 0
k=16 frequenza=2000Hz
16.2611
32.5222
30
210
60
240
90
270
120
300
150
330
180 0
k=22 frequenza=2750Hz
17.0652
34.1303
30
210
60
240
90
270
120
300
330
180 0
k=28 frequenza=3500Hz
Figura 4.15 Risposta spaziale dell’array dopo 8000 campioni. . µ
Applicazione dell’algoritmo di Frost
45
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=2 frequenza=250Hz
15.0071
30.0142
30
210
60
240
90
270
120
300
150
330
180 0
k=4 frequenza=500Hz
15.2204
30.4408
30
210
60
240
90
270
120
300
150
330
180 0
k=6 frequenza=750Hz
15.4787
30.9575
30
210
60
240
90
270
120
300
150
330
180 0
k=8 frequenza=1000Hz
15.7208
31.4417
30
210
60
240
90
270
120
300
150
330
180 0
k=10 frequenza=1250Hz
15.8249
31.6499
30
210
60
240
90
270
120
300
150
330
180 0
k=16 frequenza=2000Hz
16.2227
32.4455
30
210
60
240
90
270
120
300
150
330
180 0
k=22 frequenza=2750Hz
17.0733
34.1467
30
210
60
240
90
270
120
300
150
330
180 0
k=28 frequenza=3500Hz
Figura 4.16 Risposta spaziale dell’array dopo 12000 passi. . µ =0.01.
Applicazione dell’algoritmo di Frost
46
10
20
30
30
210
60
240
90
270
120
300
150
330
180 0
k=2 frequenza=250Hz
15.2818
30.5636
30
210
60
240
90
270
120
300
150
330
180 0
k=4 frequenza=500Hz
15.3846
30.7692
30
210
60
240
90
270
120
300
150
330
180 0
k=6 frequenza=750Hz
15.6823
31.3647
30
210
60
240
90
270
120
300
150
330
180 0
k=8 frequenza=1000Hz
15.8267
31.6534
30
210
60
240
90
270
120
300
150
330
180 0
k=10 frequenza=1250Hz
15.5825
31.1651
30
210
60
240
90
270
120
300
150
330
180 0
k=16 frequenza=2000Hz
16.3032
32.6063
30
210
60
240
90
270
120
300
150
330
180 0
k=22 frequenza=2750Hz
17.1955
34.3909
30
210
60
240
90
270
120
300
150
180 0
k=28 frequenza=3500Hz
4 =0.01.
Una considerazione sul secondo algoritmo. L’instabilità dellasoluzione ottima con segnali elevati in ingresso è meno evidente; ciò è
µriduce la velocità di convergenza dell’algoritmo. A frequenze inferiori a 500Hz la risposta spaziale non viene modificata nemmeno dopo 16000 passi acausa del fatto che la velocità di convergenza dell’algoritmo si riduce con la
particolarmente dannoso perché l’orecchio umano è più sensibile proprio allebasse frequenze. La scelta del parametro µ è particolarmente critica: µfanno convergere velocemente l’algoritmo anche in bassa frequenza, ma lorendono instabile quando è elevata l’energia del segnale di ingresso, alcontrario µ
Applicazione dell’algoritmo di Frost
48
4.4. Implementazione in tempo reale dell’algoritmo di Frost
Abbiamo fatto notare che le precedenti implementazioni dell’algoritmodi Frost secondo lo schema di figura 4.3 sono poco efficienti e impieganocirca 15 ore per filtrare 30 secondi di file audio. Presentiamo ora unalgoritmo da questo ponto di vista molto più efficiente. I pesi w[k], su ogniramo del beamforming realizzano un filtro; è ben noto come realizzare intempo reale i filtri attraverso lo schema , ma è necessariaun’ipotesi, la risposta impulsiva del filtro deve essere più corta della durata Ddella finestra. Non possiamo garantire questa ipotesi, non esistono ragioni per
attraverso il matlab l’hanno dimostrato. Allora abbiamo inventato un artificioper rientrare in questa ipotesi: consideriamo una finestra lunga 512 campioni,se adattiamo solo i pesi w[k] di indice k dispari, otteniamo 3 vettori dei pesidi lunghezza 256 bin. Antitrasformando nel tempo i pesi con una DFT a 256campioni otteniamo 3 vettiri w[t] lunghi 256 bin. Aggiungendo zero-peddingfino a 512 campioni e ritrasformando in frequenza con DFT a 512 campioniotteniamo i nuovi 512 pesi wI[k] che sono identici ai precedenti w[k] per kdispari, ma divesi per k pari. wI[k] ricampiona w[k]. Ai wI[k] corrisponde,per come sono stati ricavati, una risposta impulsiva lunga 256 bin, dunque èora possibile filtrare applicando lo schema overlap and save riportato nel
E’ ovvio che adattando solo sui pesi di indice dispari ci aspettiamo unadegradazione delle prestazioni dell’algoritmo, infatti nessuno ci garantisceche per le frequenze di ordine pari l’algoritmo si adatta, infatti la rispostaspaziale dell’array per frequenze pari non solo non si adatta, ma non rispetanemmeno i vincoli imposti. Questo ha come conseguenza una scarsariduzione del rumore e una certa distorsione della voce.
Anche la velocità di convergenza è modificata, infatti ora l’algoritmosi adatta ogni 256 campioni dell’ingresso e non più ogni campione.
dell’apendice. ‘r_frost1’ realizza l’algoritmo con il vincolo di potenza nullaper onde che provengono dal centro dell’array, ‘r_frost2’ ha il vincolo dipotenza nulla nella direzione opposta a quella di puntamento. Per renderciconto di come lavora l’algoritmo riportiamo la risposta spaziale dell’array perdiverse frequenze.
49
15
30
30
210
60
240
90
270
120
300
150
330
180 0
k=39 frequenza=609.375Hz
3.9153
7.8305
30
210
60
240
90
270
120
300
150
330
180 0
k=40 frequenza=625Hz
15.0052
30.0105
30
210
60
240
90
270
120
300
150
330
180 0
k=99 frequenza=1546.88Hz
4.1469
8.2939
30
210
60
240
90
270
120
300
150
330
180 0
k=100 frequenza=1562.5Hz
Figura 4.18’r_frost1’ risposta spaziale dopo dopo 80 passi con µ = 0.05
15.0044
30.0088
30
210
60
240
90
270
120
300
150
330
180 0
k=149 frequenza=2328.13Hz
5.3996
10.7993
30
210
60
240
90
270
120
300
150
330
180 0
k=150 frequenza=2343.75Hz
15.0038
30.0077
30
210
60
240
90
270
120
300
150
330
180 0
k=199 frequenza=3109.38Hz
7.3729
14.7457
30
210
60
240
90
270300
150
330
180 0
k=200 frequenza=3125Hz
50
15
30
30
210
60
240
90
270
120
300
150
330
180 0
k=39 frequenza=609.375Hz
4.2312
8.4624
30
210
60
240
90
270
120
300
150
330
180 0
k=40 frequenza=625Hz
15.0259
30.0518
30
210
60
240
90
270
120
300
150
330
180 0
k=99 frequenza=1546.88Hz
5.6076
11.2152
30
210
60
240
90
270
120
300
150
330
180 0
k=100 frequenza=1562.5Hz
15.0223
30.0447
30
210
60
240
90
270
120
300
150
330
180 0
k=149 frequenza=2328.13Hz
6.7026
13.4052
30
210
60
240
90
270
120
300
150
330
180 0
k=150 frequenza=2343.75Hz
15.014
30.028
30
210
60
240
90
270
120
300
150
330
180 0
k=199 frequenza=3109.38Hz
8.3379
16.6757
30
210
6090
270
120
300
150
330
180 0
k=200 frequenza=3125Hz
Figura 4.19’r_frost1’ risposta spaziale dopo dopo 400 passi con µ = 0.05
Applicazione dell’algoritmo di Frost
51
15.0119
30.0239
30
210
60
240
90
270
120
300
150
330
180 0
k=39 frequenza=609.375Hz
9.331
18.662
30
210
60
240
90
270
120
300
150
330
180 0
k=40 frequenza=625Hz
15.4399
30.8798
30
210
60
240
90
270
120
300
150
330
180 0
k=99 frequenza=1546.88Hz
10.75
21.5
30
210
60
240
90
270
120
300
150
330
180 0
k=100 frequenza=1562.5Hz
15.3788
30.7577
30
210
60
240
90
270
120
300
150
330
180 0
k=149 frequenza=2328.13Hz
11.7448
23.4895
30
210
60
240
90
270
120
300
150
330
180 0
k=150 frequenza=2343.75Hz
15.6083
31.2166
30
210
60
240
90
270
120
300
150
330
180 0
k=199 frequenza=3109.38Hz
13.7791
27.5581
30
210
60
240
90
270
120
300
150
330
180 0
k=200 frequenza=3125Hz
Figura 4.20 ‘r_frost2’risposta spaziale dopo 80 passi µ = 0.05
Applicazione dell’algoritmo di Frost
52
15.0161
30.0322
210
60
240
90
270
120
300
150
330
180 0
k=39 frequenza=609.375Hz
9.4031
18.8062
30
210
60
240
90
270
120
300
150
330
180 0
k=40 frequenza=625Hz
15.3873
30.7747
30
210
60
240
90
270
120
300
150
330
180 0
k=99 frequenza=1546.88Hz
12.3946
24.7893
30
210
60
240
90
270
120
300
150
330
180 0
k=100 frequenza=1562.5Hz
15.5665
31.1331
30
210
60
240
90
270
120
300
150
330
180 0
k=149 frequenza=2328.13Hz
12.7503
25.5007
30
210
60
240
90
270
120
300
150
330
180 0
k=150 frequenza=2343.75Hz
15.5114
31.0229
30
210
60
240
90
270
120
300
150
330
180 0
k=199 frequenza=3109.38Hz
13.8537
27.7075
30
210
60
240
90
270
120
300
150
330
180 0
k=200 frequenza=3125Hz
Figura 4.21 ‘r_frost2’ risposta spaziale dopo 400 passi µ = 0.05
apendice
53
Riportiamo in questa apendice tutti i file MATLAB che abbiamoutilizzato nelle simulazioni.
frost1.m
% Simula l'algoritmo di Frost imponendo due vincoli:% 1)potenza di segnale 1 per onde che incidono con angolo% di arrivo pari a pi/2,% 2)potenza di segnale nulla per onde che arrivano dal% centro dell'array.
clear('all');n=8000; % n numero di iterazionif=1000; % f frequenza di lavoroc=340; % c velocita' del suonomu=5; % mu tasso di adattamentol=0.0425; % l lato dell'array
c=[v_steer(pi/2,f), [1; 1; 1]]; % c matrice dei vincolig=[1; 0];wc=c*inv(c'*c)*g;w0=[0; 0; 0]; % w0 è inizializzato al vettore nullow=wc+w0;pc_=eye(3,3)-c*inv(c'*c)*c';a_rumore= 3*pi/4; % angolo di arrivo del rumore
s=v_steer(pi/2,f)*ones(1,n);%s è l’onda di segnale che incide%con angolo pi/2
rp=v_steer(a_rumore,f)*[randn(1,n)+j*randn(1,n)];%rp è l’onda di rumore che incide%con angolo a_rumore
r0=[1; 1; 1]*[randn(1,n)+j*randn(1,n)];%r0 è l’onda di rumore che proviene%dal centro dell’array
x=s+rp+r0;out=[];for i=1:n
z=w'*x(:,i);w0=pc_*(w0-mu*x(:,i)*conj(z));w=wc+w0;out=[out,z];
end% calcola la risposta spazialeangoli=[0:pi/100:2*pi];i=1;for beta=angoli
r(1,i)=10*log10(abs(w'*v_steer(beta,f))^2)+30;if r(1,i)<0
r(1,i)=0;endi=i+1;
endsubplot(1,2,1), polar(angoli,r) %grafica la risposta spazialesubplot(1,2,2), plot(real(out)) %grafica il fasore dell'uscitatitle('Fasore dell''uscita.')
apendice
54
v_steer.m
function e=v_steer(teta,f)% Calcola il vettore di steering per un'onda% che arriva con un angolo teta.% f frequenza dell'onda (Hz)
c=340;l=0.0425;lambda=c/f;cost=pi*l/(lambda);
e=(1/3)*[exp(j*cost*sqrt(3)*sin(teta));exp(-j*cost*cos(teta));exp(j*cost*cos(teta))];
frost2.m
% Simula l'algoritmo di Frost imponendo due vincoli:% 1)potenza di segnale 1 per onde che incidono con angolo% di arrivo pari a pi/2,% 2)potenza di segnale nulla per onde che incidono con% angolo di arrivo -pi/2.
clear('all');n=8000; % n numero di iterazionif=800; % f frequenza di lavoroc=340; % c velocita' del suonomu=0.05; % mu tasso di adattamentol=0.0425; % l lato dell'array
c=[v_steer(pi/2,f), v_steer(-pi/2,f)]; % c matrice dei vincolig=[1; 0];wc=c*inv(c'*c)*g;w0=[0; 0; 0]; % w0 è inizializzato al vettore nullow=wc+w0;pc_=eye(3,3)-c*inv(c'*c)*c';a_rumore=3*pi/4; % angolo di arrivo del rumore
s=v_steer(pi/2,f)*ones(1,n);%s è l’onda di segnale che incide%con angolo pi/2
rp=v_steer(a_rumore,f)*[randn(1,n)+j*randn(1,n)];%rp è l’onda di rumore che incide%con angolo a_rumore
r0=v_steer(-pi/2,f)*[randn(1,n)+j*randn(1,n)];%r0 è l’onda di rumore che incide%con angolo –pi/2
x=s+rp+r0;out=[];for i=1:n
z=w'*x(:,i);w0=pc_*(w0-mu*x(:,i)*conj(z));w=wc+w0;out=[out,z];
end% calcola la risposta spazialeangoli=[0:pi/100:2*pi];i=1;for beta=angoli
apendice
55
r(1,i)=10*log10(abs(w'*v_steer(beta,f))^2)+30;if r(1,i)<0
r(1,i)=0;endi=i+1;
end
subplot(1,2,1), polar(angoli,r) %grafica la risposta spazialesubplot(1,2,2), plot(real(out)) %grafica il fasore dell’uscitatitle('Fasore dell''uscita.')
stanza.m
%Genera i segnali raccolti da tre microfoni in una stanza%sovrapponendo un segnale audio ad un rumore bianco.
clear('all')
%progetto del filtro passabasso antialiaising
fp=3.5; %fp=3.5kHz massima frequenza della banda passantefs=4; %fs=4kHz minima freqenza banda oscuraap=3; %ap=3dB massima attenuazione in banda passenteas=20; %as=20dB minima attanuazione in banda oscura[n,wc]=buttord(fp/32,fs/32,ap,as);
%n ordine del filtro di butterworth%wc frequenza di taglio del filtro
[b,a]=butter(n,wc);
amps=2000; %coefficiente di amplificazione del segnaleampr=400; %coefficiente di amplificazione del rumoresegnale=wavread('poesia8k.wav');rumore=.7*rand(length(segnale),1);
[h_imp1,lung1]=leggi_h('segnale1.fil');h_filtrata1=filter(b,a,h_imp1);h_decimata1=decima8(h_filtrata1,lung1);
micro1=amps*filter(h_decimata1,1,segnale);
[h_r1,lung_r1]=leggi_h('rumore1.fil');h_r1_f=filter(b,a,h_r1);h_d1=decima8(h_r1_f,lung_r1);rumore1=ampr*filter(h_d1,1,rumore);
segnale1=rumore1+micro1;wavwrite(segnale1,'signal1.wav')
[h_imp2,lung2]=leggi_h('segnale2.fil');h_filtrata2=filter(b,a,h_imp2);h_decimata2=decima8(h_filtrata2,lung2);
micro2=amps*filter(h_decimata2,1,segnale);
[h_r2,lung_r2]=leggi_h('rumore2.fil');h_r2_f=filter(b,a,h_r2);h_d2=decima8(h_r2_f,lung_r2);rumore2=ampr*filter(h_d2,1,rumore);
segnale2=rumore2+micro2;wavwrite(segnale2,'signal2.wav')
apendice
56
[h_imp3,lung3]=leggi_h('segnale3.fil');h_filtrata3=filter(b,a,h_imp3);h_decimata3=decima8(h_filtrata3,lung3);
micro3=amps*filter(h_decimata3,1,segnale);
[h_r3,lung_r3]=leggi_h('rumore3.fil');h_r3_f=filter(b,a,h_r3);h_d3=decima8(h_r3_f,lung_r3);rumore3=ampr*filter(h_d3,1,rumore);
segnale3=rumore3+micro3;wavwrite(segnale3,'signal3.wav')
Funzione leggi_h.m
%[h_imp,lunghezza]=leggi_h(file_name.fil)%legge la risposta impulsiva della stanza comtenuta%dentro il file di nome file_name.fil.%Lunghezza è la lunghezza della risposta impulsiva.function [h_imp,lunghezza]=leggi_h(file_name)fid=fopen(file_name);
h_imp=[];i=1;while length(h_imp)<20
stato=fseek(fid,i,-1);h_imp=fscanf(fid,'%e');i=i+1;
endfclose(fid);lunghezza=h_imp(1,1);h_imp(1,1)=0;
Funzione decima8.m
% [s_d]=decima8(s_int,lunghezza)%decima di un fattore 8 s_int e restituisce s_d
function [s_d]=decima8(s_int,lunghezza)for n=0:(lunghezza/8-1)
s_d(n+1,1)=s_int(3+n*8,1);end
A_frost1.m
apendice
57
%Implementa l'algoritmo di FROST. Imponiamo 2 vincoli:%1 potenza di segnale unitaria nella direzione% di puntamento, cioè per onde che arrivano con un% angolo di pi/2.%2 potenza di segnale nulla per onde che arrivano dal centro% dell'array.% L'algoritmo è implementando sui file:% signal1.wav% signal2.wav% signal3.wav% che contengono il segnale campionato dai tra microfoni.
clear ('all');j=sqrt(-1);l=0.0425; %lato dell'arrayh=l*cos(pi/6); %altezza del triangolo equilaterof_camp=8e3; %frequenza di campionamentodurata=64; %durata della finestra temporale
c=340; %velocita dell'onda acustica
% ******************* calcolo wc *****************************wc(:,1)=[1; 1; 1];for k=2:durata/2
beta=pi*l*sqrt(3)*f_camp*(k-1)/(c*durata); wc(:,k)=(1-j*sin(beta)/(1-cos(beta)))*[-0.5; 0.25; 0.25]; endwc(:,durata/2+1)=wc(:,1);for k=1:durata/2-1
wc(:,durata/2+k+1)=conj(wc(:,durata/2+1-k));end
w=wc;r_spa(w,[4,6,8,15],f_camp,durata,l)pauseclfw0=zeros(3,durata);mu=0.01;
%*********************************************************************% leggo il segnale dai file micro*.wav%*********************************************************************
segnale(1,:)=wavread('signal1.wav')';segnale(2,:)=wavread('signal2.wav')';segnale(3,:)=wavread('signal3.wav')';
%*********************************************************************
i0=1;uscita=[];pesi=[];indice=1;lung=length(segnale(1,:));while (i0+durata)<lung, %****************************************************************** %******** finestro il segnale *********************************** %******************************************************************
finestra=[i0:i0+durata-1];x_t=segnale(:,finestra);x_fft(1,:)=fft(x_t(1,:));x_fft(2,:)=fft(x_t(2,:));
apendice
58
x_fft(3,:)=fft(x_t(3,:)); %****************************************************************** %****************************************************************** % calcolo l'uscita %******************************************************************
for k=1:durataz_fft(1,k)=w(:,k)'*x_fft(:,k);
endz=sum(z_fft)/durata;
%****************************************************************** % aggiorno i pesi %****************************************************************** for k=2:durata/2 w0(2,k)=0.5*(w0(3,k)-w0(2,k))+0.5*mu*(x_fft(2,k)-x_fft(3,k))*conj(z_fft(1,k)); w0(3,k)=-w0(2,k); end w0(:,durata/2+1)=w0(:,1);
for k=1:durata/2-1w0(:,durata/2+k+1)=conj(w0(:,durata/2+1-k));
endw=wc+w0;if mod(i0,8000)==0 %Ogni 8000 passi accumulo i pesi
pesi(:,:,indice)=w; indice=indice+1; end %*******************************************************************
uscita=[uscita z]; i0=i0+1;enduscita=uscita';wavwrite(uscita,8000,'uscita.wav')
A_frort2.m
%Implementa l'algoritmo di FROST. Imponiamo 2 vincoli:%1 potenza di segnale unitaria nella direzione% di puntamento, cioè per onde che arrivano con un% angolo di pi/2.%2 potenza di segnale nulla per onde che arrivano da% -pi/2.% L'algoritmo è implementando sui file:% signal1.wav% signal2.wav% signal3.wav% che contengono il segnale campionato dai tra microfoni.
clear ('all');j=sqrt(-1);l=0.0425; %lato dell'arrayh=l*cos(pi/6); %altezza del triangolo equilaterof_camp=8e3; %frequenza di campionamentodurata=64; %durata della finestra temporale
c=340; %velocita dell'onda acustica
% ******************* calcolo wc ********************************wc(:,1)=[1; 1; 1];for k=2:durata/2
beta=pi*l*sqrt(3)*f_camp*(k-1)/(c*durata);wc(:,k)=[0.5*j/sin(beta);
apendice
59
.25*(1-j/tan(beta));
.25*(1-j/tan(beta))]; endwc(:,durata/2+1)=wc(:,1);for k=1:durata/2-1
wc(:,durata/2+k+1)=conj(wc(:,durata/2+1-k));end
w=wc;r_spa(w,[4,6,8,15],f_camp,durata,l)pauseclfw0=zeros(3,durata);mu=0.01;
%**********************************************************************% leggo il segnale dai file micro*.wav%**********************************************************************
segnale(1,:)=wavread('signal1.wav')';segnale(2,:)=wavread('signal2.wav')';segnale(3,:)=wavread('signal3.wav')';
%**********************************************************************
i0=1;uscita=[];pesi=[];indice=1;lung=length(segnale(1,:));while (i0+durata)<lung, %******************************************************************* %******** finestro il segnale ************************************ %*******************************************************************
finestra=[i0:i0+durata-1];x_t=segnale(:,finestra);x_fft(1,:)=fft(x_t(1,:));x_fft(2,:)=fft(x_t(2,:));x_fft(3,:)=fft(x_t(3,:));
%******************************************************************* %******************************************************************* % calcolo l'uscita %*******************************************************************
for k=1:durataz_fft(1,k)=w(:,k)'*x_fft(:,k);
endz=sum(z_fft)/durata;
%******************************************************************* % aggiorno i pesi %******************************************************************* for k=2:durata/2 w0(2,k)=0.5*(w0(2,k)-w0(3,k))+0.5*mu*(x_fft(3,k)-x_fft(2,k))*conj(z_fft(1,k)); w0(3,k)=-w0(2,k); end w0(:,durata/2+1)=w0(:,1);
for k=1:durata/2-1w0(:,durata/2+k+1)=conj(w0(:,durata/2+1-k));
endw=wc+w0;if mod(i0,8000)==0 %Ogni 8000 passi accumulo i pesi
pesi(:,:,indice)=w; indice=indice+1; end
apendice
60
%*******************************************************************
uscita=[uscita z]; i0=i0+1;enduscita=uscita';wavwrite(uscita,8000,'uscita.wav')
function r_spa.m
%*********************************************************************% grafico la risposta spaziale%*********************************************************************% r_spa(w,kappa,f_camp,durata,l)% w: matrice dei pesi% k=[4,6,8,15]: 4 indici di frequenza per i quali si vuole la% risposta spaziale% f_camp: frequenza di campionamento% durata: riferita alla finestra dell'ingresso% l: lato dell'arrayfunction r_spa(w,kappa,f_camp,durata,l)costante=j*l*pi*f_camp/(durata*340);angoli=[0:pi/100:2*pi];cont=1;clffor k=kappa
out=[];for teta=angoli
steering(:,1)=[exp(costante*sqrt(3)*(k-1)*sin(teta));exp(-costante*(k-1)*cos(teta));exp(costante*(k-1)*cos(teta))];
risposta=30+10*log10(abs(w(:,k)'*steering(:,1))^2); if risposta<0 risposta=0; end
out=[out risposta]; end sk=sprintf('%d',kappa(1,cont)); freqz=sprintf('%g',kappa(1,cont)*f_camp/durata); titolo=strcat('k= ',sk,' frequenza=',freqz,'Hz'); subplot(2,2,cont),polar(angoli,out) gtext(titolo)
cont=cont+1;end
%**********************************************************************
r_frost1.m
%Implementa l'algoritmo di FROST. Imponiamo 2 vincoli:%1 potenza di segnale unitaria nella direzione
apendice
61
% di puntamento, cioè per onde che arrivano con un% angolo di -pi/2.%2 potenza di segnale nulla per onde che arrivano da% pi/2.% L'algoritmo è implementando sui file:% signal1.wav% signal2.wav% signal3.wav% che contengono il segnale campionato dai tra microfoni.
clear ('all');j=sqrt(-1);l=0.0425; %lato dell'arrayh=l*cos(pi/6); %altezza del triangolo equilaterof_camp=8e3; %frequenza di campionamentodurata=512; %durata della finestra temporalec=340; %velocita dell'onda acustica
% ******************* calcolo wc ********************************wc(1,:)=[1 1 1];for k=2:durata/2 beta=pi*l*sqrt(3)*f_camp*(k-1)/(c*durata); wc(k,:)=(1-j*sin(beta)/(1-cos(beta)))*[-0.5 0.25 0.25]; endwc(durata/2+1,:)=wc(1,:);for k=1:durata/2-1
wc(durata/2+k+1,:)=conj(wc(durata/2+1-k,:)); endwc_t=ifft(wc([1:2:durata],:)); %Impongo la risposta impulsiva di wcwc=fft(wc_t,durata); %limitata
w=wc;r_spa(conj(w'),[10,40,100,150],f_camp,durata,l)pause
w0=zeros(durata,3);mu=0.05;w0_f=zeros(durata/2,3);
%***********************************************************************% leggo il segnale dai file micro*.wav%**********************************************************************+
segnale(:,1)=wavread('signal1.wav');segnale(:,2)=wavread('signal2.wav');segnale(:,3)=wavread('signal3.wav');%**********************************************************************
i0=1;z_finestra=[durata/2+1:durata]';uscita=[];pesi=[];indice_p=1;conta=1;lung=length(segnale(:,1));while (i0+durata)<lung, %****************************************************************** %***** finestro x a 256 c. e a 512 c. **************************** %*******************************************************************
finestra=[i0:i0+durata-1]'; xt_finestra=segnale(finestra,:); x_fft=fft(xt_finestra);
apendice
62
%******************************************************************* % calcolo l'uscita %******************************************************************* for kappa=1:durata z_fft(kappa,1)=x_fft(kappa,:)*w(kappa,:)'; end zt=ifft(z_fft); uscita=[uscita; zt(z_finestra,1)];
%**********************************************************************% aggiorno i pesi%**********************************************************************
indice=1; for k=[2:2:durata] indice=indice+1; w0_f(indice,2)=0.5*(w0(k,2)-w0(k,3))+0.5*mu*(x_fft(k,3)-x_fft(k,2))*conj(z_fft(k,1)); w0_f(indice,3)=-w0_f(indice,2); end w0_t=ifft(w0_f); %impongo la risposta impulsiva di w0=fft(w0_t,durata); %w0 limitata w=w0+wc; if mod(conta,80)==0 pesi(:,:,indice_p)=w; indice_p=indice_p+1 conta=1; end conta=conta+1; %****************************************************************** i0=i0+durata/2;endwavwrite(uscita,8000,'uscita0.05.wav')plot(real(uscita))
r_frost2.m%Implementa l'algoritmo di FROST. Imponiamo 2 vincoli:%1 potenza di segnale unitaria nella direzione% di puntamento, cioè per onde che arrivano con un% angolo di -pi/2.%2 potenza di segnale nulla per onde che arrivano da
apendice
63
% pi/2.% L'algoritmo è implementando sui file:% signal1.wav% signal2.wav% signal3.wav% che contengono il segnale campionato dai tra microfoni.
clear ('all');j=sqrt(-1);l=0.0425; %lato dell'arrayh=l*cos(pi/6); %altezza del triangolo equilaterof_camp=8e3; %frequenza di campionamentodurata=512; %durata della finestra temporalec=340; %velocita dell'onda acustica
% ******************* calcolo wc *******************************wc(1,:)=[1 1 1];for k=2:durata/2
beta=pi*l*sqrt(3)*f_camp*(k-1)/(c*durata_);wc(k,:)=[0.5*j/sin(beta) .25*(1-j/tan(beta)) .25*(1-j/tan(beta))];
endwc(durata/2+1,:)=wc(1,:);for k=1:durata/2-1
wc(durata/2+k+1,:)=conj(wc(durata/2+1-k,:));endwc_t=ifft(wc([1:2:durata],:)); %Impongo il vincolo della rispostawc=fft(wc_t,durata); %limitata su wcw=wc;r_spa(conj(w'),[10,40,100,150],f_camp,durata,l)pause
w0=zeros(durata,3);mu=0.05;w0_f=zeros(durata/2,3);
%**********************************************************************% leggo il segnale dai file micro*.wav%*********************************************************************+
segnale(:,1)=wavread('signal1.wav');segnale(:,2)=wavread('signal2.wav');segnale(:,3)=wavread('signal3.wav');%**********************************************************************
i0=1;uscita=[];pesi=[];indice_p=1;conta=1;lung=length(segnale(:,1));while (i0+durata_512)<lung, %****************************************************************** %***** finestro x a 512 c. ************************************** %****************************************************************** f_durata=[i0:i0+durata-1]'; xt_durata=segnale(f_durata,:); x_fft=fft(xt_durata);
%****************************************************************** % calcolo l'uscita %****************************************************************** for kappa=1:durata z_fft(kappa,1)=x_fft(kappa,:)*w(kappa,:)'; end
apendice
64
zt_=ifft(z_fft); uscita=[uscita; zt_([durata/2+1:durata]',1)];
%*********************************************************************% aggiorno i pesi%********************************************************************* indice=1; for k=[2:2:durata] indice=indice+1; w0_f(indice,2)=0.5*(w0(k,2)-w0(k,3))+0.5*mu*(x_fft(k,3)-x_fft(k,2))*conj(z_fft(k,1)); w0_f(indice,3)=-w0_f(indice,2); end w0_t=ifft(w0_f); %Impongo w0 limitato nel tempo w0=fft(w0_t,durata); w=w0+wc; if mod(conta,80)==0 pesi(:,:,indice_p)=w; indice_p=indice_p+1; conta=1; end conta=conta+1; %****************************************************************** i0=i0+durata/2;endwavwrite(uscita,8000,'uscita0.05.wav')plot(real(uscita))
Bibliografia
• B. WIDROW and L. J. GRIFFITHS “Adaptive antenna systems”Proceedings of the IEEE, vol. 55, no. 12, Dicembre 1967.
• L. J. GRIFFITHS “A simple adaptive algorithm for real-timeprocessing in antenna array” Proceedings of the IEEE, vol. 57, no.10, Ottobre 1969.
• O. L. FROST, III “An algorithm for linearly constrained adaptiveProc. IEEE, vol. 60, pp. 926-935, Agosto 1972.
• B. WIDROW “Adaptive filteringin in the frequency domain”Proceedings of the IEEE, vol. 66, no. 12, Dicembre 1978.
• H. COX and R. M. ZESKIND “Practical supergain” IEEEtransactions on acoustics, speech, and signal processing, volASSP-34, no 3, Giugno 1986.
• H. COX and R. M. ZESKIND “Robust adaptive beamforming”IEEE transactions on acoustics, speech, and signal processing, volASSP-35, no 10, Giugno 1987.
• B. WIDROW and S. D. STEARNS “Adaptive signal processing”editore Prentice Hall.
• S. OPPENMEIN “Discrete time signal processing” editore PrenticeHall.
• S. HAYKIN “Adaptive filter theory”• F. PIAZZA dispenze del corso Circuiti e algoritmi per il
trattamento dei segnali Università di Ancona.