• Non ci sono risultati.

Generazione e trasmissione dei segnali

Sfruttando la flessibilità concessa dal software, al fine di una maggiore chiarezza, il codice per la generazione dei segnali è stato organizzato in maniera gerarchica, considerando per ogni livello una finalità specifica. Partendo quello inferiore, relativo alla definizione dei campioni associati ai segnali, nel tempo temporale, forniremo una descrizione delle operazioni effettuate in fase di trasmissione.

La prima operazione da svolgere consiste nell’inizializzazione dei parametri che determinano le caratteristiche delle forme d’onda da trasmettere, per mezzo del cluster LabVIEW “System Parameter”. Tramite gli appositi controlli presenti sul Frontal Panel è possibile modificare il numero dei simboli da trasmettere (N_SYMB_OFDM), le dimensioni della IFFT ( ), il numero di sotto-portanti utili impiegate (Nsc) e la lunghezza del prefisso ciclico (Ncp), in modo tale da permettere la generazione di segnali con differenti caratteristiche spettrali. È possibile inoltre specificare l’ordine del polinomio (PN sequence Order) e la radice (seed in) utilizzati dal generatore PRBS (Pseudo-Random Binary Sequence) per ricavare il vettore dei bit da trasmettere. Si rende necessario l’impiego di un generatore di sequenze PRBS poiché, grazie ad esso, il ricevitore, è in grado di ricavare la medesima sequenza di bit trasmessi, conoscendo solamente la radice e l’ordine del polinomio impiegati. Un volta definito, il vettore dei bit viene inviato al mapper, il quale, prelevando i bit a coppie, produce i simboli complessi 4QAM, il cui alfabeto è composto dai valori {

. Il vettore dei simboli complessi viene quindi inviato ad un VI che li organizza in una matrice le cui righe sono pari al numero di simboli da trasmettere, mentre le colonne sono pari al numero di sottoportanti utili specificate in fase di inizializzazione (N_SYMB_OFDM x Nsc). Così facendo, in ognuna delle righe della matrice sono presenti i simboli informativi che verranno ripartiti, in frequenza, tra le sotto-portanti di ciascun simbolo. Pertanto questo VI svolge la funzione del convertitore serie/parallelo presente negli schemi a blocchi delle forme d’onda considerate. Basta quindi operare sulla singola riga della matrice, ripetendo il medesimo processing per tutte le righe, per ottenere la sequenza dei campioni del segnale da trasmettere. In successione, ogni riga della matrice, un vettore di Nsc elementi, viene prelevata mediante un istruzione ricorsiva di tipo for, ed inviata al seguente blocco operazionale, rappresentato dal modulatore multiportante (MCM). Per una maggiore praticità nello svolgimento delle simulazioni, si è scelto di includere i modulatori relativi alla OFDM, MOFDM e FOFDM in un unico VI, mediante una struttura “case” del LabVIEW, la quale, tramite un apposito selettore, discrimina le operazioni da svolgere sui simboli in ingresso sulla base della specifica forma d’onda considerata. Tuttavia, data la notevole

80

somiglianza tra i formati di segnalazione considerati, per la descrizione del codice relativo al MCM faremo riferimento ad un tradizionale modulatore OFDM, indicando, di volta in volta, le operazione aggiuntive da effettuare per implementare l’operazione di mascheramento e filtraggio che distinguono i formati di segnalazione. Per una maggiore chiarezza, nelle figura A.1, A.2 ed A.3 presenti in Appendice A, è stata comunque riportata l’organizzazione del Block Diagram per ognuna delle tre forme d’onda analizzate, oltre al Frontal Panel comune, in figura A.4.

La prima operazione effettuata sul vettore di simboli introdotto all’interno della struttura case è quella di inserire i “simboli pilota”, mediante sostituzione di alcuni simboli 4QAM precedentemente allocati. I simboli pilota vengono sfruttati, in ricezione, per effettuare la stima del profilo in frequenza del canale di comunicazione e la conseguente equalizzazione, pertanto, sia il loro valore, sia la loro posizione all’interno del simbolo OFDM, deve essere nota al ricevitore. Le sotto-portanti adibite al trasporto dei simboli pilota vengono generalmente riferite come “portanti pilota” (o semplicemente “pilota”) e, nello svolgimento delle simulazioni, la loro posizione è stata specificata mediante uno vettore contenente gli indici delle SC adibite a tale scopo (Pilot Position Vector). Per una maggiore semplicità sono state considerate portanti pilota equispaziate, una ogni 12 sotto-portanti dati, e la loro posizione non è stata variata con il succedersi dei simboli OFDM trasmessi. Per quanto concerne il valore dei simboli è stata considerata una specifica costellazione associata ai pilota, formata da: {(+1 +0j), (+0 + j), (-1 +0j), (+0 -j)}. Questa scelta ha permesso di discriminare con facilità questi simboli da quelli informativi, evitando tuttavia di modificare il profilo in frequenza della DSP relativa al segnale multiportante, poiché entrambe le costellazioni presentano modulo unitario. Per la loro origine è stato invece implementato un apposito generatore pseudo-casuale, per ragioni analoghe a quelle precedentemente esposte. Dopo l’inserzione delle portanti pilota, nel modulatore della MOFDM, è prevista l’applicazione della maschera. Lo scopo di tale operazione è quello di attenuare le edge-subcarrier per ciascun lato dello spettro e ridurre di conseguenza le emissioni fuori banda del segnale. Il profilo della maschera è contenuto nel vettore “Mask[dB]” i cui elementi, espressi in dB, risultano pari al numero dalle sotto-portanti utili (Nsc) selezionato nella fase di inizializzazione. Una volta eseguita la conversione in valori lineari, è quindi sufficiente moltiplicare, membro a membro, il vettore della maschera e quello dei simboli utili (simboli informativi e pilota), per ottenere la sagomatura dello spettro in frequenza. Se consideriamo una maschera che non preveda alcuna attenuazione delle sotto-portanti, ritorniamo al tradizionale modulatore OFDM che, a questo punto, prevede l’inserimento delle portanti virtuali. Introdotte in modo da definire le bande di guardia del segnale, nel processing digitale questa operazione è ottenuta estendendo il vettore di simboli da trasmettere fino ad una dimensione pari ad

81

N, tramite l’aggiunta di simboli nulli. Il VI che implementa questa operazione permette, specificando l’indice di inizio (Sub-Carry Shift Index), di variare la posizione delle Nsc sottoportanti (contigue) associate ai simboli utili, modificando di conseguenza la posizione in frequenza del segnale. Una volta aggiunte le portanti virtuali, sul vettore di N simboli così ottenuto viene applicata l’operazione di IFFT per generare, in uscita, i campioni del segnale nel dominio temporale. Di questi, gli ultimi Ncp sono replicati e posizionati in testa ad ogni simbolo OFDM, per formare prefisso ciclico. Successivamente all’aggiunta del CP, nel caso della Filtered-OFDM, incontriamo l’operazione di filtraggio. Questa viene implementata tramite un apposito VI che, basandosi sulle funzioni pre-definite in LabVIEW, esegue la convoluzione tra i campioni del segnale e la risposta impulsiva del filtro, contenuta nel vettore “FIR_Filter_Coeff “. Conclusa tale operazione, se prevista, i campioni considerati a questo punto del Block Diagram sono quelli relativi, al singolo simbolo multiportante nel dominio temporale. Come precedentemente indicato, queste operazioni devono essere ripetute per ciascun simbolo da trasmettere, pertanto vengono incluse nella struttura del “for”, pilotato sul numero di righe della matrice creata in ingresso al modulatore multi-portante. In presenza di un’istruzione ricorsiva, LabVIEW permette di concatenare le uscite di ogni iterazione, formando così un singolo vettore costituito dalla successione degli output di ciascun ciclo dell’istruzione for. Per il caso specifico della OFDM e della MOFDM, questo si traduce nell’ordinamento automatico dei campioni da trasmettere in un’unica sequenza. La medesima procedura di allineamento utilizzata per le forme d’onda precedenti si è rivelata inadatta per la FOFDM, a causa dell’allungamento dei simboli introdotto dall’operazione di filtraggio. Per tale ragione è stato quindi considerato un apposito VI che posizionasse l’inizio di ciascun simbolo campioni dopo il precedente, garantendo così il corretto allineamento della sequenza. In questo modo, qualsiasi sia la forma d’onda considerata, abbiamo generato un vettore contenente i campioni del segnale da trasmettere, il quale, una volta definito ed implementato l’impulso in trasmissione, ricorrendo alle funzioni pre-definite di LabVIEW, può essere reso disponibile al VI di livello superiore. Questo antepone, al vettore dei simboli prodotti dal livello inferiore, un header specificatamente composto per consentire al ricevitore di stimare l’inizio del segnale utile. La struttura dell’header e la sua generazione sono state descritte nel paragrafo successivo di questo lavoro e pertanto i dettagli inerenti a tale operazione verranno momentaneamente tralasciati.

Il frame dati così costituito viene quindi passato al VI principale (main VI) del quale sono state riportate, in figura 5.1 e 5.2 rispettivamente, il Block Diagram ed il Front Panel. Modificando i valori tramite il Front Panel del mainVI è possibile ottenere segnali con diverse caratteristiche spettrali. In particolare, variando il numero di sotto-portanti, sono stati generati i segnali a banda

82

larga e banda stretta, utilizzati per la caratterizzazione dello scenario utilizzato nelle nostre simulazioni. Successivamente alla generazione del segnale, secondo il processing precedentemente descritto, la prima operazione effettuata nel main VI è quella di inserire un numero variabile di simboli OFDM fittizi (Dummy Symb), caratterizzati cioè da campioni tutti nulli, in coda ai dati da trasmettere. Quest’ultima operazione si rende necessaria per evitare che una chiusura anticipata della sessione in trasmissione della USRP, riscontrata alcune volte durante lo svolgimento delle simulazioni, portasse alla perdita dei campioni terminali del segnale. Nel main VI sono in oltre presenti tutte le funzioni LabVIEW necessarie ad interfacciare l’USRP con il software, in modo da permettere il passaggio dei campioni verso l’hardware. Una volta aperta la sessione in trasmissione (niUSRP Open Tx Session), fissati i riferimenti di clock e frequenza e configurati i parametri della scheda (niUSRP Configure Signal) i campioni vengono introdotti all’interno di un ciclo while che permette una trasmissione continua del segnale, mediante la funzione “niUSRP Write Tx Data (poly)”. Infine, tramite un pulsante “STOP”, è possibile interrompere l’istruzione iterativa con conseguente chiusura della sessione di trasmissione (niUSRP Close Tx Session) e terminazione della simulazione.

83

84

85