studi di Ancona

68
studi di Ancona Tesina per il corso di circuiti e algoritmi per il trattamento dei segnali prof. FRANCESCO PIAZZA Titolo: Beamforming adattativo: l’algoritmo di FROST Studente: Simone Barbabella

Transcript of studi di Ancona

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.