Capitolo IV Capitolo IV
Validazione Algoritmo Validazione Algoritmo
IV.1 Implementazione software
Tra i vari problemi affrontati nell’implementare l’algoritmo nel simulatore ci sono stati difficoltà nell’integrare la funzione di minimizzazione nel simulatore preesistente causate da incompatibilità tra librerie. Il software usava librerie standard C++, quali la <math.h>, <iostream.h>, <fstream.h>, dovendo utilizzare delle funzioni ottimizzate che usavano la libreria <complex.h>, si sono creati conflitti tra istruzioni che avevano dichiarazioni contrastanti.
Inoltre, il simulatore su cui doveva essere implementata la funzione gestiva i numeri complessi dividendoli in parte Reale ed Immaginaria, quindi ogni vettore aveva dimensioni doppie del necessario per ospitare tutti gli elementi. La funzione per la decomposizione SVD della matrice usa invece la libreria <complex> che gestisce diversamente i numeri complessi.
Seguendo le fasi dell’implementazione dell’algoritmo LSQI, dobbiamo inizialmente creare la matrice C contenente i campioni dello spettro delle CCs. Ogni colonna della matrice corrisponde allo spettro di una CCs, alternando parte in fase e quadratura del segnale. Lo stesso per il vettore s che contiene i campioni dello spettro del segnale utile. Dobbiamo fare attenzione quando passiamo gli argomenti alla funzione che fa l’ottimizzazione:
sia la matrice che il vettore avranno dimensioni delle colonne pari alla metà di quelle di partenza, perché due elementi consecutivi su una colonna corrispondono ad un numero complesso.
11 12 13
21 22 23
31 41
c c c
C c c c
c c
11 21 12 22
31 41
( , ) ( , )
( , )
complex
complex c c complex c c C complex c c
CCs1 CCs2 CCs3
2m n, complex m n
C C . In raltà Ccomplex sarà:
11 21 31 41
[ ( , ), ( , ),...]
complex
C complex c c complex c c .
Dopo aver sistemato i vettori che devono essere elaborati dalla funzione zsvd (che fa la decomposizione SVD della matrice) è stato implementato il metodo di Newton per calcolare il vettore incognito dell’algoritmo LSQI.
Per verificare il giusto funzionamento dell’algoritmo abbiamo preso l’esempio numerico di [1] ed abbiamo fatto elaborare i dati dal nostro codice C++.
IV.2 Verifica del funzionamento dell’algoritmo
Per avere una prima riprova della correttezza dell’algoritmo ci siamo messi in una situazione semplice computazionalmente.
E’ stato inizialmente graficato uno spettro composto da 64 sottoportanti in totale, 60 di queste servono per la trasmissione dati, le rimanenti 4 sono le CCs.
Applichiamo l’algoritmo di minimizzazione provando a variare la potenza fornita alle CCs.
Illustriamo di seguito i grafici ottenuti nel caso:
64 sottoportanti
60 dati
4CCs con potenza pari al 5%
Volendo graficare lo spettro centrato sullo zero, attiviamo le portanti [-30, 29]
mentre le CCs risulteranno -32,-31, 30, 31, per un totale di 64 sottoportanti.
Il range di ottimizzazione comprende le code a sinistra della CCs= -32 e a destra della CCs=31. La risoluzione dei grafici non risulta buona, in quanto abbiamo preso due campioni per ogni lobo della sinc, quindi il campione sullo zero ed il campione sul massimo del lobo laterale come mostrato in Fig.IV.1. Cosi facendo sono stati ridotti i massimi dei lobi laterali.
0.8
0.6
0.4
0.2
0.0
-0.2
Fig.IV.1 In Fig.IV.2 mostriamo lo spettro del segnale dati.
1.0
0.8
0.6
0.4
0.2
0.0
-60 -40 -20 0 20 40 60
numero sottoportanti spettro dati
Fig.IV.2
Lo spettro delle CCs prima della pesatura è dato dalla somma delle sinc in Fig.IV.3.
1.0
0.8
0.6
0.4
0.2
0.0
-0.2
-60 -40 -20 0 20 40 60
numero di sottoportanti portante1 portante2 portante3 portante4
Fig.IV.3
Il vettore delle incognite fornito dall’algoritmo di minimizzazione sarà composto da elementi Reali, questo perché i simboli sulle sottoportanti sono a parte Immaginaria nulla. I valori del vettore incognite in questo caso particolare sono i seguenti:
0.0513,0.0000 0.5069,0.0000 0.5069,0.0000 0.0513,0.0000 g
.
1.0
0.8
0.6
0.4
0.2
0.0
-60 -40 -20 0 20 40 60
numero di sottoportanti spettro dati CCs1 CCs2 CCs3 CCs4
Fig.IV.4
Risulta evidente come le code dello spettro di partenza vengano attenuate con l’introduzione delle CCs opportunamente pesate con l’algoritmo.
1.0
0.8
0.6
0.4
0.2
0.0
-60 -40 -20 0 20 40 60
numero di sottoportanti spettro dati spettro dopo la minimizzaizone
Fig.IV.5
Il fattore A di cui si parla nel cap.III risulta essere A=0.99570166874728 < 1.
Aumentando la potenza spesa sulle CCs vediamo cosa otteniamo di diverso rispetto al caso precedente:
0.1% di potenza 0.1
0.0809,0.00 0.1547,0.000 0.1547,0.000 0.0809,0.00 g
0.3% di potenza 0.3
0.0288,0.00 0.2998,0.000 0.2998,0.000 0.0288,0.00 g
0.5% di potenza 0.5
0.0513,0.0000 0.5069,0.0000 0.5069,0.0000 0.0513,0.0000 g
che risulta essere lo stesso vettore del caso
di potenza pari al 5%.
Grafichiamo lo spettro al variare della potenza investita sulle CCs per verificare l’efficienza dell’algoritmo. Vediamo che aumentando la potenza da 0.1% allo 0.5% i lobi laterali vanno sempre più scomparendo.
1.0
0.8
0.6
0.4
0.2
0.0
40 20
0 -20
-40
numero di sottoportanti 5% di potenza 0.1 % di potenza 0.3% di potenza
Fig.IV.6
0.3
0.2
0.1
0.0
-0.1
45 40
35 30
numero di sottoportanti
5% di potenza 0.1 % di potenza 0.3% di potenza
Fig.IV.7
Nella Fig.IV.7 viene riportato il particolare dei lobi laterali sulla destra dello spettro.
Vediamo che aumentando la potenza dal 0.1% al 0.5% si ha un miglioramento, ma oltre lo 0.5% non ci sono cambiamenti, infatti il vettore delle incognite rimane invariato. Questo ci riconduce ai “Commenti sull’efficienza dell’algoritmo” del capitolo III. Cioè oltre un certo livello di potenza non si hanno più benefici sullo spettro. Infatti aumentando oltre lo 0.5% della potenza non si hanno più giovamenti.
Ovviamente questo vale nel caso particolare di 64 sottoportanti di cui 4CCs.
Cambiando i valori anche i risultati variano, poiché varia la matrice C che viene elaborata dall’algoritmo e quindi i valori singolari della decomposizione SVD (cap.III.5 Commenti sulla efficienza dell’algoritmo)
IV.3 Validazione dei risultati forniti in letteratura
Un elemento di partenza per la sperimentazione era il riferimento [5]. Per avere la conferma che il nostro algoritmo funzionasse come richiesto abbiamo ricreato la condizione in [3].
Abbiamo supposto di avere un totale di 64 sottoportanti, ognuna delle quali trasporta un simbolo pari ad 1. Delle 64 sottoportanti 6 erano CCs, quindi le portanti dati erano in totale 58.
Come descritto precedentemente è stato calcolato lo spettro come sommatoria di sinc, quindi è stato stabilito un range di ottimizzazione e su questo è stato applicato
Fig. IV.8
-100 -80 -60 -40 -20 0
dsp
-60 -40 -20 0 20 40 60
frequenza normalizzata con 6 CCs 3dx e 3sx
senza CCs 64 sottoportanti 58 dati
6CCs con 1.3% di potenza
Fig.IV.9
Vedendo i risultati delle simulazioni possiamo affermare che l’algoritmo implementato lavora come quello proposto in letteratura.
Una volta presa visione di questo lo applichiamo al nostro simulatore e cerchiamo di adattarlo ai nostri scopi.
Nel caso particolare del nostro simulatore gli spettri non sono stati calcolati come sommatoria di sinc poiché il modello di segnale è diverso. In un sistema simulato, dobbiamo tenere conto che il segnale deve essere sovracampionato nel tempo di un certo fattore L, inoltre noi non usiamo degli impulsi rettangolari nel tempo, ma RRCR con un certo fattore di rolloff, quindi lo spettro su cui andiamo ad applicare l’algoritmo di minimizzazione non sarà dato dalla somma di sinc.
Il modello del segnale a tempo continuo risulta:
( ) n ( s)
n
x t
b g t nT con N Tcp s t (N1)Ts e n k j2 kn N/k
b
d e Il segnale deve essere sovracampionato nel tempo con un certo fattore L, quindi
( s/ ) n ( s/ s)
n
x lT L
b g lT L nT passando al dominio della frequenza otteniamo2 /
( ) ( s/ ) j flT Ls
l
X f
x lT L e 2 / 2 / 2 /
( ) n ( s/ s) j flT Ls k j kn N ( s/ s) j flT Ls
l n k l n
X f
b g lT l nT e
d e g lT L nT e 2 ( /( ))
... d G fk ( ) ej f k NT s nTs
( /( )) ( 1) sin( ( /( )) ( )
... sin( ( /( )) )
s s cp
j f k NT T N N s s cp
s s
f k NT T N N
e f k NT T
2 2
1
( ) cos ( /(4 )*( 2 1 ))
0
G f fT
(1 ) /(2 )
(1 ) /(2 ) (1 ) /(2 )
f T
T f T
altrimenti
Con T (N N T g) s
Lo spettro delle Cancellation Carriers si calcola allo stesso modo, usando i ck 1 anziché gli sk che sono i simboli in ingresso al convertitore serie/parallelo.
Dall’algoritmo di minimizzazione usciranno i valori delle incognite gm.
Fig. IV.10 schema a blocchi del trasmettitore OFDM
I risultati delle simulazioni sono riportati nel capitolo successivo
n S/P
d d
1d
Nd
1d
NgM
I F F T
Aggiunta prefisso
ciclico P/S
x(t) Sidelobe
Suppression