Tesi di Laurea Specialistica: Sviluppo ed implementazione di un
Transcript
Tesi di Laurea Specialistica: Sviluppo ed implementazione di un
UNIVERSITÀ DEGLI STUDI DI MODENA E REGGIO EMILIA Facoltà di Ingegneria - Sede di Modena Corso di Laurea in Ingegneria Elettronica Sviluppo ed implementazione di un modem digitale a larga banda Relatore: Chiar.mo Prof. Ing. Giorgio Matteo Vitetta Correlatore: Dott. Ing. Fabrizio Pancaldi Dott. Ing. Andrea Mazzanti Tesi di Laurea di: Francesco Montorsi Anno Accademico 2008 - 2009 La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché. (Albert Einstein) Indice 1 Introduzione 1.1 Contenuti della tesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 Comunicazione su linee elettriche 2.1 Sistemi di trasmissione e di distribuzione dell’energia elettrica . . . . 2.2 Cenni relativi all’evoluzione storica e alle applicazioni attuali delle PLC 2.3 Vantaggi e problematiche delle PLC . . . . . . . . . . . . . . . . . . . 3 3 5 11 3 Implementazione con processori DSP 3.1 Architettura del sistema . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Generalità sui sistemi OFDM . . . . . . . . . . . . . . . . . . . . . 3.2.1 Breve introduzione . . . . . . . . . . . . . . . . . . . . . . . 3.2.2 Principi del sistema OFDM . . . . . . . . . . . . . . . . . . 3.2.3 Analisi strutturale di un sistema OFDM . . . . . . . . . . . 3.2.4 Periodicizzazione del segnale . . . . . . . . . . . . . . . . . 3.2.5 Rappresentazione di un segnale OFDM . . . . . . . . . . . 3.3 Sincronizzazione nei sistemi OFDM . . . . . . . . . . . . . . . . . . 3.3.1 Effetto di un offset in frequenza della portante . . . . . . . 3.3.2 Effetto degli errori di posizionamento della finestra di DFT 3.3.3 Generalità sugli algoritmi di sincronizzazione . . . . . . . . 3.3.4 Algoritmi per la temporizzazione grezza . . . . . . . . . . . 3.3.5 Algoritmi per l’acquisizione di frequenza della portante . . 3.3.6 Algoritmi per la temporizzazione fine . . . . . . . . . . . . . 3.4 Simulazione MATLAB del sistema . . . . . . . . . . . . . . . . . . 3.4.1 Il trasmettitore . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.2 Il ricevitore . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.3 Simulazione dell’intero sistema . . . . . . . . . . . . . . . . 3.4.4 Dimensionamento del sistema . . . . . . . . . . . . . . . . . 3.5 Implementazione del trasmettitore . . . . . . . . . . . . . . . . . . 3.5.1 La scheda EVM TMS320C6424 . . . . . . . . . . . . . . . . 3.5.2 La scheda EVM DAC2904 . . . . . . . . . . . . . . . . . . . 3.5.3 Interconnessione DSP-DAC . . . . . . . . . . . . . . . . . . 3.5.4 Codice per il trasmettitore . . . . . . . . . . . . . . . . . . 3.6 Implementazione del ricevitore . . . . . . . . . . . . . . . . . . . . 3.6.1 La scheda EVM TMS320C6455 . . . . . . . . . . . . . . . . 15 15 17 17 18 20 23 29 32 32 34 35 36 41 44 47 47 55 62 63 66 66 68 71 77 83 83 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INDICE 3.7 3.6.2 La scheda EVM ADS62P45 . . . . 3.6.3 Interconnessione ADC-DSP . . . . 3.6.4 Codice per il ricevitore . . . . . . . Conclusioni per l’implementazione a DSP 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Implementazione con dispositivi FPGA 4.1 Architettura del sistema . . . . . . . . . . . . . . . . . . 4.1.1 Cenni relativi alla storia delle FPGA . . . . . . . 4.1.2 Funzionamento interno dei dispositivi Cyclone II 4.2 Generalità sui sistemi PAM a singola portante . . . . . . 4.2.1 Il trasmettitore . . . . . . . . . . . . . . . . . . . 4.2.2 Il ricevitore . . . . . . . . . . . . . . . . . . . . . 4.3 Sincronizzazione nei sistemi PAM a singola portante . . 4.3.1 Algoritmi per la temporizzazione grezza . . . . . 4.3.2 Algoritmi per la temporizzazione fine . . . . . . . 4.4 Simulazione MATLAB del sistema . . . . . . . . . . . . 4.4.1 Il trasmettitore . . . . . . . . . . . . . . . . . . . 4.4.2 Il ricevitore . . . . . . . . . . . . . . . . . . . . . 4.5 Implementazione del trasmettitore in Simulink . . . . . 4.6 Implementazione del ricevitore in Simulink . . . . . . . 4.7 Conclusioni per l’implementazione a FPGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 92 99 101 . . . . . . . . . . . . . . . 105 105 105 107 115 115 116 117 117 118 119 120 120 123 128 136 5 Conclusioni 137 A Sviluppi futuri 138 Ringraziamenti 143 6 INDICE Capitolo 1 Introduzione 1.1 Contenuti della tesi Oggigiorno l’evoluzione della tecnologia e dei servizi che essa offre determina una continua richiesta di maggior velocità nel trasferimento e nell’elaborazione dei dati; è quindi un passo importante sia per fini didattici che per fini lavorativi imparare ad usare l’hardware e le tecniche software atti a soddisfare tale richiesta. L’obiettivo del progetto qui documentato è stato l’implementazione di un modem digitale a larga banda per comunicazioni power-line. La caratteristica peculiare di tale sistema è proprio la larga banda (circa 30MHz) che permette di ottenere velocità trasmissive relativamente elevate (fino a decine di Mbit/s) ma che al contempo pone requisiti stringenti sull’hardware che deve essere infatti in grado di gestire una enorme mole di dati in tempo reale. L’altra caratteristica saliente è il tipo di canale di comunicazione per cui il modem è stato sviluppato, ovvero il canale power-line. Tale canale ha recentemente acquisito notevole interesse sia in ambito scientifico che in ambito commerciale essendo le linee elettriche di potenza candidate ideali per fornire servizi di domotica e di homeentertaining che si prevede saranno in forte espansione negli anni a venire. Nel capitolo 2 vengono fornite le nozioni di base relative a tale argomento. Dal punto di vista tecnico per un sistema embedded digitale quale il modem che si è voluto realizzare una fra le scelte più importanti è il tipo di dispositivo o di dispositivi che avranno il compito di effettuare l’elaborazione dei segnali. La scelta ricade in tre grandi categorie: microcontrollori (microcontroller unit MCU ), digital signal processors (DSP) e field-programmable gate arrays (FPGA). La larga banda (e l’alta velocità di trasmissione che essa implica) esclude assolutamente l’opzione MCU, visto che i microcontrollori sono i dispositivi più semplici e meno veloci. In questo progetto si è dapprima scelta un’architettura basata sui DSP della Texas Instruments e in seguito si è passati ad un’architettura basata su FPGA della Altera. I risultati sono descritti rispettivamente nella sezione 3.7 e 4.7. Per un modem a larga banda, specie se sviluppato per il canale power-line, risulta molto efficiente e conveniente adottare la modulazione denominata OFDM (Orthogonal Frequency Division Multiplexing). Tale modulazione è stata difatti adottata 1 2 1. Introduzione in numerosi standard moderni per trasmissione ad alta velocità: DAB, DVB, IEEE 802.11a/g, IEEE 802.16, IEEE 802.20. Nell’implementazione per DSP si è quindi sviluppato tale schema di modulazione, che viene descritto nella sezione 3.2. D’altra parte però l’OFDM comporta anche una certa complessità implementativa (dovuta anche alle operazioni di FFT/IFFT che essa richiede) nel trasmettitore e soprattutto nel ricevitore (dove sono necessari svariati algoritmi di sincronizzazione). Questa complessità addizionale unita alla assenza di know-how legato alla tecnologia FPGA (che a dispetto dei DSP richiede una differente “impostazione concettuale”) ha fatto propendere la scelta del formato di modulazione, per quanto riguarda l’implementazione FPGA-based, su una soluzione più semplice quale quella PAM a singola portante, che viene descritta nella sezione 4.2. In entrambi i casi comunque è stato fondamentale l’ausilio di una simulazione ad alto livello (nel nostro caso in MATLAB) prima dell’implementazione vera e propria. Nelle sezioni 3.4 e 4.4 vengono quindi descritti gli sforzi profusi in tale studio per le due differenti piattaforme hardware e per i due diversi formati di modulazione. Nelle sezioni 3.5, 3.6, 4.5 e 4.6 vengono poi descritte nel dettaglio le implementazioni vere e proprie. Infine, nel capitolo 5 si propongono alcune considerazioni conclusive. Capitolo 2 Comunicazione su linee elettriche Ai fini di una migliore comprensione dei contenuti trattati nei Capitoli successivi, vengono riportati di seguito alcuni cenni relativi ad argomenti legati alle Power Line Communications (PLC). Per maggiori informazioni sull’argomento e in particolare sul rumore e le interferenze presenti su questo tipo di canale si rimanda al lavoro [?]. In particolare, nel paragrafo 2.1 viene fornita una breve e generale descrizione della struttura dei sistemi di trasmissione e di distribuzione dell’energia elettrica; nel paragrafo 2.2, invece, viene presentato un conciso quadro relativo alla storia e alle numerose applicazioni delle PLC, con particolare riferimento a quelle attuali. Nel paragrafo 2.3, infine, vengono delineati i principali vantaggi e le più importanti problematiche che caratterizzano oggi questa tipologia di sistemi. 2.1 Sistemi di trasmissione e di distribuzione dell’energia elettrica La struttura di un sistema di trasmissione e di distribuzione dell’energia elettrica [24], [26], [25], è sviluppata su tre livelli gerarchici: • il primo livello, ad alta tensione (HV: High Voltage — da 36 a 300 kV) o ad estremamente alta tensione (EHV: Extremely High Voltage — oltre i 300 kV) connette le centrali di produzione tra loro ed ai luoghi di utilizzo. Esso costituisce una rete a maglia a lunga distanza, i cui rami hanno una lunghezza dell’ordine di decine o centinaia di chilometri, a copertura nazionale od internazionale; • il secondo livello, a media tensione (MV: Medium Voltage — da 1 a 36 kV), alimenta centri abitati, ospedali, centri industriali e commerciali. Esso forma reti a stella, anello o maglia, con linee lunghe unità o alcune decine di chilometri. È caratterizzato da una capillarità sul territorio significativamente superiore rispetto a quella delle reti ad alta tensione; • il terzo livello, a bassa tensione (LV: Low Voltage — al di sotto di 1 kV), porta elettricità ai singoli utenti. Esso realizza reti a capillarità ancora più elevata rispetto a quelle di media tensione, adattate alla distribuzione degli utilizzatori 3 4 2. Comunicazione su linee elettriche Figura 2.1: Schema generale di un sistema di trasmissione e di distribuzione dell’energia elettrica. sul territorio; queste possono essere a stella, anello o maglia. La lunghezza delle linee a bassa tensione è dell’ordine di qualche centinaio di metri. Gli impianti elettrici interni alle abitazioni rientrano in questo livello; essi sono tuttavia di proprietà degli utenti e sono collegati alle linee esterne, appartenenti alle compagnie elettriche fornitrici, attraverso opportuni contatori di energia (Meter Unit). Dal momento che nessun utilizzatore è direttamente connesso alle linee elettriche del primo livello, quest’ultimo viene considerato di sola trasmissione; di contro, il terzo livello è considerato di sola distribuzione, mentre il secondo di trasmissione o di distribuzione, a seconda dei casi. In prevalenza, le reti elettriche operano con segnali a corrente alternata trifase (fanno eccezione i sistemi HVDC: High Voltage Direct Current, utilizzati talvolta nel livello ad alta tensione) e il trasferimento di energia tra due livelli della gerarchia avviene attraverso appositi trasformatori, che consentono una conversione dei valori di tensione. Le linee che trasportano energia elettrica possono essere aeree (realizzate con conduttori tipicamente non isolati, sostenuti da tralicci o pali) oppure in cavo (realizzate con conduttori isolati, sotterranei o sottomarini). La fig. 2.1 riassume i concetti appena esposti. A seconda del Paese, le caratteristiche specifiche dei sistemi di trasmissione e di distribuzione possono variare. Facendo riferimento a parametri che verranno ripresi in seguito, ad esempio, si può dire che in Italia, in Spagna, in Germania (e, in generale, nei paesi europei) la frequenza di rete è pari a 50 Hz (nominali) e gli avvolgimenti di primario e secondario di un trasformatore MV/LV presentano tipicamente una configurazione trifase a triangolo/stella, con centro stella collegato a terra. Dal secondario si irradiano le linee principali a quattro fili (tre fasi e neutro), mentre le singole derivazioni possono essere anche a due fili (fase e neutro) o a tre fili (due fasi e neutro); 2. Comunicazione su linee elettriche 5 Figura 2.2: A sinistra, rappresentazione delle induttanze del secondario di un trasformatore MV/LV in Europa. A destra, rappresentazione del sistema split phase presente negli Stati Uniti e in Giappone (i valori fuori dalle parentesi si riferiscono agli Stati Uniti, i valori fra parentesi si riferiscono al Giappone). tipicamente, il valore efficace di tensione tra fase e fase è di 400 V, mentre tra fase e neutro è di 230 V. Negli Stati Uniti la frequenza di rete è pari a 50 Hz, mentre in Giappone è pari a 50 o 60 Hz, a seconda della regione. Il trasformatore MV/LV è caratterizzato da un primario a due fili (una fase e neutro) e da un secondario a presa centrale a tre fili (due fasi e neutro): tale sistema è detto a fase divisa (split phase system). Negli Stati Uniti, l’utente può disporre di un valore di tensione efficace di 120 V tra fase e neutro oppure di 240 V tra fase e fase; in Giappone, invece, ha a disposizione 100 V efficaci tra fase e neutro oppure 200 V tra fase e fase. Alcune delle considerazioni precedenti sono illustrate nella fig.2.2. Per ragioni storiche, la struttura dei sistemi di trasmissione e distribuzione nei paesi meno sviluppati ricalca quella dei paesi europei o quella degli Stati Uniti. 2.2 Cenni relativi all’evoluzione storica e alle applicazioni attuali delle PLC L’interesse “storico” relativo alla utilizzazione delle linee elettriche come canale trasmissivo per le telecomunicazioni nasce fondamentalmente dalla possibilità di sfruttare un mezzo già cablato (che quindi non richiede costi di installazione) e caratterizzato da una diffusione capillare (che nessuna altra linea su cavo sperimenta). L’utilizzo dei primi sistemi PLC risale intorno al 1920, quando alcune compagnie elettriche introdussero il cosiddetto CFS (Carrier Frequency System) al fine di monitorare lo stato della rete attraverso comunicazioni nelle bande LF e MF (15-500 KHz) su linee ad alta tensione [24]. Intorno al 1930 venne sviluppato il sistema RCS (Ripple Carrier Signalling), che consentı̀ alle compagnie fornitrici di controllare i carichi 6 2. Comunicazione su linee elettriche della rete (load management) attraverso comunicazioni unidirezionali all’interno della banda audio (0,125-3 KHz) su linee a media e bassa tensione [24]. Nei decenni successivi, in particolare tra gli anni ’70 e gli anni ’90, in concomitanza con lo sviluppo dei dispositivi elettronici e delle moderne tecniche di trasmissione digitali, sono stati progettati altri sistemi via via più evoluti, anche bidirezionali. Alcuni di questi hanno operato su linee a alta o media tensione o linee a bassa tensione esterne, con scopi di controllo e manutenzione della rete, gestione dei carichi, nonché di lettura remota dei contatori e, talvolta, di selezione delle tariffe, di pagamento a distanza, di localizzazione dei guasti e dei tentativi di manomissione; si possono citare a proposito i progetti di Thorn-EMI (Inghilterra), Enel (Italia), Datawatt (Olanda) [27]. Altri invece hanno operato su linee a bassa tensione interne alle abitazioni, al fine di controllare in maniera remota e centralizzata (attraverso sensori e attuatori) impianti di illuminazione, sistemi di riscaldamento e di condizionamento dell’aria oppure dispositivi di allarme e di videosorveglianza: questi hanno contribuito allo sviluppo dei settori di building e home automation. E’ possibile menzionare, in riguardo, gli standard X10, Echelon LonWorks, Intellon CEBus [27]. I valori di bit rate dei sistemi prima menzionati (nelle loro prime versioni costruttive) sono contenuti entro qualche decina di migliaia di bit al secondo. Del resto, la norma europea CENELEC2 EN 50065 nel 1991 ha fissato tra 3 e 148,5 KHz la banda disponibile per le trasmissioni sulle linee elettriche, prevedendo una divisione in cinque sottobande, ciascuna caratterizzata da determinati livelli massimi di segnale: pertanto, le massime velocità trasmissive ottenibili erano dell’ordine di 100 Kbit/s [25]. Negli Stati Uniti, la FCC4 Part 15 ha consentito l’utilizzo di una banda apprezzabilmente più ampia (9-490 KHz) [25]; lo stesso è accaduto in Giappone, attraverso la Radio Law (10-450 KHz) [25]. Ad ogni modo, le velocità trasmissive risultavano contenute entro il megabit al secondo. In sintesi, quindi, fino alla fine degli anni ’90 si è assistito allo sviluppo dei cosiddetti sistemi PLC a banda stretta (narrow-band PLC), utilizzati dalle compagnie elettriche per controllare in vario modo la trasmissione e la distribuzione dell’energia elettrica (energy-related services — vedi fig. 2.3) o dai singoli utenti per l’automazione di edifici (building/home automation — vedi fig. 2.4). Alla fine degli anni ’90 si è verificata la caduta dei monopoli nel settore dell’energia e delle telecomunicazioni; parallelamente, si è assistito alla enorme diffusione di Internet e di servizi multimediali sempre più avanzati. Questi fatti hanno fatto sviluppare ulteriori ed assai significative prospettive di utilizzo per le PLC, che hanno condotto alla ricerca e allo sviluppo di sistemi a larga banda (wide-band PLC), caratterizzati da valori di bit rate superiori al megabit per secondo. Nello specifico, la deregolamentazione del mercato delle telecomunicazioni ha aperto la possibilità a nuovi fornitori di servizi di utilizzare il livello a bassa tensione come alternativa per realizzare il cosiddetto “ultimo miglio” (“last mile”) delle reti di accesso. L’opportunità di disporre di una infrastruttura già esistente e diffusa si è presentata (e si presenta tuttora), infatti come assai vantaggiosa sul piano economico, dal momento, in particolare, che la realizzazione di nuove infrastrutture con altre tecniche richiede costi elevati. In questo caso le PLC — costituenti le cosiddette PLC Access Network - si sono trovate (e si trovano tuttora) a competere con altri sistemi di acces- 2. Comunicazione su linee elettriche 7 Figura 2.3: Esempio di struttura di un sistema PLC utilizzato per la fornitura di energy-related services. Figura 2.4: Esempio di struttura di un sistema PLC utilizzato per la building automation. EIB è acronimo di European Installation Bus, standard oggi confluito nel più esteso (sia a livello geografico, sia a livello di contenuto) KNX. 8 2. Comunicazione su linee elettriche Figura 2.5: Esempio di Access PLC Network. so, quali ad esempio quelli della famiglia xDSL (DSL: Digital Subscriber Line) oppure IEEE 802.16 (o WiMAX: Worldwide Interoperability for Microwave Access). La fig. 2.5 illustra un esempio di struttura di rete di accesso basata sull’utilizzo delle PLC; in essa si può notare la presenza di una Base/Master Station, collocata all’interno della cabina di trasformazione MV/LV, che rende possibile l’accesso ai vari utenti del livello a bassa tensione e consente la connettività ad una rete geografica (WAN: Wide Area Network). Un altro settore che ha suscitato (e suscita tuttora) grande interesse è quello del cosiddetto “ultimo metro” (“last meter”): esso è relativo alla implementazione di LAN (Local Area Network) all’interno di edifici ed abitazioni, in grado di connettere numerosi dispositivi ivi presenti. In tale ambito è possibile realizzare sia funzioni di automazione (utilizzando sensori, attuatori e impianti come già visto per i sistemi narrow-band), sia funzioni di comunicazioni veloci e di intrattenimento (con riferimento ad esempio a telefoni, computer, stampanti, impianti video e audio, console per videogiochi, elettrodomestici, interfacce con dispositivi che utilizzanoaltre tecniche trasmissive). E’ interessante osservare come la presenza di imprese concorrenti nel mercato dell’energia, susseguente alla deregolamentazione, abbia portato all’idea di nuovi e più personalizzati energy-related services, quali ad esempio tariffazioni differenziate in base alle esigenze e ai consumi dei vari utenti [24]. Nel campo dell’“ultimo metro”, i sistemi PLC - detti anche in-house o in-home PLC — sono risultati (e risultano oggi) essere supplementari o in competizione con altri sistemi e tecniche, come reti IEEE 802.3, WLAN (Wireless LAN), Bluetooth. Nella fig. 2.6 viene rappresentato un esempio di sistema in-house PLC; in questo è presente una Base Station che coordina l’accesso al mezzo di ciascuno degli apparati collegati alla rete che possiedono un modem PLC. La BS può essere collocata in corrisponden- 2. Comunicazione su linee elettriche 9 Figura 2.6: Esempio di sistema in-house PLC. za del contatore (come illustrato) o in una qualunque altra presa elettrica. Ricerche attuali riguardano la possibilità di utilizzare le PLC nei settori automobilistico, aereo, satellitare, ferroviario, navale, dell’industria mineraria [28], dove, seppur con ulteriori e specifici obiettivi, si cerca ancora una volta di sfruttare le linee elettriche preesistenti per realizzare comunicazioni digitali. Al fine di ottenere sistemi caratterizzati da velocità trasmissive dell’ordine di unità, decine o centinaia di megabit per secondo è necessario disporre di una banda estesa decine di megahertz. In generale, è stato mostrato (sia a livello teorico che a livello sperimentale) come l’intervallo 1†30 MHz offra eccellenti possibilità per le applicazioni prima citate [24]. Dalla fine degli anni ’90, numerosi sono i dispositivi che il mercato ha proposto e che riguardano le applicazioni prima descritte, soprattutto nel settore in-house: oggi, alcuni di questi sono capaci in linea teorica di raggiungere velocità superiori a 100 Mbit/s. Ancora diversi aspetti, tuttavia, devono essere chiariti sulla funzione di trasferimento e sulle interferenze che caratterizzano il canale Power Line. Inoltre, è attesa l’emanazione di standard completi che regolamentino a livello internazionale le comunicazioni su linee elettriche a larga banda (sia in termini di tecniche trasmissive, sia in termini di compatibilità elettromagnetica — vedi paragrafo 2.3), ma al momento essa è solo parzialmente avvenuta. E’ importante sottolineare, in quest’ultimo ambito, l’attività di ETSI, attraverso il suo comitato tecnico Powerline Telecommunications (PLT), iniziata nel 1999 proprio con lo scopo di sviluppare standard e specifiche per la fornitura di servizi di telecomunicazione attraverso le reti elettriche, cercando di evitare interferenze con gli altri utilizzatori dello spettro radio. ETSI ha pubblicato diversi documenti; tra questi ricordiamo in particolare il primo, ETSI TS 101 867 [30], risalente al novembre 2000, in cui si forniscono alcune indicazioni per garantire la coesistenza tra “ultimo miglio” e 10 2. Comunicazione su linee elettriche “ultimo metro”: la modalità base prevede di utilizzare la banda 1,6†10 MHz per l’accesso e la banda 10-30 MHz per sistemi in-house. Si possono citare poi ETSI TR 102 494 [31], emanato nel giugno 2005, dove si definiscono alcune specifiche relative alla realizzazione di modem per comunicazioni in-house, e ETSI TR 102 578 [32], emesso nell’agosto 2008, in cui si specifica un meccanismo per evitare problemi di coesistenza tra modem PLC e sistemi di radiodiffusione nel campo delle onde corte (Short Wave radio broadcasting). E’ assai significativo inoltre ricordare che nel giugno 2005 è stato creato un gruppo di lavoro all’interno di IEEE6, denominato P1901, con lo scopo di sviluppare uno standard per alte velocità (Broadband over Power Line: BPL), maggiori di 100 Mb/s, relativo al livello PHY e al sottolivello MAC del sistema di riferimento ISO/OSI; esso si affianca a P1675 (standard relativo all’installazione e al collaudo di dispositivi PLC, nonché al test e alla verifica dell’hardware normalmente utilizzato — già approvato e pubblicato), P1775 (standard concentrato su specifiche questioni inerenti alla misurazione delle emissioni elettromagnetiche causate da dispositivi PLC — in fase di approvazione) , P2030 (standard contenente linee guida per energy-related services — in fase di sviluppo) e prevede di utilizzare frequenze al di sotto di 100 MHz. Nello specifico, da febbraio 2009 è disponibile una bozza su cui si sta lavorando per combinare le proposte accettate nel dicembre 2008 e provenienti dai tre differenti cluster di lavoro: in-home (IH), access (AC) e coexistence (CX). A quest’ultimo settore è stato dato notevole rilievo, in vista di consentire una interoperabilità tra dispositivi PLC IEEE ed altri dispositivi non conformi a detto standard; in particolare, l’attuale sottogruppo tecnico TSG4 ha presentato nel maggio 2009 una bozza di documento in cui si descrive Inter-System Protocol (ISP), un protocollo che permetterà la comunicazione tra apparati IEEE e apparati realizzati secondo lo standard ITU-T7 G.hn [28], [29], [33]. G.hn, noto anche come G.9960, è infatti un altro importante riferimento: esso è stato approvato da ITU-T nel dicembre 2008 (il gruppo di lavoro corrispondente ha iniziato la sua attività nel maggio 2006) ed è relativo alla realizzazione di reti in-home di prossima generazione su linee elettriche ed altri due tipi di mezzo cablato, doppino telefonico e cavo coassiale. Prevede specifiche nel livello PHY (compresa l’utilizzazione degli intervalli di frequenze 2-100 MHz, 100-200 MHz e 300-2500MHz), in parte del sottolivello MAC e in parte del livello di rete [29]. ETSI, IEEE e ITU-T collaborano con diversi enti in tutto il mondo: limitandosi a citare i nomi di alcuni, ricordiamo l’associazione PLCforum [34], le alleanze industriali HomePlug e HD-PLC (High Definition Power Line Communication), le associazioni commerciali HomeGrid forum, CEPCA (Consumer Electronics Powerline Communication Alliance) e UPA (Universal Powerline Association). HomePlug e HD-PLC hanno emesso a loro volta standard nel passato: HomePlug 1.0, HomePlug AV e HomePlug Command & Control (quest’ultimo a banda stretta) nel primo caso, uno omonimo all’alleanza nel secondo. Da ricordare, infine, la presenza dell’annuale International Symposium on Power Line Communications and Its Applications (ISPLC), che si tiene ogni anno, dal 1997, negli ultimi giorni di marzo o nei primi giorni di aprile, ogni volta in una diversa città. Esso rappresenta un importante momento d’incontro, poiché in questo vengono 2. Comunicazione su linee elettriche 11 presentati i lavori di ricerca che di anno in anno spaziano in tutti i campi relativi alle comunicazioni su linee elettriche. 2.3 Vantaggi e problematiche delle PLC Gli aspetti positivi che accompagnano l’uso delle PLC derivano fondamentalmente dal vantaggio di impiegare per la trasmissione dati un canale di comunicazione che è già cablato e capillarmente diffuso, sia sul territorio che all’interno degli edifici. E’ proprio questo punto infatti che ha motivato fortemente lo sviluppo storico delle comunicazioni su linee elettriche, come già detto nel paragrafo 2.2, e consente oggi di: • avere a disposizione infrastrutture per le telecomunicazioni che sostanzialmente non richiedono costi di installazione aggiuntivi; • fare in modo che, potenzialmente, anche gli utenti situati in aree remote (zone rurali, montane, o in generale difficili da raggiungere) possano facilmente usufruire dei moderni servizi di telecomunicazione; ciò sia nei paesi industrializzati, sia nei paesi in via di sviluppo. Le PLC possono rappresentare quindi uno strumento per combattere il digital divide; • rendere possibile, in linea di principio, la connessione ad Internet o ad una rete locale (comprendente diversi dispositivi elettronici ed elettrici) da una qualsiasi presa di un edificio. Accanto a questi importanti, potenziali vantaggi si trovano però alcune notevoli problematiche, legate al fatto che le linee elettriche sono pensate e realizzate per trasmettere segnali di potenza e non per trasportare informazione; sono dunque notevoli le sfide tecniche da affrontare per ottenere comunicazioni affidabili su questo tipo di mezzo trasmissivo. Con riferimento al livello a bassa tensione (che, come già accennato nel Par. 2.2, è attualmente quello di maggiore interesse per le applicazioni delle PLC) , il mezzo trasmissivo si presenta nel complesso come una interconnessione di diverse linee di trasmissione, ciascuna delle quali è caratterizzata, in generale, da una diversa lunghezza, da una diversa impedenza caratteristica, da una diversa terminazione. Nello specifico, il canale di comunicazione: • mostra una attenuazione crescente all’aumentare della frequenza e della lunghezza delle linee; • rivela una selettività in frequenza, a causa di riflessioni ed echi (multipath propagation) provocati dal disadattamento delle varie interconnessioni e terminazioni, le cui impedenze peraltro variano in generale con la frequenza stessa; • esibisce una tempo-varianza a lungo termine, con riferimento a minuti o ad ore, dovuta alla connessione/disconnessione dei carichi; • esibisce una tempo-varianza a breve termine, con riferimento ad unità o decine di millisecondi, dal momento in cui l’impedenza di svariati tipi di carichi varia in funzione del periodo o del semiperiodo del segnale alternato di potenza; 12 2. Comunicazione su linee elettriche • è affetto, talvolta in maniera anche molto pesante, da numerose interferenze, la cui origine e la cui caratterizzazione sono varie e verranno descritte più in dettaglio nel Cap. 3. A differenza di altri canali di comunicazione, le interferenze non possono essere considerate come un disturbo additivo di tipo AWGN (Additive White Gaussian Noise). La visione d’“insieme” sul canale illustrata nei punti precedenti è stata acquisita soltanto di recente. Il problema dello sviluppo di modelli è stato infatti avvertito in maniera significativa solo con l’avvento delle promettenti prospettive a larga banda per i sistemi PLC, anche perché grazie alla “complessità contenuta” delle applicazioni narrow-band, le ostilità che si verificano in banda stretta furono combattute con alcune tecniche di trasmissione, ad esempio attraverso la modulazione FSK o alcune versioni di quella a spettro espanso (spread-spectrum) [24], [26]. Ulteriori e più approfondite conoscenze si sono mostrate invece necessarie per lavorare su bande di frequenza più ampie, ad esempio fino a 30 MHz, in vista di utilizzare o sviluppare tecniche specifiche che permettano di mitigare in maniera efficace i problemi introdotti dal canale: da qui si comprendono i molteplici tentativi di analisi dell’ultimo decennio. I primi approcci relativi alla descrizione della funzione di trasferimento e delle interferenze, che hanno condotto alle osservazioni sull’attenuazione, sulla selettività in frequenza e sulla tempo-varianza a lungo termine, nonché ad alcune considerazioni sui disturbi additivi, si sono basate sull’ipotesi di un canale LTI (Linear Time-Invariant): tra questi è possibile citare i noti lavori di Philipps, Zimmermann e Dostert [24], [35]. Successivamente, Cañete et al. hanno iniziato a prendere in considerazione anche la tempo-varianza a breve termine, a partire da osservazioni sperimentali condotte su numerosi dispositivi elettrici [36], [37], [38] e sono arrivati a concludere che il canale è non lineare ma approssimabile attraverso un sistema LPTV (Linear Periodically Time-Variant), con periodo pari all’inverso della frequenza di rete. In questi ultimi lavori sono emerse anche importanti considerazioni relative alle interferenze. Nelle fig. 2.7 e 2.8 sono illustrati alcuni dei concetti appena esposti; in esse si può notare una variazione ciclica del comportamento, mostrata in questo caso sul semiperiodo (10 ms) del segnale alternato di potenza. Ad oggi non è ancora presente un modello che riesca ad approssimare in maniera completa, cioè tenendo conto di tutti i punti elencati in precedenza, la funzione di trasferimento di un canale Power Line; consistenti, comunque, sono gli sforzi in quest’ambito di studio. Per rimediare alle difficoltà introdotte dal mezzo trasmissivo, nei sistemi wide-band la scelta della tecnica di modulazione multiportante OFDM (Orthogonal Frequency Division Multiplexing) appare quella più adeguata. Questa infatti presenta numerosi vantaggi rispetto alle altre tecniche potenzialmente utilizzabili; ad esempio, consente di ottenere un’elevata efficienza spettrale e richiede ridotte necessità di equalizzazione in ricezione rispetto a sistemi a singola portante, oppure riesce ad adattarsi meglio rispetto a tecniche spread-spectrum in un ambiente multiutente dove i segnali interferenti provenienti da altri sistemi PLC possono raggiungere livelli elevati. Inoltre, il problema legato all’interferenza interblocco (IBI: interblock interference) può essere agilmente affrontato grazie al prefisso ciclico. Di contro, potrebbero esservi emissioni elettromagnetiche rilevanti (vedi righe successive) nel caso in cui il parametro PAPR (Peak-to-Average Power Ratio) assuma valori troppo elevati [24], [36]. Nei la- 2. Comunicazione su linee elettriche 13 Figura 2.7: Andamento dell’impedenza variabile nel tempo e nella frequenza di un rasoio elettrico. Figura 2.8: Esempio di modulo della funzione di trasferimento di un canale, variabile nel tempo e in frequenza, misurata in un appartamento. 14 2. Comunicazione su linee elettriche vori relativi agli standard IEEE P1901 e ITU-T G.hn (ma anche in quelli di HomePlug e HD-PLC) sono state proposte soluzioni a livello fisico proprio basate sull’utilizzo di alcune versioni della tecnica OFDM [29]. Alle precedenti valutazioni sul canale, si devono aggiungere notevoli problemi di compatibilità elettromagnetica (EMC: Electromagnetic Compatibility): le linee elettriche possono essere infatti considerate come strutture “elettromagneticamente aperte” non protette a sufficienza contro l’emissione di segnali ad alta frequenza, i quali possono interferire con i segnali prodotti da sistemi wireless o da altri sistemi di telecomunicazione, anche PLC, operanti nelle vicinanze e nelle medesime bande di frequenza. Facendo riferimento in particolare alla banda 1-30 MHz, numerose sono le comunicazioni radio che possono risultare disturbate: tra queste, quelle relative a servizi di radiodiffusione nel campo delle onde medie e corte (Medium e Short wave), a radio amatori, alla radio astronomia, ai settori aeronautico, marittimo e militare. L’argomento relativo alla EMC è da sempre piuttosto “scottante”: senza entrare nel dettaglio, ci si limita ad accennare che il processo di emanazione di standard internazionali che stabiliscano i limiti di emissioni per gli apparati PLC è tuttora in atto; esso ha conosciuto nel passato un decorso lento, sia a causa di discordanze verificatesi in fase di approvazione dei documenti, sia a causa di difficoltà tecniche legate a questa tecnica di comunicazione. Ulteriori particolari sull’argomento sono disponibili ad esempio nei riferimenti [24], [25], [26]. Capitolo 3 Implementazione con processori DSP 3.1 Architettura del sistema Le caratteristiche del canale powerline descritto nel capitolo 2, in particolare la restrinzione giuridica della banda fra [1;30]MHz, rende appetibile l’architettura hardware per trasmettitore e ricevitore nota come “direct digital synthesis”. In tale architettura la parte analogica è ridotta al minimo e anche le operazioni di conversione in frequenza (tradizionalmente implementate con mixer analogici) sono effettuate in digitale; in particolare le uniche parti analogiche sono a lato trasmettitore l’amplificatore di potenza (power amplifier - PA) e a lato ricevitore l’amplificatore a basso rumore (low noise amplifier - LNA). Nella figura 3.1 è mostrata l’architettura del sistema sviluppato basata su digital signal processor (DSP). Tale dispositivo hardware si distingue dalle MCU per la sua predisposizione, a livello di instruction set, al digital-signal processing; in un DSP sono quindi presenti ALU estremamente avanzate e veloci e anche istruzioni più di alto livello quali, ad esempio, quelle dedicate alla codifica e decodifica di codici a correzione di errore (tramite campi di Galois). Rispetto ai dispositivi FPGA i DSP hanno il vantaggio di essere più “familiari” ai programmatori in quanto sono comunque processori che eseguono istruzioni compilate; difatti è comune usare il linguaggio C per programmare i DSP. Questo comporta anche che sono facilmente reperibili un vasto numero di risorse pronte per DSP: dalle librerie di supporto ottimizzate agli strumenti di debug e profiling del codice. Come sarà meglio esplicato nel capitolo 4, le FPGA, invece, non eseguono alcun programma: sono dispositivi intrinsecamente paralleli e una volta configurate sono equivalenti ad un circuito logico sequenziale. Ad ogni transizione del segnale di clock contemporaneamente migliaia o milioni di celle digitali (flip-flop, latch, registri) elaborano il segnale in ingresso. Le FPGA pur essendo quindi potenzialmente più versatili sono in generale più difficili da programmare e da debuggare. Per questo motivo, per la disponibilità dell’hardware e anche per il lavoro pre15 16 3. Implementazione con processori DSP Figura 3.1: Architettura hardware del modem basato su DSP con dettagli sulle interconnessioni. 3. Implementazione con processori DSP 17 cedentemente svolto sui DSP (si veda, ad esempio, [5] e [6]) si è inizialmente scelta l’architettura mostrata nella figura 3.1. Una ulteriore importante caratteristica dell’architettura scelta che può sfuggire ad una prima analisi è la mancanza di alcun anello di retroazione analogico; in particolare la frequenza di campionamento del convertitore analogico-digitale (ADC) del ricevitore è indipendente dal segnale ricevuto. Tale caratteristica è nota come “non-synchronous sampling clock” [8]; da una parte ciò semplifica il sistema, ma dall’altra richiede l’utilizzo di un interpolatore nel ricevitore. Per maggiori informazioni si rimanda alla sezione 3.6. Si noti infine che la figura 3.1 indica non solo le generiche interconnessioni fra DSP, computer e blocchi analogici (LNA e PA) ma anche vari parametri elettrici utili per la progettazione di questi ultimi. Per maggiori informazioni relative alla modellizzazione del canale powerline e delle impedenze di ingresso/uscita del canale, si rimanda a [9]. 3.2 3.2.1 Generalità sui sistemi OFDM Breve introduzione La tecnica OFDM (Orthogonal Frequency Division Multiplexing) è uno schema di modulazione digitale multi-portante che si avvale di un alto numero di sottoportanti ortogonali affiancate in frequenza per conseguire un’elevata efficienza spettrale. Ciascuna sotto-portante è modulata usando uno schema di modulazione convenzionale (ASK, PSK, FSK, QAM, etc) con una frequenza di simbolo relativamente bassa. La frequenza dati complessiva risulta paragonabile con la frequenza che si può ottenere usando nella stessa banda una modulazione a singola portante. I principali vantaggi dell’OFDM rispetto modulazioni a singola portante sono: • capacità di adattarsi a canali estremamente disturbati senza richiedere una equalizzazione troppo complessa; • robustezza nei confronti del fenomeno del multipath; • estrema efficienza nel caso di fading selettivo in frequenza; • elevata efficienza spettrale; • implementazione efficiente tramite FFT e IFFT; • necessità di un singolo oscillatore locale, sia nel ricevitore che nel trasmettitore, per generare tutte le sottoportanti. Tutte queste sue caratteristiche hanno fatto sı̀ che tale tecnica di modulazione ortogonale multiportante sia stata suggerita e standardizzata per una grande varietà di applicazioni, tra cui: • broadcasting terrestre e satellitare di audio digitale (DAB); • broadcasting terrestre e satellitare di video digitale (DVB-T, DVB-H, etc); 18 3. Implementazione con processori DSP • ADSL e VDSL su “doppino telefonico”; • wireless LAN (IEEE 802.11a/g, IEEE 802.16, IEEE 802.20); • ultra wideband (nell’implementazione WiMedia Alliance); • comunicazioni su power-lines. Questa tecnica di modulazione ha però i suoi svantaggi dato che: • è molto sensibile alle differenze di frequenza fra gli oscillatori locali del trasmettitore e ricevitore (dovuto al mismatch intrinseco degli oscillatori e all’effetto Doppler ); • è sensibile agli errori di temporizzazione nel campionamento; • non permette un utilizzo efficiente della potenza in trasmissione a causa della richiesta di amplificatori lineari (necessari per l’elevato Peak-To-Average-Ratio, PAPR, di potenza). Data la sua grande rivelanza pratica si sono sviluppate nel corso del tempo numerose soluzioni per limitare l’effetto degli svantaggi elencati precedentemente, alcune delle quali (quelle riguardanti gli errori in frequenza) saranno esposte nel capitolo 3.3. 3.2.2 Principi del sistema OFDM Per comprendere il sistema OFDM si consideri anzitutto l’equivalente in banda base di un segnale MCM (Multicarrier Modulation). Il segnale multiportante è descritto in linea di massima dallo schema della figura 3.2, in cui i simboli d’ingresso {an } appartengono tipicamente all’alfabeto di una modulazione lineare M-PSK e sono caratterizzati da una velocità di segnalazione Rs = 1/Ts (con Ts che indica il tempo di simbolo). Tale schema mostra che il flusso dei simboli in ingresso è suddiviso in N sottocanali paralleli, ciascuno dei quali è caratterizzato da un intervallo di simbolo T = N Ts . Inoltre il convertitore serie-parallelo partiziona i simboli d’ingresso in blocchi di durata pari a N simboli di sorgente. L’equivalente in banda base di un segnale OFDM rispetto a f0 è perciò S(t) = ∞ N−1 l=−∞ n=0 j2πnfsc t a(l) n p(t − lN Ts )e 0tT (3.1) dove p(t) è la risposta impulsiva del modulatore, fsc indica momentaneamente la (l) spaziatura delle sottoportanti e dove i simboli di sorgente {an } sono normalizzati (l) a potenza unitaria (E{|an |2 } = 1). Lo schema del demodulatore ottimo del generico sottoflusso K −esimo, in presenza di rumore AWGN ed in assenza degli effetti di interferenza dovuti agli altri sottocanali è mostrato nella figura 3.3. 3. Implementazione con processori DSP × Rate = 1 / NT c0 19 (m) exp{ j 2π 0 f sc t } cn = cmN + k × S/P exp{ j 2π 1 f sc t } Rate= 1 / T x( t ) ∑ × c ( m ) N −1 exp{ j 2π ( N −1 ) f sct } Figura 3.2: Schema generale di un sistema MCM. r( t ) × ( m +1 )T s ∫ ( • )dt cˆ k( m ) mT s exp{ − j 2πkf sc t } Figura 3.3: Demodulatore ottimo per un generico sottoflusso. 20 3. Implementazione con processori DSP Tale schema prevede la conversione in banda base del segnale, il passaggio attraverso un filtro adattato con campionamento e la decisione a soglia finale. La variabile di decisione sul simbolo della sottoportante K − esima è data dalla seguente espressione 1 T (0) zk = r(t)e−j2πkfsc t dt (3.2) T 0 dove r(t) è il segnale ricevuto. La presenza degli altri sottocanali introduce inevitabilmente una interferenza nella decisione; in particolare, l’effetto della presenza del sottocanale i, con i = k, sulla variabile di decisione del ricevitore ottimo per il canale k, è dato da T (0) (0) Ii,k = ai ej2πifsc t e−j2πkfsc t dt 0 j2π(i−k)fsc T (0) e = ai −1 j2π(i − k)fsc dove si è considerato l’intervallo di segnalazione con l = 0 e trascurato l’effetto del rumore. Questa interferenza si annulla quando fsc T = q (3.3) con q intero, cioè quando le sottoportanti sono ortogonali: ovviamente conviene scegliere q il più piccolo possibile per mantenere le sottoportanti vicine e quindi limitare la banda del segnale modulato. Visto che il q più piccolo è pari all’unità, risulta che fsc = 1 1 = T N Ts (3.4) Con questa scelta ed in queste condizioni la modulazione prende il nome di OFDM ed ha la minima occupazione spettrale: per ricostruire il flusso dati originario, occorrerà riformattare il flusso da parallelo a seriale con un convertitore P/S duale di quello della figura 3.2. Occorre ora trovare una struttura efficiente di modulatori e demodulatori OFDM che implementino le operazioni appena descritte. 3.2.3 Analisi strutturale di un sistema OFDM La struttura del trasmettitore OFDM è illustrata nella figura 3.4. Si suppone di trasmettere uno stream seriale con rate 1/Ts di simboli M-PSK appartenenti all’alfabeto k ej2π M , k = 0, 1, ..., M − 1 (3.5) che viene suddiviso in blocchi di lunghezza N − NSC . Come vedremo ciascun simbolo viene affidato ad una diversa sottoportante. Il blocco l-esimo è composto da N − NSC simboli di informazione e da NSC simboli nulli ed é rappresentato dal vettore (l) (l) (l) (l) aN a0 , a1 , . . . , aN−1 (3.6) S/P N − N SC Add Virtual Carriers 21 bk IDFT N ... Signal Mapper ... Data In ... 3. Implementazione con processori DSP P/S Add Pre/Postfix ck s (t ) p(t ) N Figura 3.4: Diagramma a blocchi del trasmettitore OFDM. detto F requency Domain Symbol. Un simbolo OFDM è quindi composto da N simboli dati, trasmessi in un intervallo temporale pari a T = N TS . Le sottoportanti su cui sono trasmessi i simboli di sorgente hanno frequenza fn = f0 + n N Ts (3.7) dove f0 è la frequenza di riferimento ed n é un numero intero. (l) La sequenza an va poi all’ingresso di un sottosistema per il calcolo della IDFT; tale sottosistema produce il blocco N -dimensionale di simboli di linea caratterizzato dal vettore (l) (l) (l) (l) (3.8) bN b0 , b1 , . . . , bN −1 detto T ime Domain Symbol. Esiste allora una corrispondenza biunivoca tra simboli nel dominio del tempo e nel dominio della frequenza, corrispondenza riassunta dalla relazione (l) bk ⇐⇒ a(l) (3.9) n (l) (l) si possono ricavare i simboli an Pertanto in ricezione una volta noti i dati bk effettuando una semplice operazione di DFT. Se si effettua una modulazione numerica (l) dei bk si consegue una drastica semplificazione del trasmettitore e ricevitore. Solitamente si sceglie un valore di N che sia pari a una potenza di 2 in modo da poter usare algoritmi veloci di FFT e IFFT. Si ha allora che (l) bk N−1 1 (l) j2π nk (l) = IF F T aN √ an e N k N n=0 k ∈ {0, 1, . . . , N − 1} (3.10) √ ove il termine 1/ N è un fattore di normalizzazione che serve per ottenere la trasmissione di simboli a potenza unitaria. Tale fattore può essere facilmente ricavato come segue N−1 N−1 (n−i)k (l) 2 (l)∗ 1 = E bk = E a(l) a ej2π N = N C2 (3.11) n i n=0 i=0 Poichè i simboli sono incorrelati e con valor medio nullo si ha 2 (l) (l)∗ E an ai = C2 δ(i − n) e C2 = E a(l) n √ da cui segue che il termine di normalizzazione è 1/ N . (3.12) 22 3. Implementazione con processori DSP Consideriamo adesso la trasmissione di un solo blocco OFDM (vedi la figura 3.4). Il segnale in banda base é espresso dalla relazione s(t) = N−1 n=0 bn p(t − nTs ) (3.13) ove p(t) é l’antitrasformata di Fourier di un segnale di Nyquist a radice di coseno rialzato con energia unitaria e roll-off α; in pratica p(t) ha una durata pari a Lp ≪ N intervalli di simbolo. Definiamo inoltre gN (t) = p(t) ⊗ p(−t) (3.14) ed indichiamo con w(t) il rumore AWGN dopo il filtro adattato. Il segnale a monte del campionatore è r(t) = N−1 k=0 bk gN (t − kTs ) ⊗ h(t) + w(t) (3.15) Dopo il campionatore, supponendo che gli istanti di campionamento siano ti = iTs con i ∈ {0, 1, . . . , N − 1} e trascurando l’errore di sincronizzazione di clock, si ha r(iTs ) = N −1 k=0 bk gN ((i − k)Ts ) ⊗ h(iTs ) + w(iTs ) (3.16) da cui, semplificando la scrittura, ri = N−1 bk qi−k + wi (3.17) k=0 dove qi−k = gN ((i − k)Ts ) ⊗ h(iTs ). Dopo il campionatore, in ricezione, si incontra il dispositivo che svolge la FFT, la cui uscita vale N−1 N −1 N−1 il 1 1 j2π nk √ ul = √ an e N qi−k + wi e−j2π N N i=0 k=0 N n=0 = N−1 N −1 N−1 N −1 N−1 (nk−il) il 1 1 an qi−k ej2π N + √ wi e−j2π N N N i=0 k=0 i=0 k=0 n=0 (3.18) Per mettere in evidenza il contributo dell’ISI in ul riscriviamo la (3.18) come ul = al N−1 N−1 N −1 N−1 N −1 (k−i)l (nk−il) 1 1 qi−k ej2π N + an qi−k ej2π N + zl N N n=0 i=0 k=0 (3.19) i=0,i=l k=0 ove zi é una variabile aleatoria (v.a.) a media nulla e varianza 2N0 . Se definiamo Ql (p) = N −1 N−1 pk−il 1 qi−k ej2π N N i=0 k=0 (3.20) 3. Implementazione con processori DSP − N1 23 N −1 0 simbolo ' time domain' prefix ( N − 1) + N 2 postfix Figura 3.5: Blocco esteso ciclicamente. si ha ul = al Ql (l) + an Ql (n) + zl (3.21) n=l Da qui si può osservare che se il canale è piatto i termini qi−n ≡ 1 solo per n = i e zero altrove cioè 1 se k = l Ql (k) = (3.22) 0 ∀k = l Con canale selettivo le relazioni appena scritte non sono in genere verificate: ci sono quindi vari k per cui Ql (k) = 0 e questi sono all’origine dell’effetto di ISI. Mediante la periodicizzazione del segnale il sistema OFDM può eliminare questo fenomeno. 3.2.4 Periodicizzazione del segnale In trasmissione dopo aver calcolato la IFFT, un cyclic prefix e un cyclic postfix di (l) lunghezza N1 e N2 , rispettivamente, sono aggiunti al vettore bN per formare nel complesso un blocco esteso ciclicamente (l) (l) (l) (l) (l) (l) cNT c−N1 , . . . , c−1 , c0 , . . . , cN , . . . , cN +N2 −1 (3.23) di lunghezza complessiva pari a NT N1 + N + N2 simboli. (l) Il prefisso ciclico è una replica degli ultimi N1 simboli di bN , e il suffisso ciclico è una replica dei suoi primi N2 simboli, come mostrato nella figura 3.5: cosı̀ il generico (l) elemento di cNT può essere scritto come (l) (l) ck = b|k| N k = −N1 , . . . , N + N2 − 1 (3.24) dove |k|N identifica il resto della divisione fra interi di k per N. Quindi ragionando come sopra, l’equivalente in banda base all’uscita del modulatore è espresso dalla relazione s(t) = +∞ N+N 2 −1 l=−∞ k=−N1 (l) ck p (t − kTs − lNT Ts ) che rappresenta la forma d’onda che è trasmessa sul canale multipath. Nel seguito faremo le seguenti ipotesi semplificative: (3.25) 24 3. Implementazione con processori DSP • Le variazioni del canale sono irrilevanti all’interno di ogni blocco di dati trasmesso (canale quasi-stazionario). Chiameremo hl (t) la risposta impulsiva del canale durante la trasmissione dell’l-esimo blocco (hl (t) = h(t) per un canale stazionario); • La funzione hl (t) (e la corrispondente risposta in frequenza Hl (f )) è deterministica oppure è un processo stocastico gaussiano; • Recupero ideale della frequenza della portante conseguito fuori dallo schema a blocchi del ricevitore della figura 3.4. La prima ipotesi è realistica per sistemi OFDM standard con elevata bit rate, come quelle previsto per il servizio DVB-Terrestrial, nel quale la selettività nel tempo del canale può essere trascurata per parecchi blocchi consecutivi. In generale, comunque, la validità di tale approssimazione dipende dalla larghezza di banda Doppler BD del canale multipath, normalizzata con la block rate dell’OFDM 1/NT Ts ; il canale multipath può essere considerato stazionario all’interno di un blocco se BD NT Ts 0.01 Possiamo ora scrivere il segnale ricevuto nella forma r(t) = +∞ N+N 2 −1 l=−∞ k=−N1 (l) ck ql (t − kTs − lNT Ts ) + n(t) (3.26) dove ql p(t) ⊗ hl (t) e rappresenta l’impulso p(t) trasmesso sul canale h(t). In particolare si nota che ql (t) è proprio l’impulso elementare della trasmissione del flusso di dati a tempo di simbolo OFDM T, cosı̀ come viene ricevuto dal demodulatore. Questo impulso ha, in generale, una durata maggiore di TLp = Lp Ts per effetto della distorsione di canale: se la risposta impulsiva del canale ha durata finita pari a Th , la durata di ql (t) è pari a TLp + Th ed è allora possibile evitare l’ISI causata dal canale, spaziando i simboli OFDM di un intervallo maggiore di T , e precisamente aumentando di una quantità Tg chiamata intervallo di guardia. Tale stratagemma, però, peggiora l’efficienza spettrale del sistema, in quanto, dovendo mantenere una velocità d’informazione costante, introdurre un intervallo di guardia diverso da zero significa ridurre il tempo di simbolo OFDM T e quindi aumentare la banda utilizzata sul canale (grosso modo pari a N/T ). Comunque, visto che i ritardi massimi che si incontrano nelle bande di interesse, quando la propagazione avviene per cammini multipli, sono dell’ordine di qualche decina di µ sec e che l’intervallo di simbolo è pari a qualche centinaio di µ sec, la perdita di efficienza è modesta. Questa caratteristica di poter trattare facilmente canali con echi aventi ritardi notevoli permette di risolvere anche una questione importante in una rete di radiodiffusione: infatti, il meccanismo di protezione dal multipath funziona sia nel caso in cui l’eco si produca naturalmente come discusso finora, ma anche nel caso in cui l’eco provenga da un diverso ripetitore della stessa rete operante sulla stessa frequenza (eco artificale). Questo semplifica notevolmente il progetto e l’esercizio delle cosiddette reti a singola frequenza (SFN ) per la diffusione di un canale televisivo su di un unica frequenza a diffusione regionale o nazionale. Si può osservare che i ritardi di canale 3. Implementazione con processori DSP DFT N e − j 2π∆fˆk Equalizer Detector Data Out ... S/P Remove Virtual Carriers ... tk N − N SC Remove Pre/Postfi x P/S N Ts M Offset Estimator ... xk ... x (t ) Matched Filter ... r (t ) 25 Figura 3.6: Schema a blocchi del ricevitore OFDM. “artificiali ” di una SFN sono in generale assai maggiori di quelli “naturali ” introdotti dal canale multipath e quindi i requisiti dell’intervallo di guardia devono essere adattati al caso in esame. Lo schema a blocchi del ricevitore è illustrato nella figura 3.6. Si assuma che l’mesimo blocco sia quello elaborato dal ricevitore; il segnale attraversa dapprima il filtro adattato p(−t), poi è campionato alla frequenza della symbol rate all’istante tn,m = (mNT + n) Ts + τ̂ m n = −N1 , . . . , N + N2 − 1 (3.27) dove τ̂ m è l’m-esima stima locale del ritardo totale di propagazione nel canale τ . L’n-esimo campione dell’m-esimo blocco all’uscita del filtro adattato è xm [n] = +∞ N+N 2 −1 (l) ci fl (tn−i,m−l + εm Ts ) + wm [n] l=−∞ i=−N1 dove n = −N1 , . . . , N + N2 − 1 (3.28) p(−t) fl (t) ql (t) ⊗ Ts εm τ̂ m − τ Ts (3.29) Si può dimostrare che la lunghezza di fl (t) misurata in intervalli di simbolo, è minore di 2Lp + Lds , dove Lds indica il massimo delay spread del canale (solitamente Lds ≪ N ). La presenza di un canale multipath genera, nel dominio del tempo, ISI (InterSymbol Interference), dovuta sia all’interferenza tra simboli OFDM consecutivi (IBI, InterBlock Interference), che all’interferenza tra simboli all’interno dello stesso blocco (IntraBlock Interference). L’interferenza interblocco è rappresentata dai termini della (3.28) con l = m, mentre quella di intrablocco è data dai termini con l = m, i = n. In particolare l’interferenza intrablocco può determinare ICI (InterCarrier Interference) nel dominio della frequenza. Gli effetti ora citati sono facilmente eliminabili o comunque minimizzabili attraverso l’aggiunta del prefisso e del suffisso purchè la somma delle loro lunghezze sia N1 + N2 2Lp + Lds (3.30) É per tale ragione che a volte la somma N1 + N2 definisce il cosiddetto guard time. Se è vera quest’ultima disuguaglianza, l’IBI può essere rimossa eliminando i primi N1 e gli ultimi N2 campioni dalla sequenza {xm [n]}. L’approccio dell’intervallo di guardia ha uno svantaggio che deve essere preso in seria considerazione, e cioè che per poter 26 3. Implementazione con processori DSP effettuare corrrettamente la demodulazione, in particolare per poter correttamente calcolare la F F T , il ricevitore deve esattamente allinearsi alla parte utile del simbolo OFDM ignorando l’intervallo di guardia. Questa esigenza pone vincoli molto stretti nei confronti della “sincronizzazione di simbolo” nel ricevitore. Modificando leggermente il formato del segnale modulato, è possibile ottenere un buon funzionamento del ricevitore anche con errori di sincronizzazione di timing non trascurabili, purchè naturalmente di entità limitata. La modifica consiste proprio nel riempire l’intervallo di guardia con una estensione ciclica del simbolo OFDM in modo tale da emulare una condizione in cui il segnale all’ingresso del canale sia periodico di periodo T (cioè S(t) = S(t + T ) ). Naturalmente, affinchè la condizione di pseudo periodicità si verifichi, l’intervallo di guardia deve essere allungato di un fattore pari proprio al massimo errore di sincronismo di clock che si desidera tollerare. L’osservazione appena fatta porta tuttavia ad un risultato tanto più corretto se l’errore di sincronizzazione del blocco εm è inferiore a |εm | N1 + N2 − (2Lp + Lds ) (3.31) Quando tale condizione è verificata, grazie all’estensione ciclica del blocco, l’errore di timing si traduce solo in una rotazione di fase lineare all’uscita della FFT. Dopo la rimozione del prefix e del postfix, i campioni all’ingresso della FFT per l’m-esimo blocco sono xm [n] = N+N 2 −1 i=−N1 (m) ci fm ((n − i) Ts + εm Ts ) + wm [n] n = 0, . . . , N − 1 (3.32) Per semplificare la notazione sarà tralasciato nel seguito l’identificatore di blocco m. La componente del segnale x [n] può essere vista come l’uscita di un filtro FIR con risposta impulsiva fε [n] f ((n + ε) Ts ) (3.33) Questo filtro è alimentato dalla sequenza cNT che è l’estensione ciclica di bN : quindi l’uscita del filtro osservato nell’intervallo n = 0, . . . , N − 1 è esattamente la stessa che si avrebbe qualora in ingresso ci fosse la vera sequenza periodica . . . bN bN bN . . . All’uscita della FFT si ha N−1 nk 1 √ X [k] = (F F T (xN ))k = x [n] e−j2π N =0 N n=0 = (F F T (bN ))k · (F F T (fε,N ))k + (F F T (wN ))k = ak F̃ε [k] + W [k] k = 0, 1, . . . , N − 1 (3.34) dove si è indicato con (F F T (v))k il k-esimo elemento nella F F T del vettore v; i termi- k ni F̃ε [k] F̃ε NT sono campioni della trasformata di Fourier F̃ε (f ) della sequenza s aperiodica fε [n] e, grazie alle proprietà di ortogonalità e conservazione dell’energia della FFT, {W [k]} è una sequenza gaussiana statisticamente equivalente a {w [n]}. 0 ak = √1 N N−1 n=0 bn exp(−j2π nk ) =⇒ N N−1 n=0 √ bn exp(−j2π nk ) = ak N N 3. Implementazione con processori DSP 27 2.5 2 ( Fε f i Ts ) 1.5 i=−1 i=0 Ts 1 i=1 . 0.5 1 NTs 0 −2 −1.5 −1 −0.5 0 fTs 0.5 1 1.5 2 Figura 3.7: Ripetizioni periodiche della trasformata di Fourier della risposta del canale. Come noto, la trasformata di Fourier di una sequenza può essere scritta come F̃ε (f ) +∞ 1 i Fε (f − ) Ts Ts (3.35) i=−∞ dove Fε (f ) F (f ) exp(j2πf εTs ) e F (f ) é la trasformata continua di Fourier della risposta impulsiva totale del canale. Se ricordiamo che p(t) è un impulso di Nyquist con spettro avente un coseno rialzato con roll-off α possiamo raffigurare la relazione precedente su di un intervallo di frequenze attorno all’origine (figura 3.7). Dalla figura 3.7 si può facilmente osservare che l’unico termine che ci interessa è i = 1. Se si k campiona l’espressione di F̃ε (f ) alla frequenza NT si ha che s ε k 1 k 1 j2π NkT − T1 εTs j2πk N s s F e +F − e (3.36) F̃ε [k] = Ts N Ts N Ts Ts Poiché, per la forma di un impulso di Nyquist, la serie (3.35) si trasforma in una somma di due addendi soltanto. Se definiamo1 Nα int N 1−α si ha che 2 ε 1 F NkTs ej2πk N , 0 k Nα T s (k−N)ε ε 1 k j2πk N j2π N F̃ε [k] = + T1s F k−N , Nα < k < N − Nα Ts F N Ts e N Ts e (k−N)ε 1 k−N j2π N , N − Nα k N − 1 Ts F N Ts e (3.37) 1 Il simbolo int [x] denota la parte intera del numero x 28 3. Implementazione con processori DSP Figura 3.8: Andamento a coseno rialzato. Come si può notare i simboli con 0 k Nα e N −Nα k N −1 subiscono, a causa dell’errore di sincronizzazione ε, solo una variazione di fase, mentre per Nα k N − Nα viene introdotto un errore di fase e ampiezza: per questa ragione e per problemi di semplicità realizzativa del ricevitore si preferisce non associare informazione ai simboli relativi a questa zona centrale. Le portanti corrispondenti sono dette portanti soppresse poiché ad esse viene associato un simbolo nullo, cioé ak = 0 k = Nα + 1, . . . , N − Nα − 1 (3.38) Si hanno quindi NSC N − 1 − 2Nα portanti soppresse. Questa scelta implica necessariamente una qualche perdita di efficienza poichè NSC sottoportanti non sono utilizzate per la trasmissione dei dati utili. In tal modo, tuttavia, il segnale ricevuto non é sensibile all’errore di temporizzazione. Se si osserva che Nα 1−α NSC 2α (3.39) con qualche semplice passaggio algebrico2 si ottiene : α NSC N (3.40) É importante osservare che l’eccessiva riduzione di α, per minimizzare la perdita di efficienza dovuta alla presenza delle portanti soppresse, non è conveniente. Infatti ciò comporta un aumento di lobi secondari rilevanti nell’impulso di Nyquist e conseguentemente un aumento della lunghezza del preambolo e postambolo (prefix e postfix ) per conservare la periodicizzazione. 2 Si osserva che 2Nα è il numero di portanti utili, e che N−NSC N 1−α 3. Implementazione con processori DSP 29 Figura 3.9: Regione di soppressione delle portanti. 3.2.5 Rappresentazione di un segnale OFDM Considerando la trasmissione di un singolo blocco, il segnale OFDM trasmesso in banda base é espresso da s(t) = N2 +N −1 k=−N1 ck g(t − kTs ) (3.41) ove N−1 nk 1 ck √ an ej2π N N n=0 , − N1 k N2 + N − 1 (3.42) Sostituendo la (3.42) nella (3.41) si trova s(t) = = 1 √ N N2 +N−1 N −1 k=−N1 n=0 nk an ej2π N g(t − kTs ) N−1 1 √ an fn (t) N n=0 (3.43) dove si è indicato fn (t) N2 +N−1 k=−N1 nk ej2π N g(t − kTs ) (3.44) 30 3. Implementazione con processori DSP Verrà ora studiata la funzione fn (t) limitatamente all’intervallo di osservazione 0 t N Ts . Se il prefisso ed il suffisso hanno lunghezze N1 e N2 tali che k < −N1 g(t − kTs ) = 0 per (3.45) k > N2 + N − 1 che equivale a g(t) = 0 per t ∈ / [−N2 Ts , N1 Ts ], allora la (3.44) può essere riscritta come +∞ nk fn (t) = ej2π N g(t − kTs ) , 0 t N Ts (3.46) k=−∞ La (3.46) è periodica in t di periodo T = N Ts e può essere posta nella forma (con la posizione k = N l + i) fn (t) = +∞ N−1 l=−∞ i=0 ni ej2π N g(t − iTs − lT ) (3.47) Sviluppando la funzione fn (t) in serie di Fourier si ha fn (t) = +∞ Fn (m)ej2π mt T fn (t)e−j2π mt T (3.48) m=−∞ ove 1 Fn (m) T T dt (3.49) 0 Inserendo la (3.47) nella (3.49) si ottiene N−1 mt 1 j2π ni +∞ N e g(t − iTs )e−j2π T dt = T i=0 −∞ −j2πf iTs G(f )e m Fn (m) = (3.50) f= T N−1 1 m j2π n−m N G e T T = (3.51) i=0 Effettuando la somma in (3.51) si ricava N −1 i=0 j2π n−m N e = N 0 se m = n + N k altrimenti (3.52) Sostituendo la (3.51) nella (3.48) e tenendo conto della (3.52) si ottiene: fn (t) = = +∞ m mt 1 G ej2π T δ(m − n − N k) Ts m=−∞ T +∞ n 1 k n j2π Tk + T t s e G + , Ts m=−∞ Ts T 0 t N Ts (3.53) 3. Implementazione con processori DSP 31 Figura 3.10: Spettro dell’impulso di Nyquist. dove si è sostituito m = n + N k. Quindi fn (t) è in genere composta da un numero infinito di oscillazioni, ciascuna separata in frequenza di T1s . Se G(f ) è un impulso a coseno rialzato di roll-off α, esso ha l’andamento illustrato nella figura 3.10. In tal caso si ha j2π nt T e −j2π Tt 1 n n sG G + e fn (t) = Ts T T − ej2π (n−N)t T 1 Ts , 0 n Nα j2π nt T e , Nα < n < N − Nα , N − Nα n N − 1 (3.54) (1−α) dove si è indicato Nα N 2 . Se le portanti nella zona di roll-off vengono soppresse la (3.43) diventa: 1 s(t) = √ N Nα nt n=−Nα a|n|N ej2π T , 0 t N Ts (3.55) Se il segnale s(t) è trasmesso su un canale con risposta in frequenza C(f ), allora quanto detto vale ancora pur di sostituire G(f ) con H(f ) G(f ) · C(f ). Il segnale al ricevitore dopo il filtro adattato è 1 x(t) = √ N Nα n=−Nα a|n|N C n T nt ej2π T + w(t) , 0 t N Ts (3.56) 32 3. Implementazione con processori DSP 3.3 Sincronizzazione nei sistemi OFDM I sistemi OFDM hanno numerosi e importanti vantaggi; come già accennato però il rovescio della medaglia è l’elevata sensibilità di tali sistemi nei confronti degli errori di temporizzazione. In un ricevitore infatti tutti i parametri temporali e frequenziali (istante di inizio trasmissione, esatta frequenza di campionamento e di portante, etc etc) utilizzati a lato trasmettitore nonchè il ritardo di fase e la distorsione introdotta dal canale sono incogniti; questo comporta che mediante opportuni algoritmi si debbano stimare tutte quelle quantità. L’insieme delle tecniche che il ricevitore usa per riuscire a demodulare correttamente il segnale ricevuto sono genericamente chiamate tecniche di sincronizzazione; senza di esse il ricevitore non sarebbe assolutamente in grado di funzionare. In questo capitolo dapprima si analizzeranno in dettaglio le cause e gli effetti dei vari problemi causati dai parametri incogniti; verranno poi prese in considerazioni le tecniche documentate in letteratura per eliminarli (ovvero le suddette tecniche di sincronizzazione). 3.3.1 Effetto di un offset in frequenza della portante Il primo compito che deve eseguire un ricevitore è la conversione del segnale a radio frequenza ricevuto nel corrispondente segnale in banda base. Qualora la frequenza utilizzata per eseguire la conversione in basso non corrisponda a quella utilizzata per eseguire la conversione in alto, si introduce una non idealità nota come Carrier-Frequency-Offset (CFO). L’offset di frequenza di portante (Carrier Frequency Offset - CFO) ha due cause principali: 1. mismatch intrinseco degli oscillatori locali al quarzo del trasmettitore e del ricevitore. Tutti i moderni sistemi elettronici utilizzano infatti un anello ad aggancio di fase (Phase Locked Loop - PLL) per generare un segnale preciso ad una certa frequenza f0 ; tale dispositivo permette di realizzare una moltiplicazione di frequenza: avendo a disposizione un riferimento frequenziale frif preciso, tipicamente un oscillatore al quarzo, con un PLL si può moltiplicare tale riferimento fino al valore desiderato f0 = N frif . L’uso del PLL è necessario perchè gli oscillatori al quarzo possono generare segnali precisi solo a frequenze relativamente basse (attorno ai 200M Hz) e anche per tali valori il segnale generato è afflitto da una incertezza; è proprio questa incertezza (che ammonta tipicamente a qualche centinaio di kHz) a generare un contributo fisso al CFO nel trasmettitore OFDM; 2. effetto Doppler dovuto allo spostamento relativo fra trasmettitore e ricevitore; difatti la frequenza osservata in caso di una velocità relativa non nulla fra i due non è quella che si osserverebbe in condizioni stazionarie e dipende dal modulo di tale velocità e dal suo segno. Tipicamente questo contributo ammonta a pochi Hz per scenari indoor ma può diventare rilevante per scenari outdoor. 3. Implementazione con processori DSP 33 Nella sezione seguente si vedrà l’effetto di tali contributi combinati sul segnale OFDM. L’effetto di un CFO è costituito da un semplice shift in frequenza del segnale ricevuto rispetto al segnale trasmesso che può ledere la mutua ortogonalità delle portanti, determinando la comparsa di Inter-Carrier-Interference. Per chiarire meglio quanto appena esposto, supponiamo di essere giunti ad una perfetta sincronizzazione temporale e di calcolare l’uscita della DFT in presenza di un errore di frequenza fe . E’ possibile dimostrare (vedi [10, eq. 14]) che l’uscita n-esima della DFT, in corrispondenza del blocco OFDM i-esimo è data da: jϕi Ri (n) = e N −1 p=0 dove ϕi = 2πiε NNT , ε = fe NTs H(p)di (p)fN (ε + p − n) + Wi (n) (3.57) e fN (x) è definita come: sin(πx) jπx N−1 N e (3.58) N sin( πx N) A questo punto possiamo distinguere tra due tipologie di errore. Nel caso in cui l’errore 1 di frequenza fe , sia un multiplo dello spazio intercarrier NT , ε sarà una quantità intera, s e la (3.57) si ridurrà a: fN (x) = Ri (n) = ejϕi H(|n − ε|N )di (|n − ε|N ) + Wi (n) (3.59) Ri (n) = ejϕi H(n)di (n)fN (ε) + Ii (n, ε) + Wi (n) (3.60) dove |n − ε|N è il valore n − ε, ridotto in modulo all’intervallo [0; N − 1]. La (3.59) indica che l’ortogonalità tra le portanti è ancora rispettata e che l’unico effetto è dato da una rotazione ciclica di ε posizioni dell’uscita della FFT. In questa rotazione, i simboli che finiscono nella zona delle portanti soppresse vengono irrimediabilmente perduti: per una migliore comprensione si faccia riferimento alla figura 3.11 con ε = 1. La situazione cambia drasticamente qualora l’errore non sia un multiplo intero della distanza interportante, in quanto viene lesa l’ortognalità e compare la componente di ICI. In questo caso l’uscita può convenientemente essere espressa come (vedi [10, equ. 17]): dove Ii (n) rappresenta il rumore addittivo dovuto all’ICI ed è descrivibile in modo sta tistico, come un processo gaussiano a media nulla e varianza σ I (ε)2 = E |Ii (n, ε)|2 . In conclusione, un errore di frequenza fe genera quindi due distinti effetti: 1. quando fe è un multiplo intero della spaziatura fra le sottoportanti, vi è uno shift dei simboli associati alle varie sottoportanti; esse sono ancora mutuamente ortogonali ma i simboli dei dati ricevuti sono nella posizione sbagliata dello spettro demodulato; 2. quando fe non è un multiplo intero della spaziatura fra le sottoportanti, allora l’energia di una sottoportante si riversa su quelle vicine, risultando in una perdita di ortogonalità; c’è quindi interferenza interportante, la quale deteriora la Bit Error Rate (BER) del sistema. 34 3. Implementazione con processori DSP ai 1 a Nα a0 a N −1 ... ... ⋅ ⋅ ⋅ ⋅ ... ⋅ 0 ui 1 u0 u Nα ... 0 zona portanti soppresse ... ⋅ ⋅ ⋅ ⋅ ... ⋅ Figura 3.11: Rotazione dei simboli dovuta all’offset di frequenza 3.3.2 Effetto degli errori di posizionamento della finestra di DFT In un sistema multiportante, la finestra su cui si calcola la DFT deve comprendere i campioni di un singolo blocco, in modo da evitare il fenomeno della Inter Block Interference (IBI). La fig. 3.12, mostra come per effetto della risposta impulsiva del canale, la coda del blocco (i -1) si allarga fino a coprire i primi (L-1) campioni del blocco i. Se il sistema è ben progettato, il prefisso ciclico, introdotto dal trasmettitore, avrà dimensione maggiore di L e di conseguenza esisterà una regione di tale prefisso, in cui non si risente dell’effetto del blocco precedente. Eseguendo la DFT a partire da un punto quanlunque di questa regione, riusciamo ad eliminare completamente il fenomeno di IBI. Indicando con θ, l’istante esatto a cui applicare la DFT e con θ̂, l’istante stimato con un algoritmo di sincronizzazione, possiamo dire che la situazione di assenza di IBI si verifica qualora ∆θ = θ̂ − θ, soddisfi la seguente disequazione −Ng + L − 1 ≤ ∆θ ≤ 0. In tal caso l’uscita della DFT è data da (vedi [10, eq. 16]): Ri [n] = e j2πn∆θ N H[n]di [n] + Wi [n] (3.61) in cui l’unico effetto dell’errore, è dato da una rotazione dei simboli trasmessi, dipendente in modo lineare dall’indice n della portante. Tale rotazione può essere compensata dall’equalizzazione del canale, che non riesce a distinguere la rotazione introdotta dal canale da quella introdotta dall’errore ∆θ. Se l’errore ∆θ non è all’interno dell’intervallo −Ng + L − 1 ≤ ∆θ ≤ 0, allora i simboli estratti dalla DFT, saranno prodotti dal contributo di due blocchi adiacenti, determinando la comparsa di IBI. Oltre a questo l’ortogonalità delle portanti non è più rispettata e nasce quindi il problema della Inter-Carrier-Interference (ICI). E’ 3. Implementazione con processori DSP 35 Figura 3.12: Effetto della risposta impulsiva del canale sul prefisso ciclico in una modulazione OFDM. possibile dimostrare che in questa situazione, l’output della DFT può essere espresso come (vedi [10, equ. 17]): Ri [n] = e j2πn∆θ N α(∆θ)H[n]di [n] + Ii (n, ∆θ) + Wi [n] (3.62) dove abbiamo indicato con α(∆θ), un fattore di attenuazione e con Ii (n, ∆θ), l’effetto di ICI ed IBI, modellizzabile come un processo gaussiano a media nulla e varianza σ 2I (∆θ). Dal momento che l’algoritmo di timing deve essere in grado di portare la finestra di DFT all’interno della regione di assenza di IBI, si evince che minore è la dimensione di questa regione, maggiore sarà la precisione richiesta all’algoritmo. 3.3.3 Generalità sugli algoritmi di sincronizzazione I risultati precedenti indicano che l’accuratezza del sistema di sincronizzazione frequenziale e di temporizzazione di un modem influiscono drasticamente sulla BER finale; è quindi fondamentale implementare una serie di robusti anelli di controllo per stimare correttamente sia la frequenza di portante che gli istanti di campionamento. Tali processi di sincronizzazione sono normalmente suddivisi in due fasi: quella di acquisizione grezza (coarse) e quella di inseguimento fine (tracking). Nella prima fase si produce una stima di massima dell’errore di timing o dell’errore frequenziale, tipicamente utilizzando algoritmi data-aided (algoritmi cioè che richiedono che il trasmettitore inserisca simboli noti al ricevitore in un qualche punto del segnale demodulato); dal punto di vista implementativo tali algoritmi sono importanti perchè consentono di ridurre la quantità di dati da processare successivamente. Nella seconda fase si produce invece una stima accurata delle quantità ricercate, cercando di “rubare” dal segnale dati il minimo spazio possibile; tale stima fine infatti 36 3. Implementazione con processori DSP Figura 3.13: Struttura di un possibile ricevitore OFDM con i blocchi per la stima coarse e fine di temporizzazione e di frequenza [10]. è calcolata a intervalli regolari o anche in modo continuo - a differenza della stima grezza che è effettuata solo all’inizio della trasmissione e quindi può anche fare uso di lunghe sequenze di training - e deve quindi avere un impatto il più piccolo possibile sul throughput del sistema. Inoltre, soprattutto nel caso delle comunicazioni di tipo burst (in cui il trasmettitore trasmette solo quando necessario, per brevi periodi di tempo), è importante che gli algoritmi di stima fine abbiano anche tempi di acquisizione (o convergenza) ridotti, pena la perdita di parte dei dati del frame trasmesso (che in genere dovrà quindi essere ritrasmesso in base ad una qualche strategia ARQ - automatic repeat request - a livello MAC). Gli algoritmi di stima fine di tipo non-data-aided (detti anche blind ) sono quindi appetibili per il fatto che non introducono overhead nel segnale trasmesso, ma in generale hanno tempi di acquisizione più lunghi visto che per convergere ad una stima corretta fanno affidamento solo a proprietà statistiche generiche del segnale trasmesso. Un esempio strutturale di ricevitore con i vari stimatori è mostrato nella figura 3.13. In queste considerazioni non si deve dimenticare anche un’altra figura di merito importante: la complessità computazionale dell’algoritmo. E’ chiaro che bilanciare tutti gli aspetti sopra menzionati può essere molto difficile e non sempre possibile (a tal proposito si vedano i riferimenti [14] e [15]); per questo motivo prima di scegliere si sono stati testati svariati algoritmi di sincronizzazione, che sono qui di seguito descritti. 3.3.4 Algoritmi per la temporizzazione grezza In quasi tutti i sistemi OFDM, la temporizzazione grezza di frame rappresenta la prima operazione eseguita. Essa ha almeno due obiettivi principali: rivelare la presenza o l’assenza di un frame OFDM sul canale e identificarne (in modo approssimativo; tipicamente a meno di un tempo di simbolo) la posizione corretta della finestra DFT. 3. Implementazione con processori DSP 37 Siccome in questa fase il CFO non è ancora noto, è bene che l’algoritmo sia, per quanto possibile, insensibile agli errori nella frequenza della portante. Uno dei primi algoritmi per il timing coarse venne proposto da Nogami e Nagashima [10] ed utilizza un blocco di silenzio, detto null-block, in cui il trasmettitore spegne l’amplificatore e non invia alcun segnale. L’inizio del frame con tale sistema può essere identificato analizzando la potenza ricevuta, che subisce un brusco calo in corrispondenza del null-block. Questo algoritmo non è particolarmente preciso e, soprattutto, non si adatta granchè ai sistemi di comunicazione a burst, per la totale impossibilità di distinguere il blocco nullo dai periodi “idle” (periodi di silenzio il cui il trasmettitore non ha dati da inviare) tra un frame e l’altro. Un approccio molto popolare, utilizzato oggi, prevede l’utilizzo di blocchi di riferimento speciali, che esibiscono una certa ripetitività nel dominio del tempo. In questo caso è possibile stimare la posizione di inizio del frame ricercando un picco nella correlzione tra le parti ripetitive. L’idea venne per la prima volta proposta da Schmidl e Cox [17], che utilizzarono due blocchi identici di dimensione N/2 (in cui N rappresenta l’ordine della DFT), posti all’inizio di ciascun frame. Si noti che la generazione di un simile blocco è molto semplice e può essere fatta nel dominio della frequenza; basta infatti modulare una sequenza pseudo casuale sulle portanti pari ed una sequenza di cifre nulle sulle portanti dispari. Non è difficile dimostrare che, fintantochè la durata del prefisso ciclico è maggiore della durata della risposta impulsiva del canale, le due metà rimangono identiche, a meno di un phase shift dovuto al CFO. Se i campioni ricevuti, relativamente alla prima metà, sono espressi da (vedi [10, equ. 22]): N −1 2 i campioni relativi alla seconda metà, possono essere espressi come: r(k) = s(R) (k)e j2πεk N + w(k) θ ≤ k ≤ θ + (3.63) j2πεk N N N ) = s(R) (k)e N ejπε + w(k + ) θ ≤ k ≤ θ + −1 (3.64) 2 2 2 Non è difficile capire che, fornendo i campioni ricevuti ad un correlatore di dimensione N 2 , questo produrrà un picco nel momento in cui la sua sliding window è sovrapposta esattamente al reference block trasmesso. In conclusione possiamo affermare che la stima θ̂ del coarse timing, può essere calcolata ricercando il massimo della seguente metrica: max Γ(θ̃) (3.65) r(k + θ̃ dove: θ̃+ N −1 2 Γ(θ̃) = r(k + N ∗ 2 )r (k) k=θ̃ θ̃+ N −1 2 r(k + k=θ̃ (3.66) N 2 2) 38 3. Implementazione con processori DSP Figura 3.14: Andamento della metrica ottenuta dall’algoritmo di Schmidl e Cox. La fig.3.14 mostra l’andamento di Γ(θ̃) in funzione della differenza (θ̃ − θ), tra il timing stimato ed il timing esatto, ottenuta su un canale evanescente con durata della risposta impulsiva pari ad 8 campioni e con un rapporto segnale rumore di 20 dB. Come già anticipato, la prima operazione richiesta ad un algoritmo di timing è la rilevazione della presenza di un frame. A tale scopo la metrica Γ(θ̃) viene continuamente monitorata e l’inizio del frame viene dichiarato non appena questa supera una determinata soglia, il valore della quale deve essere scelto in modo da ridurre al minimo il rischio di falsi positivi ed eviatre la perdita di interi frame. Non appena la presenza del frame è stata identificata, il timing corretto viene ottenuto ricercando il massimo di Γ(θ̃) al variare di θ̃. Dall’analisi della fig.3.14 notiamo che la metrica di Schmidl e Cox presenta, in corrispondenza del picco, una regione piatta piuttosto grande. Questo rende imprecisa l’identificazione del massimo e quindi riduce l’accuratezza con cui si stima l’istante di campionamento iniziale. Per cercare di risolvere il problema ed ottenere un’accuratezza maggiore sono stati proposti svariati algoritmi alternativi. L’algoritmo di Shi e Serpedin [16] utilizza un differente reference block di dimensione N , composto da quattro parti di dimensione N4 , identiche a meno di un’inversione di segno sul terzo blocco. La struttura può dunque essere espressa dalla sequenza [+B; +B; −B; +B], dove abbiamo indicato con B il generico blocco di dimensione N4 . Per il calcolo della metrica, si utilizza una sliding window di dimensione N , so vrapposta ai campioni ricevuti ricoprendo gli indici k ∈ θ̃; θ̃ + N − 1 . Questa viene suddivisa in 4 sottovettori rj (θ̃) = r(θ̃ + j N4 + l); l ∈ 0; N4 − 1 con j = 0, 1, 2, 3 ed utilizzata per calcolare la seguente metrica: 3. Implementazione con processori DSP 39 Figura 3.15: Esempio di andamento della metrica di Shi e Serpedin. Γ(θ̃) = Λ1 (θ̃) + Λ2 (θ̃) + Λ3 (θ̃) 3 2 3 (3.67) rj (θ̃) j=0 dove H H Λ1 (θ̃) = rH 0 (θ̃)r1 (θ̃) − r1 (θ̃)r2 (θ̃) − r2 (θ̃)r3 (θ̃) H Λ2 (θ̃) = rH 1 (θ̃)r3 (θ̃) − r0 (θ̃)r2 (θ̃) Λ3 (θ̃) = rH 0 (θ̃)r3 (θ̃) La fig.3.15 mostra l’andamento della metrica di Shi e Serpedin, misurata nelle medesime condizioni della fig.3.14. Dal momento che la dimensione della regione piatta in corrispondenza del picco si è ora notevolmente ridotta è lecito aspettarsi un’accuratezza maggiore. E’ inoltre possibile migliorare ulteriormente la precisione dell’algoritmo costruendo blocchi con un numero di parti ripetitive maggiore di 4. Un’altro algoritmo di coarse timing proposto recentemente e pensato per diminuire le probabilità di false detection è quello di Bhargava-Letaief [12]. Come reference block utilizza una sequenza composta da L parti uguali (valori tipici di L sono 4,8,16) ma concatenate con segni differenti. Ciascuna parte è generata utilizzando una sequenza di Golay di lunghezza pari a M = N L dove N indica il numero di sottoportanti della comunicazione OFDM. Il pattern di segno è definito dalla sequenza p(k) = ±1, con k = 0, 1, ..., L − 1. 40 3. Implementazione con processori DSP Figura 3.16: Andamenti tipici della metrica di timing di Bhargava-Letaief in condizioni di assenza di rumore e di assenza di distorsioni di canale; l’indice 0 corrispone al punto di timing esatto. Anche in questo caso per il calcolo della metrica si usa una sliding window di dimensione N in cui r è la generica sequenza complessa di campioni ricevuti campionati a frequenza di simbolo: Γ(θ̃) = L |P (θ̃)| L − 1 E(θ̃) 2 dove: P (θ̃) = E(θ̃) = L−2 p(k)p(k + 1) k=0 M−1 L−1 i=0 k=0 M−1 r∗ (θ̃ + kM + m)r(θ̃ + (k + 1)M + m) m=0 |r(θ̃ + i + kM )|2 E’ interessante notare che la metrica di Schmidl e Cox è un caso speciale della metrica descritta sopra nel caso in cui L = 2, p = [++], e il termine E(θ̃) è approssimato M−1 ! con il termine 2 |r(θ̃ + i + M )|2 . i=0 Nella figura 3.16 è mostrata la metrica di timing tipica che si ottiene con tale algoritmo, per diversi valori di L, confrontata con quella di Schmidl e Cox (si può notare come esibisca un picco molto più stretto). Tale metrica di timing è molto interessante perchè permette, con il medesimo blocco, di stimare anche la risposta impulsiva del canale e di stimare il CFO [12]. 3. Implementazione con processori DSP 41 Figura 3.17: Blocchi di riferimento per l’algoritmo di Schmidl e Cox. 3.3.5 Algoritmi per l’acquisizione di frequenza della portante In un sistema “convenzionale” (dove l’operazione di up- e down- conversione avviene in analogico), il ricevitore una volta identificato l’inizio del frame tramite gli algoritmi di coarse-timing, deve stimare il Carrier Frequency Offset (CFO) per aggiustare l’errore introdotto dagli oscillatori locali sia del trasmettitore che del ricevitore stesso. Nel sistema realizzato (vedi la sezione 3.1) però non ci sono i problemi convenzionali di derive e imprecisioni tipiche di componentistiche analogiche; difatti le oscillazioni in quadratura usate nelle conversioni di frequenza sono generate digitalmente e quindi sono sempre alla esatta frequenza prestabilita. Per questo motivo nella pratica la stima e la correzione del CFO non è stata eseguita (vedi sezione 3.4); tuttavia per completezza e come riferimento per eventuali applicazioni future di seguito sono comunque riportati gli algoritmi di stima del CFO che sono parte delle “infrastrutture” di sincronizzazione accennate nella sezione precedente relativa al coarse timing; un approccio comune al problema della stima del CFO è infatti quello di utilizzare blocchi composti da parti ripetitive (proprio come quelli che servono per il timing grezzo) che rimangano identiche al passaggio attraverso il canale, se non per uno shift di fase, introdotto dall’errore di frequenza. Ad esempio, Schmidl e Cox [17] suddividono l’errore di frequenza in due parti: 1 2 una parte frazionaria, sempre inferiore di NT ed una parte intera multipla di NT . s s L’errore di frequenza, normalizzato alla spazio interportante, può complessivamente essere espresso da: ε = ν + 2η (3.68) dove ν ∈ (−1; 1] ed η è un valore intero. Lo stimatore di Schmidl e Cox, si basa sull’utilizzo di due blocchi di riferimento come mostrato nella fig.3.17. Il primo blocco è identico a quello proposto dagli stessi autori per la temporizzazione grezza e si compone di due blocchi identici di dimensione N2 ; esso si può ottenere modulando, sulle portanti pari una sequenza pseudo casuale e sulle portanti dispari un insieme di cifre nulle. Il secondo blocco viene ottenuto invece, modulando una sequenza di rumore pseudo casuale su tutte le portanti. Sostituendo la (3.68) nelle equazioni (3.63) e (3.64) otteniamo: 42 3. Implementazione con processori DSP r(k) = s′ (k) + w(k) N N r(k + ) = s′ (k)ejπν + w(k + ) 2 2 j2π(ν+2η)k N dove s′ (k) = s(R) (k)e ed in cui è stata sfruttata l’identità ej2πη = 1. Le relazioni (3.69) indicano che, trascurando il rumore termico, le due parti sono identiche, tranne che per una rotazione di fase proporizionale a ν. Una stima di ν può dunque essere ottenuta come: ν= N −1 2 θ̃+ 1 arg π k=θ̃ N r(k + )r∗ (k) 2 (3.70) in cui il valore di θ̃ deve essere quello ottenuto dalla timing acquisition. Una volta stimato l’errore frazionario ν occorre eseguire la stima dell’errore intero η. A tale scopo i campioni provenienti dai due blocchi, vengono dapprima controruotati, ad una velocità angolare di 2πν/N , per compensare l’errore frazionario e poi forniti in ingresso al modulo che calcola la DFT, il quale produrà i due vettori R1 (n) ed R2 (n). Come illustrato in precedenza, in presenza di un errore multiplo dello spazio interportante, le uscite della DFT non saranno soggette ad ICI, ma verranno solamente spostate dalla loro posizione originale, di una quantità pari a 2η. Questo significa che le uscite della DFT saranno date da: R1 (n) = ejϕ1 H(|n − 2η|N )d1 (|n − 2η|N ) + W1 (n) R2(n) = ejϕ2 H(|n − 2η|N )d2 (|n − 2η|N ) + W2 (n) dove |n − 2η|N è il valore n − 2η, riportato in modulo all’intervallo [0; N − 1]. Trascurando l’effetto del rumore termico e definendo p(n) = dd21 (n) (n) , possiamo scrivere, per le sole portanti pari che: R1 (n)ejϕ2 −ϕ1 p(|n − 2η|N ) = d2 (|n − 2η|N ) ejϕ1 ejϕ2 −ϕ1 H(|n − 2η|N )d1 (|n − 2η|N ) = d1 (|n − 2η|N ) ejϕ2 H(|n − 2η|N )d2 (|n − 2η|N ) = R2 (n) Questo significa che: R1 (n)ejϕ2 −ϕ1 p(|n − 2η|N ) = R2 (n) (3.71) La (3.71) suggerisce che una stima dell’errore intero può essere ottenuta andando a cercare il valore di η che massimizza la seguente metrica: 3. Implementazione con processori DSP 43 ∗ ∗ R2 (n)R1 (n)p (|n − 2η̃|N ) n pari B(η̃) = |R2 (n)|2 (3.72) n pari con η̃ che varia su tutto il range di errori di frequenza, che siamo interessati a correggere. Si verifica facilmente che la metrica restituisce 1 non appena viene trovato il R2 (n) valore corretto di η̃. Infatti non appena η̃ = η, p∗ (|n − 2η|N ) = R (n)e jϕ2 −ϕ1 e quindi: 1 ∗ R2 (n) ∗ R (n)R (n) 2 ∗ j(ϕ −ϕ ) 1 R1 (n)e 2 1 n pari B(η̃) = = |R2 (n)|2 n pari R2∗ (n) R2 (n) ej(ϕ2 −ϕ1 ) n pari = |R2 (n)|2 n pari 2 −j(ϕ2 −ϕ1 ) |R2 (n)| e n pari = |R2 (n)|2 2 −j(ϕ −ϕ ) 2 1 |R2 (n)| e n pari = |R2 (n)|2 n pari n pari 2 |R2 (n)| e−j(ϕ2 −ϕ1 ) n pari = |R2 (n)|2 n pari 2 |R (n)| 2 n pari =1 |R2 (n)|2 n pari Il grande vantaggio di questa tecnica di sincronizzazione rispetto ad altre risiede nell’allargamento del range di acquisizione, che può essere configurato a piacere. Esiste anche un’altra soluzione, che permette di ridurre l’overhead, rispetto al metodo di Schmidl e Cox, richiedendo l’introduzione di un solo reference block. Il metodo è stato proposto da Morelli e Mengali [11] e richiede l’inserimento di un blocco, composto da Q > 2 parti identiche, composte da N/Q campioni. Il CFO si può ricavare come: Q/2 1 ε= κ(q) arg {Ψ(q)Ψ∗ (q − 1)} 2π/Q q=1 dove: 44 3. Implementazione con processori DSP κ(q) = e 12(Q − q)(Q − q + 1) − Q2 2Q(Q2 − 1) ˆ θ+N−1−q N Q ψ(q) = r(k + q ˆ N ∗ )r (k) Q k=θ con q = 1, 2, ...., 3.3.6 Q 2 Algoritmi per la temporizzazione fine Per quanto corretta possa essere la decisione presa dagli algoritmi di timing coarse, in generale rimane comunque un offset nella posizione di inizio campionamento (tipicamente minore di uno o due tempi di simbolo), che deve essere individuato ed eliminato e che richiede algoritmi più precisi, che eseguano il tracking e la correzione per ogni blocco ricevuto. Più nel dettaglio, gli errori residui di sincronizzazione temporale possono essere divisi in due categorie: symbol timing offset e sampling timing offset (SFO). Symbol timing offset Il symbol timing offset rappresenta un errore di sincronizzazione multiplo dell’intervallo di segnalazione Ts . Come già detto, qualora la finestra della DFT, rimanga in una regione priva di IBI, l’effetto di un errore di entità ∆θ, è costituito da una rotazione dei simboli in uscita dalla DFT, proporzionale all’indice n della portante. Ricordando la (3.61) ed indicando con φn la rotazione di fase subita dal simbolo modulato sulla portante n-esima, possiamo scrivere: φn = 2πn∆θ 2π n ∆θ Ts 2π n Td = = N N Ts Tu in cui abbiamo indicato con Td , l’errore di sincronizzazione in secondi e con Tu la durata in secondi della parte utile di ciascun simbolo OFDM: Td = ∆θ Ts Tu = N Ts Sampling frequency offset Il sampling frequency offset (SFO) rappresenta invece un errore di sincronizzazione di entità pari ad una frazione dell’intervallo di segnalazione Ts . Anche questa tipologia di errori, causa una rotazione dei simboli in uscita dalla DFT, che possiamo scrivere in maniera analoga alla precedente come: 3. Implementazione con processori DSP 45 Figura 3.18: Errori di sincronizzazione temporale (symbol timing offset e sampling timing offset). φn = 2π n ∆t Tu dove abbiamo indicato con ∆t il sampling timing offset in secondi. La fig.3.18 mostra un esempio in cui l’errore di sincronizzazione si compone di un symbol timing offset Td e di un sampling timing offset ∆t. Si noti che l’errore di sincronizzazione in generale non è costante nel tempo, in quanto l’oscillatore che genera la frequenza di campionamento in ricezione potrebbe generare un segnale ad una frequenza leggermente diversa da quella dell’oscillatore usato in trasmissione. Se ad esempio l’oscillatore in ricezione procede più lentamente di quello in trasmissione, l’istante di posizionamento della finestra di DFT tenderà a rimanere sempre più in ritardo rispetto all’istante corretto, via via che si procede nella demodulazione del frame ricevuto. Occorre quindi un algoritmo capace di calcolare e correggere l’errore di sicronizzazione per ognuno dei blocchi OFDM ricevuti. Algoritmo per la sincronizzazione fine L’algoritmo proposto da Kim-Do-Cho [18] sfrutta alcune sottoportanti del segnale OFDM per introdurre opportuni simboli pilota che permettono al ricevitore di calcolare una stima degli errori di sincronizzazione temporale, sia quelli dovuti al symbol timing offset sia quelli dovuti al sampling frequency offset (SFO). Dato che la rotazione di fase che si verifica sulla sottoportante k-esima, a seguito degli errori di sincronizzazione, si può esprimere come: 2πk(Td + ∆t) Tu la differenza della rotazione di fase, tra le sottoportanti k1 e k2 del j-esimo simbolo OFDM può dunque essere scritta come: ∆φk2,1 = φk2 − φk1 = 2π∆k Td + ∆t Tu (3.73) 46 3. Implementazione con processori DSP Se indichiamo con k1 e k2 , gli indici a cui il trasmettitore ha introdotto i simboli pilota e con ∆k la loro distanza ∆k = k2 − k1 , la (3.73) mostra che la differenza tra le rotazioni di fase dipende dalla distanza in frequenza tra le due sottoportanti, dal symbol timing offset Td , e dal sampling timing offset ∆t. Questo ci suggerisce un metodo per la stima degli errori Td e ∆t. Infatti se il ricevitore conosce i simboli pilota e le loro posizioni potrà calcolare immediatamente la differenza tra le rotazioni di fase e la distanza ∆k tra le due sottoportanti e quindi potrà stimare un errore complessivo τ (j) = TdT+∆t attraverso il calcolo: s τ (j) = Td + ∆t N ∆φk2,1 = Ts 2π ∆k (3.74) Infatti: T +∆t N ∆φk2,1 N 2π∆k dTu τ (j) = = 2π ∆k 2π ∆k Td +∆t N 2π∆k N Ts Td + ∆t = = 2π ∆k Ts (3.75) La parte intera e la parte frazionaria di τ (j), moltiplicate per l’intervallo di segnalazione Ts , forniranno rispettivamente i valori di Td e di ∆t richiesti. L’algoritmo permette di identificare e quindi correggere errori fino ad un Td masN simo di 2∆k . La scelta di ∆k deve quindi essere fatta in maniera accurata, in quanto maggiore è il ∆k maggiore sarà l’accuratezza dell’algoritmo, ma contemporaneamente minore sarà l’acquisition range. Nelle applicazioni pratiche si trasmettono più coppie di simboli pilota e si calcola una media degli errori stimati utilizzando ciascuna coppia di sottoportanti. Se ad esempio abbiamo L coppie possiamo calcolare: L−1 1 τ (j) = τk (j) L n=0 2n+1,2n (3.76) in cui: τ k2n+1,2n (j) = N ∆φk2n+1,2n 2π ∆k2n+1,2n (3.77) tale sistema di ridondanza consente una maggiore affidabilità dell’algoritmo nel caso in cui alcune delle sottoportanti pilota utilizzate per il timing fine siano particolarmente attenuate e/o corrotte da picchi di rumore. Nell’articolo [18] viene anche presentata una macchina a stati finiti che consente di ottenere una immunità ancora maggiore da casi patologici quali quelli dovuti a temporanei deep-fade o perdite di segnale. 3. Implementazione con processori DSP 3.4 47 Simulazione MATLAB del sistema Prima di passare all’implementazione definitiva (caratterizzata da un maggior numero di non-idealità) del trasmettitore e del ricevitore OFDM si è preferito sviluppare una simulazione ad alto livello nel linguaggio interpretato MATLAB. Tale ambiente permette un test veloce degli algoritmi senza doversi preoccupare di tutti quei dettagli implementativi (numero di bit di quantizzazione, efficienza dell’implementazione, ottimizzazioni, tecniche di debug più complesse etc) che almeno inizialmente rappresentano una “distrazione” dall’obiettivo iniziale di scelta degli algoritmi da usare e di valutazione delle loro performance. Inoltre avere a disposizione una simulazione MATLAB del sistema permette di effettuare un debug agevolato in fase di scrittura del codice definitivo (basta confrontare i risultati del codice che si sta sviluppando con quelli quasi ideali di MATLAB). 3.4.1 Il trasmettitore Il codice MATLAB per il trasmettitore sviluppato in questa tesi è raccolto nella funzione OFDM tx() localizzata nel file OFDM tx.m. Tale funzione deve essere chiamata solo una volta che tutte le costanti base della modulazione sono state inizializzate (come variabili globali); di questo se ne occupa lo script OFDM system.m che verrà descritto in seguito nella sezione 3.4.3. La funzione OFDM tx() dapprima inizializza alcune ulteriori costanti presenti sia nel trasmettitore che nel ricevitore (che però possono assumere valori diversi nei due a causa di differenti valori delle frequenze di campionamento) mediante la chiamata a OFDM rx tx common init(); dopodichè procede al calcolo dei campioni di uscita del filtro FIR di pulse-shaping (indicato con p(t) nella figura 3.4 e la cui risposta impulsiva è rappresentata nella figura 3.19) per ognuno dei simboli OFDM da trasmettere. La funzione OFDM tx() si occupa cioè di trasmettere un frame OFDM. Ogni frame OFDM è composto in modo molto semplice (vedi la fig. 3.20), cercando di limitare al massimo l’overhead di livello fisico, e consiste in un simbolo di sincronizzazione che contiene dati noti ed è usato dal ricevitore per il coarse-timing (vedi sezione 3.3) seguito da un numero fisso Ndata symbols per synch symbol di simboli OFDM contenenti dati utili (eccetto che su alcune sottoportanti che vengono comunque sempre modulate da dati noti per l’algoritmo di timing fine del ricevitore); tale pattern (simbolo di sincronismo e numero fisso di simboli utili) viene ripetuto in modo tale da avere Nsymbols per OF DM f rame simboli totali. Per ridurre l’overhead causato dai simboli contenenti dati noti, un miglioramento possibile sarebbe quello di trasmettere tali simboli più ravvicinati (temporalmente) all’inizio del frame OFDM e poi via via sempre più distanti gli uni dagli altri (è soprattutto all’inizio che il ricevitore ha bisogno di basarsi su dati noti per la stima dei vari parametri del segnale). Più in dettaglio per tutti i simboli OFDM (eccezion fatta per quelli di sincronismo) Nu ef f gruppi di m = log2 M bits di ingresso dell’array pam symbols, generato dal raggruppamento dei bit che codificano una sequenza di caratteri ASCII, vengono mappati in una costellazione ad M punti del piano complesso (nell’array channel symbols). Nel nostro caso M = 4 e la costellazione è composta quindi dai punti ±1 ± j (modulazione QPSK). 48 3. Implementazione con processori DSP 4 7 Filter response x 10 6 5 4 3 2 1 0 −1 160 180 200 220 240 260 280 300 320 340 360 Autocorrelation of the filter response 20000 15000 10000 5000 0 −5000 400 450 500 550 600 Figura 3.19: Risposta impulsiva del filtro FIR usata nel trasmettitore OFDM simulato in MATLAB. N sym bols_per_O FD M _fra m e N data_sym bols_per_synch_sym bol Sim bo lo O FD M per il sincronism o coarse S im bo lo O FD M di dati u tili N u_eff … Sim bo lo O FD M di dati u tili N data_sym bols_per_synch_sym bol Sim bo lo O FD M per il sincron ism o coarse Sim bo lo O FD M di dati u tili sottoportanti m odulate con dati utili Figura 3.20: Formato del frame utilizzato … Sim bo lo O FD M di dati u tili 3. Implementazione con processori DSP 49 La costante Nu ef f è definita dalla funzione OFDM constants() chiamata dallo script OFDM system.m ed equivale a Nu (numero di sottoportanti utili all’interno di un simbolo OFDM) meno il numero di sottoportanti utilizzate per il sincronismo fine di timing. Dopo il QPSK mapping dall’array channel symbols si passa, con l’inserzione delle sottoportanti virtuali, all’array channel symbols with vc (di lunghezza N ) e poi all’array ifft output dopo l’operazione di IFFT ad N punti. L’array ifft output with cp viene creato inserendo prima di ifft output il prefisso ciclico. Separando i campioni complessi di ifft output with cp con TT sc − 1 campioni nulli si crea poi l’array fir input che una volta convoluto con l’array FIR response (inizializzato da OFDM rx tx common init(), vedi fig. 3.19) viene concatenato con i campioni calcolati precedentemente per gli altri simboli OFDM nell’array total fir output. La risposta impulsiva del filtro FIR h[n] (in MATLAB chiamata FIR response) è calcolata dalla funzione rootraisedcosine func(α, Ts , Tc , Nsamples , Nbits ) mediante l’equazione: h̃[n] = (1+α)π(n−A)Tc (1−α)π(n−A)Tc Ts cos + sin T 4α(n−A)T T s c s 4α √ 4α(n−A)Tc 2 1− π T s Ts per n ∈ [0; Nsamples − 1]; n = A; n = A ± 4α+π(1−α) √ π Ts 1 √ 2π Ts Ts 4αTc per n = A 1−α 1−α (1 + α)π sin 1+α 4α π + 4α sin 4α π − (1 − α)π cos 4α π Ts per n = A ± 4αT c 2Nbits − 1 h[n] = rnd h̃[n] max |h̃[n]| dove rnd() indica la funzione round-off (approssimazione all’intero più vicino), Nsamples A = rnd + 1 e h̃[n] è la sequenza ottenuta per campionamento dell’an2 titrasformata di un segnale con spettro a radice di coseno rialzato. Si noti che la prima formula che definisce la sequenza h̃[n] ha dei punti di discontinuità (per Ts n = A; n = A ± 4αT ) in cui il denominatore si annulla; estendendo per continuità la c funzione (risolvendo cioè i limiti associati a tali punti) si ricavano la seconda e la terza formula della definizione. La funzione rootraisedcosine func() inoltre calcola anche l’ISI (inter-symbol interference) causata dal troncamento a Nsamples campioni della funzione h̃[n] (che sarebbe di durata infinita); per farlo esegue semplicemente la somma dei campioni di indice +∞ ! ∗ A ± n TTsc della sequenza Rhh [n] = h [k]h[n + k] (cioè dell’autocorrelazione di h[n]) k=−∞ !L che teoricamente dovrebbero essere nulli (ovvero calcola ISI = k=1 Rhh [2A + kTs ] 2Nsamples −1 con L = rnd ). Nella tabella seguente sono riportate le percentuali di Ts valori di ISI totale per diversi valori di Nsamples ottenute normalizzando la somma 50 3. Implementazione con processori DSP dei campioni di indice A ± n TTsc al valore massimo della sequenza Rhh [n] (calcolati per Ts Tc = 25, Nbits = 8): Nsamples 32 64 128 256 512 1024 ISI con α = 0.3 21% 22% 7,7% 3% 1,25% 1,2% ISI con α = 0.5 18% 10% 2% 1,35% 0,502% 0,502% ISI con α = 0.7 14,4% 2,7% 1,3% 0,97% 0,76% 0,76% Una rappresentazione grafica è disponibile nella fig. 3.21 in cui l’andamento generale evidenzia (come è già chiaro dalla tabella sopra) che all’aumentare di Nsamples 1 l’ISI ha un andamento del tipo Nsamples ; ciò comporta una riduzione dapprima molto veloce e poi sempre più lenta dell’errore. L’andamento ondulatorio della curva della fig. 3.21 è dovuto al fatto che aumentando Nsamples si allunga non solo h[n] ma anche Rhh [n] e ci sono quindi più campioni distanziati di Ts a cui è possibile estendere la sommatoria. Naturalmente bisogna bilanciare la necessità di contenere l’ISI dovuta al troncamento (che è inversamente proporzionale a Nsamples ) con la necessità di eseguire una convoluzione veloce (che ha complessità computazionale proporzionale al log2 Nsamples ) sia a lato trasmettitore sia soprattutto a lato ricevitore. Tornando alla funzione OFDM tx(), nella figura 3.22 è rappresentato (per la sola parte in fase) l’array di input e di output del filtro FIR. Completata la generazione di total fir output si procede all’operazione di up-conversion: SRF (t) = Re{x(t)ej2π(fc +fCF O )t+θCP O } = Re{x(t)} cos(2π(fc + fCF O )t + θCP O ) − Im{x(t)} sin(2π(fc + fCF O )t + θCP O ) (3.78) dove i termini fCF O e θCP O sono normalmente nulli e vengono usati solo per simulare l’effetto di un offset di frequenza e di fase nella portante; il termine x(t) nell’equazione rappresenta l’array total fir output mentre SRF (t) rappresenta l’array dac input. Nelle figure 3.23, 3.24 e 3.25 sono mostrati i segnali come appaiono rispettivamente prima e dopo la conversione di frequenza. Infine l’array dac input viene quantizzato su 14bit (ovvero il numero di bit del DAC utilizzato; vedi la sezione 3.5) e interpolato per simulare il DAC. L’uscita del convertitore digitale-analogico sarebbe per l’appunto un segnale analogico e come tale non un segnale rappresentabile in MATLAB. Nel simulatore si è quindi dovuto approssimare il segnale di uscita con un segnale comunque tempo-discreto ma caratterizzato da una frequenza di campionamento molto più elevata di quella del segnale tempodiscreto in ingresso al DAC. Tale cambiamento di frequenza si è ottenuto simulando un interpolatore di ordine zero (come quello del DAC utilizzato) seguito da un filtro 3. Implementazione con processori DSP 51 60 50 ISI (%) 40 30 20 10 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 Alfa 500 450 400 350 300 250 200 150 100 N samples Figura 3.21: Interferenza intersimbolo (ISI) introdotta dal troncamento della risposta impulsiva del filtro in funzione della lunghezza a cui viene troncata (Nsamples ) e del coefficiente di roll-off (α). 50 0 52 3. Implementazione con processori DSP FIR input (inphase) 80 60 40 20 0 −20 −40 −60 −80 0 500 1000 6 6 1500 Sample index 2000 2500 3000 FIR output (inphase) x 10 4 2 0 −2 −4 −6 0 500 1000 1500 2000 2500 3000 3500 Sample index Figura 3.22: Input e output del filtro FIR di un trasmettitore OFDM con N = 64, Np = 6, α = 0.5, M = 4. 3. Implementazione con processori DSP 6 53 Real part (INPHASE) of the FIR output x 10 5 0 −5 0.8 1 5 1.2 1.4 Sample index 1.6 1.8 4 x 10 Imaginary part (QUADRATURE) of the FIR output x 10 10 5 0 −5 0.8 1 1.2 1.4 Sample index 1.6 1.8 4 x 10 Figura 3.23: Parte in fase e quadratura all’uscita del filtro FIR per un intero frame OFDM. E’ possibile notare che i simboli noti trasmessi nel primo simbolo OFDM sono modulati solo in fase e vengono trasmessi a potenza maggiore. 54 3. Implementazione con processori DSP 4 2 DAC input x 10 1.5 1 0.5 0 −0.5 −1 −1.5 −2 100 200 300 Time (us) 400 500 600 Figura 3.24: Segnale relativo ad un singolo simbolo OFDM dopo la conversione di frequenza. 3. Implementazione con processori DSP 55 300 250 200 150 100 50 0 200 400 600 800 1000 1200 1400 1600 Figura 3.25: Densità spettrale di potenza del segnale in ingresso al DAC rappresentato in figura 3.24. di Butterworth passa-basso del sesto ordine con frequenza di taglio pari a indica la frequenza di campionamento del segnale di ingresso al DAC. Fc 2 , dove Fc Nel simulare il DAC si sono modellizzate anche le varie non-idealità possibili: un offset di frequenza costante nella frequenza del clock sommato ad un certo phase-noise. Tali effetti sono serviti a studiare l’impatto delle non-idealità dell’hardware sul segnale finale. I campioni del segnale “circa” tempo-continuo sono infine salvati nel file dac output.mat. 3.4.2 Il ricevitore Il codice MATLAB del ricevitore è raccolto nella funzione OFDM rx() nel file OFDM rx.m. Come già per OFDM tx() anche questa funzione necessita di una pre-inizializzazione di numerose costanti di modulazione (da parte dello script OFDM system.m) ed effettua l’inizializzazione delle costanti dipendenti dal valore di Fc tramite la funzione OFDM rx tx common init(). Dopo l’inizializzazione la funzione carica nell’array data i dati da processare che sono, a seconda del valore della costante SIGNAL, il file dac output.mat, un array di campioni salvati direttamente dal DSP (vedi la sezione 3.6) o del rumore gaussiano bianco (come segnale di test). Viene poi simulato il canale di trasmissione AWGN aggiungendo all’array data rumore gaussiano bianco a sufficienza per raggiungere un dato rapporto segnale-rumore determinato dalla costante SNR. 56 3. Implementazione con processori DSP La demodulazione vera e propria ha inizio con l’operazione di conversione di frequenza: abbiamo visto nella sezione relativa al trasmettitore che il segnale in banda passante viene costruito come (vedi eq. 3.78 con fCF O e θCP O posti uguale a zero): sRF (t) = Re{x(t)ej2πfc t+φ } = xI (t) cos(2πfc t + φ) − xq (t) sin(2πfc t + φ) dove x(t) costituisce l’inviluppo complesso (anche detto “equivalente passa-basso”) della modulazione, di cui xI ed xq rappresentano la parte reale e la parte immaginaria, fc rappresenta la frequenza della portante e φ rappresenta un generico offset di fase costante. Trascurando per ora gli effetti del canale, supponiamo che il segnale ricevuto rRF (t) sia esattamente sRF (t); moltiplicando il segnale sRF (t) per una oscillazione tipo coseno con fase φ̂ si ottiene: (xI (t) cos(2πfc t + φ) − xq (t) sin(2πfc t + φ)) cos(2πfc t + φ̂) = xI (t) cos(2πfc t + φ) cos(2πfc t + φ̂) − xq (t) sin(2πfc t + φ) cos(2πfc t + φ̂) = xI (t) xI (t) cos(φ − φ̂) + cos(2π2fc t + φ + φ̂) 2 2 xq (t) xq (t) − sin(φ − φ̂) − sin(2π2fc t + φ + φ̂) 2 2 in cui ricompaiono il termine in fase xI (t) e quello in quadratura xq (t) riportati in banda base, accompagnati da due termini modulati alla frequenza 2fc , che possono essere (quasi completamente) eliminati tramite il filtro adattato di ricezione (che segue immediatamente l’operazione di down-conversion e che per sua natura è un filtro passabasso visto che ha una risposta in frequenza del tipo radice di coseno rialzato). Come si può vedere oltre al termine in fase xI (t) però compare anche il termine in quadratura xq (t) se φ = φ̂; questa compresenza è detta interferenza intervia (vedi rif. [3, sezione 6.2]) e va eliminata per poter recuperare correttamente la parte in fase. Moltiplicando rRF (t) per una oscillazione di tipo −sin con fase φ̂ si ottiene un’espressione analoga con xI (t) e xq (t) in posizioni invertite: xq (t) xq (t) cos(φ − φ̂) + cos(2π2fc t + φ + φ̂) 2 2 xI (t) xI (t) − sin(φ − φ̂) − sin(2π2fc t + φ + φ̂) 2 2 Anche in questo caso dopo il filtraggio rimarrà comunque il contributo di xI (t) sovrapposto alla parte in quadratura se φ = φ̂. Per poter quindi effettuare una demodulazione coerente si rende necessario effettuare il cosidetto “recupero della portante”. Nei ricevitori convenzionali (con architettura omodina o eterodina) tale parte di sincronismo viene svolta da una PLL (phase locked loop) ovvero un circuito dedicato che, rilevata la riga spettrale della portante (se tale riga è soppressa dal trasmettitore allora può essere ricreata usando diverse tecniche, 3. Implementazione con processori DSP 57 quale quella dello “square averaging”), si aggancia alla esatta frequenza della portante fc usata dal trasmettitore (che può essere spostata da quella nominale a causa di un carrier frequency offset - CFO) e alla sua esatta fase φ. La portante cosı̀ “ricostruita” dalla PLL in base al segnale ricevuto viene poi normalmente utilizzata come ingresso del mixer per la down-conversion. Nella nostra architettura interamente digitale e implementata via software, non avendo a disposizione una PLL ed un mixer risulta difficile eliminare l’interferenza intervia. Tuttavia, scrivendo i segnali down-convertiti x̂I (t) e x̂q (t) dopo il filtraggio: x̂I (t) = x̂q (t) = xq (t) xI (t) cos(φ − φ̂) − sin(φ − φ̂) 2 2 xq (t) xI (t) cos(φ − φ̂) + sin(φ − φ̂) 2 2 ed elaborandone poi l’inviluppo complesso: x̂(t) = x̂I (t) + j x̂q (t) = 1 1 = xI (t)[cos(φ − φ̂) + j sin(φ − φ̂)] + xq (t)[j cos(φ − φ̂) − sin(φ − φ̂)] = 2 2 1 1 = xI (t)[cos(φ − φ̂) + j sin(φ − φ̂)] + j xq (t)[cos(φ − φ̂) + j sin(φ − φ̂)] = 2 2 da cui volendo esprimere x̂(t) in funzione dell’inviluppo trasmesso x(t) si ottiene: x̂(t) = = 1 (xI (t) + jxq (t))[cos(φ − φ̂) + j sin(φ − φ̂)] = 2 1 x(t)ej(φ−φ̂) 2 (3.79) si nota che se non c’è CFO ma solo CPO (carrier phase offset), allora l’unico effetto sull’inviluppo complesso ricostruito x̂(t) rispetto l’inviluppo originario x(t) è quello di una rotazione di entità φ − φ̂. Tale rotazione non deve necessariamente essere compensata se si fa uso di una modulazione differenziale quale la DPSK, in cui il k esimo simbolo trasmesso non codifica la fase assoluta ma piuttosto la variazione di fase rispetto il simbolo (k-1 )-esimo (c’è però uno svantaggio nella modulazione DPSK: il raddoppio della probabilità di errore a parità di SNR). Un’alternativa adottata nell’ambito di questo progetto di tesi è quella di lasciare che sia l’equalizzatore a compensare tale rotazione (che a tale scopo utilizza alcuni simboli noti che il trasmettitore inserisce sempre), come se si trattasse di un effetto introdotto dal canale (che del resto contribuisce realmente con un ritardo di fase!). Ricostruito quindi l’inviluppo complesso nell’array received dopo aver moltiplicato per il coseno e il seno l’array data, si procede al filtraggio adattato convolvendo con l’array FIR response (vedi la fig. 3.19) l’array received (e scalando i valori risultanti per evitare eventuali problemi di overflow o di cancellazione di cifre significative). 58 3. Implementazione con processori DSP 5 4 Real part (INPHASE) of the FIR output x 10 3 2 1 0 −1 −2 −3 −4 4400 4600 4800 5 2 5000 5200 5400 Sample index 5600 5800 6000 6200 5800 6000 6200 Imaginary part (QUADRATURE) of the FIR output x 10 1.5 1 0.5 0 −0.5 −1 −1.5 −2 4400 4600 4800 5000 5200 5400 Sample index 5600 Figura 3.26: Segnale all’uscita del filtro del ricevitore relativo al simbolo di sincronismo. Le croci rosse evidenziano gli istanti di campionamento come sono stati calcolati in base alla metrica di timing coarse. I cerchi verdi evidenziano gli istanti di campionamento ideali. L’array baseband cosı̀ generato (come risultato del filtraggio) viene campionato a periodo di simbolo Ts per generare l’array r; si considerano cioè campioni distanti TTsc posizioni; poichè la funzione OFDM rx() è assolutamente generica, non suppone che tale rapporto sia intero ma piuttosto effettua una operazione di approssimazione nella generazione dell’indice di ogni campione da considerare. L’inviluppo complesso filtrato e campionato a frequenza di simbolo è passato alla sotto-funzione OFDM coarse timing() che effettua il calcolo della metrica di timing grezza mediante uno degli algoritmi descritti nella sezione 3.3 (normalmente quello di Bhargava&Letaief) e che ritorna l’indice del campione corrispondente al primo simbolo PAM del simbolo di sincronizzazione che precede i simboli di dati in ogni frame OFDM (vedi la fig. 3.20). Mediante il valore ritornato da OFDM coarse timing() si effettua quindi il campionamento (a frequenza di simbolo) del simbolo OFDM di sincronizzazione. A causa del CPO (come sopra descritto) tipicamente è presente anche una forte componente in quadratura per tale simbolo (che però a lato trasmettitore è modulato solo in fase); si veda ad esempio la fig. 3.26. Il passo successivo nell’elaborazione è, nel caso in cui si sia utilizzato come simbolo noto quello di Bhargava-Letaief, la stima (coarse) del CFO e della risposta impulsiva del canale (Channel Impulse Response - CIR). Il valore stimato del CFO, nell’ambito delle varie prove effettuate, risulta sempre molto piccolo rispetto al valore assoluto della frequenza di portante; inoltre, come già descritto nella sezione 3.3 anche il piccolo valore stimato è quasi totalmente da attribuirsi ad effetti diversi da un reale CFO, 3. Implementazione con processori DSP 59 visto che nella architettura utilizzata la portante è generata digitalmente e non da un oscillatore analogico affetto da derive che ne alterano la frequenza. Per quanto riguarda la stima della risposta impulsiva del canale, la sotto-funzione OFDM CIR estimation() partendo dal simbolo di sincronismo ricevuto ritorna il coefficiente complesso ĥ che caratterizza il modello di canale AWGN utilizzato nella simulazione utilizzando lo stimatore (versione modificata di [12, equ. 25]): ĥ = [SH · S]−1 SH · IN · r(θ̃) in cui S è una matrice N x1 contenente i simboli di canale trasmessi come referenceblock, SH · S rappresenta la potenza associata ai simboli di sincronismo, IN è la matrice identità N xN e r(θ̃) è il vettore dei simboli di canale relativi al simbolo di sincronizzazione campionati in base alla stima del coarse timing. Inizia infine il processo di demodulazione vero e proprio in cui si procede iterativamente, simbolo per simbolo, alle seguenti operazioni: 1. campionamento a frequenza di simbolo partendo dal campione il cui indice è determinato dal coarse-timing e dall’algoritmo di timing fine applicato sui simboli OFDM precedenti; dall’array baseband si passa all’array fft input with cp; 2. eliminazione del prefisso ciclico; da fft input with cp si passa all’array fft input; 3. stima fine della risposta impulsiva del canale (questo passo viene eseguito una volta ogni Ndata symbols per synch symbol solo sui simboli di sincronismo) in cui si aggiorna il coefficiente complesso che caratterizza il canale e che era stato stimato inizialmente; 4. calcolo della DFT (trasformata discreta di Fourier) mediante FFT; da fft input si passa all’array channel symbols with vc; 5. eliminazione delle sottoportanti virtuali; da channel symbols with vc si passa all’array channel symbols; 6. equalizzazione: molto semplicemente si dividono i valori dell’array channel symbols per il coefficiente complesso della CIR stimata precedentemente (vedi la fig. 3.27); il risultato è memorizzato in equ channel symbols; 7. timing fine: si calcola tramite l’algoritmo di Kim-Do-Cho (vedi la sezione 3.3) un errore di timing frazionario (cioè minore di un tempo di simbolo) sfruttando le sottoportanti modulate con dati noti che sono presenti in ogni simbolo OFDM (di dati utili). Questo valore verrà utilizzato al passo 1 precedentemente descritto per il simbolo OFDM successivo; 8. decisione hard sui simboli di canale equalizzati: per tutte le Nu ef f coppie di valori (parte reale e immaginaria) memorizzate nell’array equ channel symbols si procede a calcolare la distanza euclidea da tutti i punti della costellazione ideale (composta dagli stessi M punti utilizzati dal trasmettitore in fase di mapping) e poi si sceglie a favore del punto a distanza minore (criterio ML di massima verosimiglianza) memorizzando il risultato nell’array pam output bits; durante 60 3. Implementazione con processori DSP 4 5 x 10 Channel symbols before equalization 3 Quadrature 2 1 0 −1 −2 −3 −4 −4 −2 0 Inphase 2 4 5 x 10 Channel symbols after equalization 1.5 Quadrature 1 0.5 0 −0.5 −1 −1.5 −1.5 −1 −0.5 0 0.5 Inphase 1 1.5 Figura 3.27: Simboli di canale ricevuti prima e dopo l’equalizzazione; si noti che, oltre a compensare il CPO, l’equalizzatore elimina anche fattori di scala non voluti. 3. Implementazione con processori DSP 61 Plot of the equalized channel symbols for all OFDM symbols of a frame 1.5 1 Quadrature 0.5 0 −0.5 −1 −1.5 −1.5 −1 −0.5 0 In−Phase 0.5 1 1.5 Figura 3.28: Simboli di canale ricevuti in un frame OFDM contenente 50 simboli in totale (8 di sincronismo), con N = 128. In rosso i simboli di canale ricevuti nel primo simbolo OFDM; in blu quelli ricevuti nell’ultimo; in verde tutti gli altri. I quattro cerchi neri rappresentano la costellazione ideale. questa operazione viene salvato per ogni simbolo OFDM il valore di errore medio quadratico (mean square error - MSE) per consentire una valutazione delle performance del sistema a fine simulazione; Di tutti i passaggi descritti sopra è il timing-fine quello più critico. Nella figura 3.28 sono mostrati i simboli di canali ricevuti durante un intero frame OFDM. Come si nota dalla figura inizialmente i simboli di canale sono molto dispersi ed è grazie al timing fine (la stima fine del canale influisce assai poco) che convergono vicino ai punti ideali. Quando tutti i simboli OFDM sono stati demodulati nei passi sopra, allora si procede alla ricostruzione dei caratteri ASCII trasmessi raggruppando gli m = log2 M bit memorizzati nell’array pam output bits. Vengono infine stampati alcuni dei parametri prestazionali misurati duranti l’esecuzione della funzione. 62 3.4.3 3. Implementazione con processori DSP Simulazione dell’intero sistema Come precedentemente accennato, è lo script OFDM system.m che si occupa di richiamare le funzioni OFDM tx() e OFDM rx() precedentemente descritte. Tale script si occupa di inizializzare le costanti relative alla modulazione da usare, le cui più importanti sono elencate (molte sono state già introdotte in precedenza) nella tabella riportata di seguito: Costante α F IRresponse length Ts M N Np Fcarrier Nsymbols per OF DM f rame Ndata symbols per synch symbol Npilots Fc SN R Descrizione Fattore di roll-off nell’impulso a radice di coseno rialzato Lunghezza della risposta impulsiva in campioni Tempo di simbolo (sec) Ordine della modulazione PAM usata per le sottoportanti Numero di sottoportanti (ordine della FFT/IFFT) Lunghezza del prefisso ciclico in numero di simboli Frequenza della portante utilizzata (Hz) Numero di simboli OFDM che compongono un frame Numero di simboli OFDM di dati utili inseriti dopo ciascun simbolo OFDM di sincronizzazione Numero di sottoportanti pilota utilizzate per l’algoritmo di timing fine Frequenza di campionamento (Hz) Rapporto segnale rumore all’ingresso del ricevitore (dB) Un’altro importante parametro disponibile (che non riguarda però la modulazione) è MODE ; se impostato al valore “DEBUG SYSTEM TEST ” il simulatore viene avviato con alcuni parametri che semplificano notevolmente il debugging del sistema (ad esempio, invece che un impulso a radice di coseno rialzato utilizza un impulso triangolare che, pur non essendo bandalimitato, permette però di identificare facilmente la posizione ideale degli istanti di campionamento). Se impostato al valore “IDEAL SYSTEM TEST ” il simulatore viene avviato con tutti i parametri relativi al CFO, SFO e sampling jitter a zero, con SNR pari a +∞ e con un impulso a radice di coseno rialzato di durata molto lunga, permettendo quindi di verificare il funzionamento in condizioni ideali. Se impostato al valore “REALISTIC SYSTEM TEST ” invece il simulatore viene avviato con tutte i parametri utilizzati nel sistema effettivamente implementato (descritto nelle sezioni a seguire), in particolare con differenti valori per la costante Fc nel ricevitore e nel trasmettitore, nonchè con i CFO, SFO e sampling jitter misurati. Infine se MODE è impostato sul valore “ADC SYSTEM TEST ” il simulatore fornisce alla funzione OFDM rx() i valori dei campioni salvati dal ricevitore effettivamente implementato sul DSP, permettendo quindi di capire se il segnale generato dal trasmettitore e passato attraverso le conversioni digitale-analogico e analogico-digitale è corretto oppure no. 3. Implementazione con processori DSP 63 Parametric analysis of the BER 1.2 BER(Nsym) BER(N) BER(Np) BER(Ts us) BER(SNR dB) BER(Fcarrier Mhz) BER(FIRlength) BER(Alfa) −12 1 0.8 0.6 0.4 −9 0.2 −6 −3 0 3 0 0 2 4 6 6 21 8 10 12 24 27 14 30 16 Figura 3.29: Analisi parametrica della Bit Error Rate (BER) di un sistema OFDM in cui tutti i parametri eccetto quello analizzato di volta in volta sono impostati su valori ideali. La flessibilità del linguaggio MATLAB e del simulatore realizzato consente di utilizzare le funzioni OFDM rx() e OFDM tx() (e le altre sviluppate a loro supporto) ad alto livello per effettuare una analisi parametrica delle performance del sistema OFDM. Nelle figure 3.29 e 3.30 sono dunque riportati i risultati ottenuti rispettivamente simulando il sistema in condizioni ideali e più realistiche al variare di alcuni parametri. Come si può vedere sono principalmente il rapporto segnale-rumore (SNR) all’ingresso del ricevitore, il CFO e il jitter di campionamento a determinare il peggioramento della BER del sistema, il quale rimane invece abbastanza robusto (BER nulla su tutto il segnale simulato) al variare degli altri parametri listati nelle legende. 3.4.4 Dimensionamento del sistema Nella sezione precedente sono state riportate le principali costanti relative alla modulazione implementata. Per scegliere con esattezza i loro valori è necessario considerare il legame fra la banda occupata dal segnale OFDM e tali costanti (vedi il rif. [1]): BWOF DM ≈ Nu N Ts Poichè: ) * 1−α Nu = 2Nα + 1 = 2 N +1 2 se si sceglie α = 0.5, si ottiene: (3.80) 64 3. Implementazione con processori DSP Parametric analysis of BER 1.2 BER(SNR) BER(Tc jitter (ns)) BER(Fc offset (kHz)) −12 1 0.8 0.6 0.4 60 0.2 50 0 0 0 60 10 20 30 40 50 60 Figura 3.30: Analisi parametrica della Bit Error Rate (BER) di un sistema OFDM in cui tutti i parametri eccetto quello analizzato di volta in volta sono impostati su valori realistici per il sistema realizzato nella pratica. BWOF DM ≈ N 2 +1 1 ≈ N Ts 2 Ts che rappresenta una comoda formula di progetto e, pur essendo approssimata, mette bene in luce che la banda della modulazione OFDM dipende quasi esclusivamente dal tempo di simbolo. Oltre all’eq. (3.80) è comunque importante tenere presente anche le espressioni della durata di un frame OFDM TOF DM f rame : TOF DM f rame = Nsymbols per OF DM f rame Nt Ts = Nsymbols per OF DM f rame (N + Np ) Ts (3.81) della bit rate netta (ovvero considerando i dati utili effettivamente trasmissibili senza codice a correzione d’errore) del sistema BROF DM : 3. Implementazione con processori DSP BROF DM ≈ ≈ = 65 Nbits per symbol Ndata symbols per OF DM f rame TOF DM f rame Nu ef f (log2 M )Nsymbols per OF DM f rame TOF DM f rame + , 2 N 1−α + 1 − Npilots Nu − Npilots 2 log2 M = log2 M (N + Np ) Ts (N + Np ) Ts Npilots N Np N ) N 2 1 + 1 − Npilots − = log2 M ≈ 2 (N + Np ) Ts (1 + = BWOF DM log2 M log2 M log2 M ≈ Ts 2Ts (3.82) e infine della efficienza spettrale η OF DM : η OF DM = BROF DM ≈ log2 M BWOF DM (3.83) Da tali equazioni, pur se approssimate, si deduce che la bit rate del sistema realizzato dipende principalmente dalla banda del segnale OFDM e dall’ordine M della modulazione PAM utilizzata per le varie sottoportanti, cosı̀ come pure l’efficienza spettrale dipende solo dall’ordine M . Considerando l’hardware a disposizione, si sono dunque scelte due differenti modulazioni di test: Parametro 1o mod. α F IRresponse length Ts M N Np Fcarrier Nsymbols per OF DM f rame Ndata symbols per synch symbol Npilots Fc del tx Fc del rx BWOF DM BROF DM η OF DM Valore scelto 0.5 256 2µs 4 16 1 800kHz 10 9 6 19.78MHz 11.10MHz 281kHz 122kbps 0.44bit/s/Hz Parametro 2o mod. α F IRresponse length Ts M N Np Fcarrier Nsymbols per OF DM f rame Ndata symbols per synch symbol Npilots Fc del tx Fc del rx BWOF DM BROF DM η OF DM Valore scelto 0.5 256 10µs 4 16 1 800kHz 10 9 6 3.86MHz 11.10MHz 56kHz 24kbps 0.44bit/s/Hz Tali parametri sono conservativi e servono per testare il sistema; in particolare la seconda modulazione in cui la frequenza del trasmettitore è artificialmente rallentata da quella massima possibile fino alla frequenza misurata di 3.86M Hz. 66 3. Implementazione con processori DSP Può venire utile comparare tali costanti con quelle usate in lavori precedenti (vedi [5]) limitati all’utilizzo dei convertitore pensati per applicazioni audio: Parametro mod. Ts Fc del tx F IRresponse length N Fcarrier 3.5 3.5.1 Valore scelto 125us 44kHz 68 512 7kHz Implementazione del trasmettitore La scheda EVM TMS320C6424 La scheda EVM C6424 è una piattaforma di sviluppo che può funzionare tramite porta PCI o in modalità standalone, e permette di valutare e sviluppare applicazioni per la famiglia di processori TI C64xx. Caratteristiche chiave della scheda (il cui schema a blocchi è disponibile nella figura 3.31) sono: • un processore TMS320C6424 operante a 600MHz; • 128MB di memoria DDR2; • interfaccia UART di I/O; • 16MB di memoria Flash non volatile, 64MB di Flash NAND, 2MB di SRAM; • codec audio stereo AIC33; • interfaccia I 2 C; • interfaccia Ethernet 10/100 Mbps; • interfaccia di emulazione JTAG; • interfaccia VLYNQ; • interfaccia S/PDIF analogica e ottica; Il processore C6424 si interfaccia con le periferiche sulla scheda tramite on bus EMIF a 16bit e interfacce dedicate. La memoria DDR2 è connessa al suo bus dedicato a 32bit. Il bus EMIF può essere connesso tramite jumper alle memorie Flash, SRAM, NAND e ai connettori di espansione disponibili per l’interfacciamento con schede di add-on. Un alimentatore stabilizzato esterno a +5V è utilizzato per alimentare la scheda che tramite dei convertitori switching DC-DC produce le tensioni +1.2V e +3.3V necessarie per il DSP e le periferiche, nonchè i +1.8V per la memoria DDR2. Il Code Composer comunica con la scheda EVM tramite un emulatore integrato o tramite il connettore esterno JTAG a 14pin. 3. Implementazione con processori DSP Figura 3.31: Schema a blocchi della scheda EVM del DSP C6424. Figura 3.32: Mappa di memoria per la scheda C6424 EVM. 67 68 3. Implementazione con processori DSP La famiglia dei processori C64xx ha uno spazio di indirizzamento molto vasto ma alcune limitazioni sono determinate dalle interconnessioni con le periferiche. Il codice di programma e i dati possono essere posizionati in qualunque punto dello spazio di indirizzamento. La mappa di memoria della figura 3.32 mostra lo spazio di indirizzamento di un processore C6424. In particolare le memorie Flash, NAND o SRAM possono essere mappate nello spazio CS2 e sono selezionabili attraverso JP2. 3.5.2 La scheda EVM DAC2904 I primi test di interconnessione della scheda EVM del C6424 sono stati effettuati con la scheda di valutazione del DAC5682 (DAC a 16bit, 1GSPS); tale integrato si è rivelato tuttavia troppo performante per gli scopi del progetto qui descritto e nella pratica inutilizzabile a causa di PLL interni non in grado di agganciarsi ai segnali generati dal DSP (perchè a frequenze troppo basse). Si è quindi passati all’uso di una scheda più adatta, nella fattispecie la scheda EVM dell’integrato DAC2904, il cui schema elettrico è riportato nella figura 3.33. Si noti in particolare che ingressi e uscite sono adattate a 50Ω (tramite R38 e R27-R30) e che l’uscita (IOUT1 sul connettore J4) è accoppiata in AC (tramite il trasformatore T2; questa configurazione di uscita è quella suggerita nel datasheet del DAC2904 per la conversione differenziale-single/ended). Il risultato è che il DAC non è in grado di generare segnali a frequenze troppo basse, le quali sono tagliate dal filtro passa-alto di uscita. Una caratterizzazione accurata della funzione di trasferimento della circuiteria analogica di uscita è difficile ma sarebbe importante per un uso corretto della scheda. La scheda DAC2904-EVM è progettata per rendere più semplice la valutazione del DAC2904, un convertitore digitale-analogico ad alta velocità (14bit, 125MSPS), e grazie alla sua struttura flessibile consente svariate configurazioni differenti per il clocking della scheda, l’uso di un riferimento interno od esterno, etc. Fra i dati più importanti listati nel relativo datasheet è riportato nella fig. 3.34 il set delle specifiche temporali da rispettare per inviare correttamente dati digitali al DAC; il funzionamento è in effetti molto semplice: quando sul pin di ingresso del clock il DAC avverte una transizione basso-alto, allora campiona gli ingressi dei dati (14 pin) e usa il valore quantizzato su quei 14bit per generare una tensione analogica di uscita. Una importante caratteristica da notare è che il DAC2904 funziona da interpolatore a ordine zero (interpolatore a mantenimento noto anche come sample&hold ) e +∞ ! c non ha filtri sull’uscita. Il segnale ricostruito x̂(t) = x[n] rect t−Tc /2−nT a Tc n=−∞ partire dalla sequenza tempo-discreta x[n] che codifica il segnale tempo-continuo x(t) ha dunque una trasformata data da (vedi [2, pag. 246]): 33 31 29 27 25 23 21 19 17 15 13 11 9 7 5 3 1 NOTES: 33 31 29 27 25 23 21 19 17 15 13 11 9 7 5 3 1 22 R31 D0_2 D1_2 D2_2 D3_2 D4_2 D5_2 D6_2 D7_2 D8_2 D9_2 D10_2 D11_2 D12_2 D13_2 D0_1 D1_1 D2_1 D3_1 D4_1 D5_1 D6_1 D7_1 D8_1 D9_1 D10_1 D11_1 D12_1 D13_1 R1 CLK1 CLK2 R4 22 Ohms R3 22 Ohms R2 22 Ohms 22 Ohms 1. PART NOT INSTALLED 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4 2 DATA PORT 2 J2 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4 2 DATA PORT 1 22 R14 BD0_2 BD1_2 BD2_2 BD3_2 BD4_2 BD5_2 BD6_2 BD7_2 BD8_2 BD9_2 BD10_2 BD11_2 BD12_2 BD13_2 BD0_1 BD1_1 BD2_1 BD3_1 BD4_1 BD5_1 BD6_1 BD7_1 BD8_1 BD9_1 BD10_1 BD11_1 BD12_1 BD13_1 U2 LT1004D-1.2 1K 500 R7 6 5 7 CLK2 CLK1 1 C21 2 W10 C6 BD1_1 BD0_1 WRT_1 J5 0.1uF DVDD 0.1uF 1 0 Ohm J13 SMA W5 2 0 Ohm R26 2 W2 AVDD U5 DAC290x (Note 1) CLK_1 J6 0 Ohm R23 49.9 (Note 1) R32 WRT_1 D13_1 D12_1 D11_1 D10_1 D9_1 D8_1 D7_1 D6_1 D5_1 D4_1 D3_1 D2_1 C20 R22 BD13_1 1 BD12_1 2 BD11_1 3 BD10_1 4 BD9_1 5 BD8_1 6 BD7_1 7 BD6_1 8 BD5_1 9 BD4_1 10 BD3_1 11 BD2_1 12 0.1uF 3 0.1uF C7 W1 EXTIO C11 AVDD 1 (0-1.25V) .1uF C19 1K R9 0 Ohm (Note 1) R21 DVDD .1uF AVDD TLV2462D U4A 2 AVDD 8 TLV2462D U4B 2 NOT USED 10uF + C5 3 1 3 4 1 3 2 3 4 5 5 4 3 2 R5 5 4 3 2 CLK_1 CLK_2 1 (Note 1) (Note 1) CLK_2 J7 0 Ohm R24 0 Ohm R33 49.9 R34 (Note 1) BD12_2 BD13_2 BD0_2 BD1_2 BD2_2 BD3_2 BD4_2 BD5_2 BD6_2 BD7_2 BD8_2 BD9_2 BD10_2 BD11_2 1 0 Ohm R25 (Note 1) WRT_2 J8 (Note 1) 0 Ohm R35 49.9 R36 (Note 1) WRT_2 36 35 34 33 32 31 30 29 28 27 26 25 1 2K R16 (Note 1) 0 Ohm 49.9 R38 FSA2 R37 POWER DOWN W6 DVDD 2K D0_2 D1_2 D2_2 D3_2 D4_2 D5_2 D6_2 D7_2 D8_2 D9_2 D10_2 D11_2 2 FSA1 R15 1 3 1 3 48 47 46 45 44 43 42 41 40 39 38 37 N/C +VA IOUT1 IOUT1 FSA1 REF_IN GSET FSA2 IOUT2 IOUT2 AGND PD D1_1 D0_1 DGND +VD WRT_1 CLK_1 CLK_2 WRT_2 DGND +VD D13_2 D12_2 13 14 15 16 17 18 19 20 21 22 23 24 5 4 3 2 Figura 3.33: Schematico della scheda DAC2904-EVM. 5 4 3 2 R27 49.9 49.9 R17 22pF (Note 1) C22 (Note 1) 22 pF C12 R28 49.9 R19 100 22 pF (Note 1) C13 R30 24.9 22pF (Note 1) C23 100 R29 500 R41 AVDD R18 49.9 500 R40 AVDD 0 Ohm 0 Ohm R13 0 Ohm R12 0 Ohm R11 R10 R20 24.9 SMA T1 6 1 .1uF C24 R46 0 Ohm (Note 1) 1 1 2 3 (Note 1) R43 0 Ohm .1uF C14 1 T2 1 (Note 1) 6 SMA (Note 1) J17 T1-1T-KK81 4 J16 SMA 3 4 T1-1T-KK81 R45 J15 0 Ohm SMA (Note 1) (Note 1) 1 2 1 0 Ohm R44 (Note 1) 1 (Note 1) J14 2 3 4 5 2 3 4 5 2 3 4 5 2 3 4 5 J3 IOUT2 J4 IOUT1 2 3 4 5 2 3 4 5 J1 AVDD 3. Implementazione con processori DSP 69 70 3. Implementazione con processori DSP Figura 3.34: Specifiche delle tempistiche da rispettare per la comunicazione con il DAC2904. X̂(f ) = F[x̂(t)] = +∞ j2πf t x̂(t)e dt = −∞ +∞ n=−∞ x[n] +∞ −∞ rect t − Tc /2 − nTc Tc ej2πf t dt = +∞ t − Tc /2 − nTc = x[n]F rect = x[n]Tc sinc(f Tc )ej2πf (Tc /2+nTc ) = T c n=−∞ n=−∞ +∞ = Tc sinc(f Tc )ejπf Tc jπf Tc = sinc(f Tc )e +∞ x[n]ej2πnf Tc = Tc sinc(f Tc )ejπf Tc X̄(f ) = n=−∞ +∞ k=−∞ k X f− Tc Questo comporta due problemi: 1. nel segnale ricostruito sono presenti le ripetizioni spettrali dell’intervallo base Fc Fc − 2 ; 2 a cavallo delle frequenze ±kFc con k ∈ {N\1}. Per rimuovere tali repliche si è quindi provveduto ad usare un filtro anti-immagine in cascata al convertitore (un semplice filtro RC passa-basso del 1o ordine); 2. anche nell’intervallo base − F2c ; F2c = − 2T1 c ; 2T1 c lo spettro di X̂(f ) è diverso dallo spettro voluto X(f ) a causa della presenza del termine sinc(f Tc )ejπf Tc che determina lo smorzamento delle frequenze vicine a ± F2c di un fattore sinc( F2c Tc ) ≈ 0, 64 ovvero una riduzione del 36%. Per compensare tale effetto si può filtrare 3. Implementazione con processori DSP 71 la sequenza x[n] prima di inviarla al DAC in modo da amplificare le frequenze 1 vicine a ± F2c di un fattore 0,64 = 1, 56 per “equalizzare” il risultato finale. Il filtro da mettere prima del DAC è chiamato in seguito filtro di pre-distorsione. 3.5.3 Interconnessione DSP-DAC Uno fra i primi problemi che si è dovuto risolvere è stato quello di scegliere un bus digitale sufficientemente veloce per effettuare l’interconnessione fisica fra le due schede precedentemente descritte. Nella tabella che segue sono quindi listate le velocità e la tipologia per i principali bus digitali disponibili sulla scheda EVM del DSP c6424 elaborati dal relativo datasheet. Nome bus EMIFA I 2C GPIO McBSP Massima velocità <25MHz ∼400Kbps ∼25MHz ∼50MHz Tipo Parallelo (16bit) Seriale Parallelo (32bit) Seriale Appare dunque evidente che l’unico bus digitale parallelo (il DAC ha ingressi paralleli; questo permette di ridurre la velocità necessaria al master del bus per spedire una parola dati a parità di bit rispetto una soluzione seriale) utilizzabile è il General Purpose Input/Output (GPIO); tale bus permette di raggiungere una bitrate teorica pari a 14bit 25MHz = 175M bps (il fattore due tiene conto del fatto che un ciclo comple2 to di fetch dati al DAC richiede che il pin del clock effettui una transizione basso-alto seguita da una transizione alto-basso; si veda la fig. 3.34) sufficiente per gestire fino a circa 12.5M Hz di banda con i 14bit di risoluzione del DAC. Più nel dettaglio, per effettuare la comunicazione dei dati fra DSP e DAC si è deciso di generare il segnale di clock tramite uno dei piedini GPIO del DSP. Da un lato questo permette di essere sicuri che i dati siano già pronti quando il clock effettua una transizione basso-alto (via software questo si ottiene impostando prima lo stato dei pin relativi ai dati e solo dopo effettuando la transizione sul pin del clock), dall’altro comporta che il clock ricevuto dal DAC non sia un segnale pulito (in termini di jitter o phase noise e di frequenza) come quello che si potrebbe ottenere da un PLL opportunamente agganciato al segnale di clock del DSP. Poichè tuttavia la scheda EVM del DSP non consente di fornire il clock da una sorgente esterna (ciò permetterebbe di sincronizzare DSP e DAC con un semplice generatore di funzioni), nè di prelevarlo su un qualche connettore, si è stati costretti ad implementare la soluzione precedentemente descritta. Come sarà descritto in seguito questo si è rivelato un problema critico. Stabilito dunque l’uso del GPIO come bus digitale di interconnessione, si è proceduto alla realizzazione di un cavo ad-hoc (vedi foto 3.35 e 3.36) per mappare i pin disponibili per l’I/O su bus GPIO del connettore J1 della scheda del DSP ai giusti pin del connettore J5 della scheda del DAC: 72 3. Implementazione con processori DSP Figura 3.35: Foto della scheda EVM del DSP C6424 collegata alla scheda DAC2904EVM. Figura 3.36: Foto della scheda EVM del DSP C6424 collegata alla scheda DAC2904EVM. 3. Implementazione con processori DSP Pin sul conn. J1 del DAC Pin sul conn. DC P1 del DSP 1 = DB13 3 = DB12 5 = DB11 7 = DB10 9 = DB9 11 = DB8 13 = DB7 25 = GP[45] 27 = GP[44] 14 = GP[43] 12 = GP[42] 10 = GP[41] 8 = GP[40] 7 = GP[39] Bit nel banco 23 del GPIO 13o 12o 11o 10o 9o 8o 7o 73 Pin sul conn. J1 del DAC 15 17 19 21 23 25 27 = = = = = = = DB6 DB5 DB4 DB3 DB2 DB1 DB0 Pin sul conn. DC P1 del DSP 9 = GP[38] 11 = GP[37] 13 = GP[36] 17 = GP[35] 18 = GP[34] 36 = GP[33] 32 = GP[32] Bit nel banco 23 del GPIO 6o 5o 4o 3o 2o 1o 0o Oltre ai pin sopra elencati bisogna ricordare anche che il cavo contiene un pin dedicato alla massa (pin 98 su DC P1, pin 28 su J1) e un pin dedicato al clock (pin 28 su DC P1 che si connette tramite cavo SMA al conn. J5). Infine, riguardo all’alimentazione della scheda DAC2904-EVM è stata collegata la analog VDD (J9) e la digital VDD (J11) assieme ad un alimentatore DC impostato su 4.5V cosı̀ come i relativi connettori di massa (J12 e J10) sono stati collegati assieme. Per quanto invece concerne il lato software, per poter utilizzare i pin in modalità GPIO, è necessario agire su alcuni registri interni del DSP al fine di disabilitare le funzioni di più alto livello con cui quei pin sono multiplexati. La funzione che se ne occupa è gpioConfig(): void gpioConfig() { GPIO_Handle gpio_handle2; Uint16 pin; // inizializzo il GPIO EVM6424_GPIO_init(); // cambio il valore dei registri per abilitare i pin del GPIO CFG_PINMUX0 = 0x00040000; CFG_PINMUX1 = 0 | ( 1 << 24 | ( 1 << 22 | ( 2 << 20 | ( 0 << 16 | ( 2 << 14 | ( 0 << 12 | ( 1 << 10 | ( 1 << 8 | ( 0 << 4 | ( 0 << ) ) ) ) ) ) ) ) ) 0 ); // // // // // // // // // // // SPBK1 SPBK0 TIM1BK TIM0BK CKOBK PWM1BK UR0FCBK UR0DBK HOSTBK (permette PCIEN - McBSP1 disabled - McBSP0 disabled - UART1 enabled, Timer1 disabled - Timer0 enabled - CLKOUT disabled, PWM2 enabled - PWM1 disabled, GIO84 enabled - UART0 HW flow control enabled - UART0 data enabled - VLYNQ + MII + MDIO Mode il funz. di GP[64] GP[65] GP[66]) - PCI disabled 74 3. Implementazione con processori DSP // imposto la direzione d’uscita per tutti i pin del GPIO for (pin=GPIO00;pin<=GPIO110; pin++) { EVM6424_GPIO_setDir( pin, OUTPUT_DIRECTION ); } // definisco il banco del GPIO gpio_handle2 = &GPIO_MODULE_23; // inizializzo a 0 tutti i pin del banco gpio_handle2->regs->CLR_DATA = 0xFFFFFFFF; } dove le funzioni EVM6424 GPIO init() e EVM6424 GPIO setDir(), nonchè la variabile globale GPIO MODULE 23, sono definite nella libreria di supporto del DSP. Assieme a gpioConfig(), la quale va chiamata all’inizio del programma che intende usare il GPIO, è utile anche la funzione gpioFree(), che dualmente va chiamata al termine del programma: void gpioFree() { // rimetto i registri al loro valore iniziale disabilitando il GPIO EVM6424_init( ); } Per testare la corretta funzionalità del bus si sono svolti numerosi test; si rimanda per maggiori informazioni alla funzione gpioGenerateTestTone() nel software del trasmettitore. Per la trasmissione dei dati vera e propria si è invece dapprima scritta una routine in C: void gpioTransmitData(Uint16*rf_real, size_t buff_size) { volatile Uint32* outreg; volatile Uint32* setreg; Uint16 *p, *end_array; gpioConfig(); outreg // setreg // = (Uint32*)(0x01C6703C); equivalent to (&GPIO_MODULE_23->regs->OUT_DATA); = (Uint32*)(0x01C67040); equivalent to (&GPIO_MODULE_23->regs->SET_DATA); 3. Implementazione con processori DSP 75 end_array = rf_real + buff_size*sizeof(Uint16); while (1) // endless transmission { p = rf_real; while (p<end_array) { // before making the low->high transition on the // clock pin, prepare data on the bus (*outreg) = *(p++); (*setreg) = 1<<PIN_DAC_CLOCK; // Set to HIGH } } gpioFree(); }\bigskip Le prestazioni misurate usando questa funzione sono tuttavia abbastanza distanti dal limite teorico; nel tentativo di aumentare la banda di trasmissione e soprattutto di migliorare la qualità del segnale di clock (vedi sez. 3.7) si è poi riscritta tale funzione in assembler: ; --------------------------------------------------------; C-CALLABLE FUNCTION: ; void gpioTransmitRealData_asm(Uint16* real_data, ; int data_size) ; ; DESCRIPTION: transmits the samples in real_data to the DAC ; ; C-EQUIVALENT CODE: ; while (real_data<(real_data+data_size*sizeof(Uint16))) ; { ; GPIO_BANK2_OUT_DATA = *real_data++ & 0x3FFF; ; // two effects: 1) puts data on the BUS ; // 2) drives low the PIN_DAC_CLOCK pin ; GPIO_BANK2_SET_DATA = 1<<PIN_DAC_CLOCK; // Set to HIGH ; } ; ; PERFORMANCE: measured frequency up to 21MHz ; _gpioTransmitRealData_asm: ; real_data pointer is in register A4 ; data_size is in register B4 ; return location is in register B3 ; ; NOTE: constant 0x01C67000 is the base address of GPIO modules 2&3 76 3. Implementazione con processori DSP ; (see TMS320C6424 datasheet) ; ; loop counter ’i’ is allocated in register A9 ; registers A1,A3,A5,B0,B1 are used as temporaries ; MV A4,B2 ; save initial pointer location MVK 0,A9 ; i=0 MVKL 0x01C67000,A3 ; move 0x703C constant in lower part of A3 reg MVKH 0x01C67000,A3 ; move 0x01C6 constant in upper part of A3 reg MVKL 1<<PIN_DAC_CLOCK,A5 ; move (1<<PIN_DAC_CLOCK)==(1<<CSL_GPIO_PIN0)==1 into A5 MVKH 1<<PIN_DAC_CLOCK,A5 ; move (1<<PIN_DAC_CLOCK)==(1<<CSL_GPIO_PIN0)==1 into A5 MVKL 0x3FFF,A2 MVKH 0x3FFF,A2 ADD A4,B4,B1 ; B1 = real_data+data_size ADD B1,B4,B1 ; B1 now points to the end of the real_data array STW A5,*+A3[17] ; put A5 into A3+(17<<2)=A3+0x44 == GPIO’s CLR_DATA NOP 4 ; required TransmissionLoop2: LDH *A4++,A1 ; [4-slots] load into A1 the contents of ; A4 memory pointer==data[i] NOP STW NOP STW 4 A1,*+A3[15] 6 A5,*+A3[16] ; put A1 into A3+(15<<2)=A3+0x3C == GPIO’s OUT_DATA ; (this also drives low the DAC clock pin) ; put A5 into A3+(16<<2)=A3+0x40 == GPIO’s SET_DATA CMPLT A4,B1,B0 ; [single cycle] real_data<real_data+data_size? ; code for transmitting once the given samples and then stop: ; NOP 1 ; to simulate code for forever-tx ; [B0] BNOP TransmissionLoop2,5 ; if B0 == 1, goto TransmissionLoop ; code for transmitting the given samples FOREVER: [!B0] MV B2,A4 ; if B0==0, real_data = original ; real_data pointer BNOP TransmissionLoop2,5 ; always goto TransmissionLoop2 NOP B NOP 9 B3 5 ; return Con questa funzione si sono verificati notevoli miglioramenti prestazionali (pin del clock in grado di commutare fino a 21MHz, molto vicino quindi alla max. frequenza 3. Implementazione con processori DSP 77 teorica), ma nessun miglioramento della qualità del segnale di clock. Un ulteriore miglioramento possibile (in termini di velocità), che però non è stato implementato, consiste nel pipelining e unrolling della routine di trasmissione dati: invece che caricare dalla memoria l’i-esimo campione e poi spedirlo al DAC (operazioni che non possono essere eseguite contemporaneamente dalle unità parallele di elaborazione del DSP) si potrebbe caricare il campione i-esimo, ma spedire al DAC il campione (i-1)-esimo e cosı̀ via. In questo modo si potrebbe trarre vantaggio dall’architettura ottimizzata dei DSP della famiglia C64xx in grado di eseguire fino a 4 istruzioni contemporaneamente. 3.5.4 Codice per il trasmettitore Appurato che il collegamento fra DAC e DSP funziona, si è proceduto alla scrittura in codice C del trasmettitore OFDM descritto nella sezione 3.4. Rispetto al codice MATLAB la scrittura in C, per un DSP in virgola fissa come il C6424, comporta necessariamente una maggiore attenzione alle costanti di scala nel segnale lungo la catena di elaborazione; da una parte infatti è necessario lavorare in ogni fase sfruttando il maggior numero possibile degli n bit con cui si codificano i dati (con valori vicini quindi ai limiti ±2n−1 − 1 per numeri interi con segno) per mantere il rapporto segnale-rumore-di-quantizzazione SN Rq ≈ 6n maggiore possibile (vedi rif. [2, pag. 541]). D’altra parte bisogna evitare problemi di overflow, soprattutto nelle operazioni di FFT/IFFT e di moltiplicazione in generale. Le costanti di scala e il range di ingresso/uscita dei segnali nelle varie fasi di elaborazione sono rappresentate nella fig. 3.37, che riassume le funzioni principali del signal-processing implementate nel file signalproc.c del software sviluppato in questo progetto. Per realizzare il sistema si è fatto ampio uso delle librerie di supporto alla famiglia di processori C64xx e descritte nel documento “TMS320C64x+ DSP LittleEndian DSP Library Programmer’s Reference” (Texas Instruments literature number: SPRUEB8B). In particolare, si è fatto uso delle funzioni DSP ifft32x32() e DSP fft32x32() che effettuano rispettivamente le operazioni di IFFT e FFT a 32bit e sono scritte in un assembler altamente ottimizzato. Uno dei punti più critici (dal punto di vista delle performance e della memoria richiesta) per il modem real-time che si è voluto realizzare è infatti non tanto la generazione dei simboli complessi di canale da trasmettere (cosa di cui si occupa la funzione tx OFDM symbol(); vedi la fig. 3.37) quanto invece il filtraggio a radice di coseno rialzato di tali simboli (cosa di cui si occupa la funzione filter()). L’implementazione dei filtri FIR si può effettuare in vari modi; in altri lavori (vedi [5]) si è adottata la soluzione classica a linea di ritardo. Tuttavia in questo progetto, considerata la lunghezza che si è scelta per la risposta impulsiva e il numero di simboli di canale da filtrare si è preferito optare per l’uso della tecnica di convoluzione veloce (vedi [2]); la soluzione a linea di ritardo infatti è tendenzialmente più efficiente solo per filtri di ordine ridotto (meno di 60-80 prese). Grazie alle funzioni delle librerie di supporto l’implementazione è abbastanza immediata ed è riportata qui di seguito come riferimento per futuri lavori sui DSP: 78 3. Implementazione con processori DSP Chars [char*] tx_chars(): Chars bits [Bit*] tx_OFDM_frames(): Conversione char=>Bit Incapsulamento e zero-padding Array di tipo Bit di lunghezza fissa a NUM_BITS_PER_OFDM_FRAME x Nframes tx_OFDM_frame() x Nsymbols map_QPSK_symbols(): Array di tipo Bit di lunghezza fissa a NUM_BITS_PER_OFDM_SYMBOL Array complesso di int32 lungo NUM_USEFUL_SUBCARRIERS [-PAM_MAX;PAM_MAX] insert_virtual_carriers(): PAM_MAX=(2^31-1)/NUM_SUBCARRIERS Array complesso di int32 lungo NUM_SUBCARRIERS [-PAM_MAX;PAM_MAX] tx_OFDM_symbol() Array reale di uint16 lungo OFDM_FILTERED_SYMBOL_LENGTH [0;UINT16_MAX] dac_conversion() Array complesso di int32 lungo OFDM_FILTERED_SYMBOL_LENGTH [-INT_MAX;INT_MAX] upconvert() DSP_ifft32x32(): Array complesso di int32 lungo NUM_SUBCARRIERS [-INT_MAX;INT_MAX] add_cyclic_prefix(): Array di tipo Bit di lunghezza fissa a NUM_BITS_PER_OFDM_SYMBOL Array complesso di int32 lungo NUM_SYMBOLS_EXT_BLOCK [-INT_MAX/CONV_ORDER; +INT_MAX/CONV_ORDER] Array complesso di int32 lungo CONVOLUTION_ORDER [-INT_MAX;INT_MAX] filter(): fast convolution FIR Figura 3.37: Rappresentazione della catena di signal-processing che implementa il trasmettitore OFDM. Le frecce indicano la relazione “chiama la funzione”. 3. Implementazione con processori DSP void filter(int* input, int* output) { int i; 79 // NUM_TOTAL_SYMBOLS*2 long // CONVOLUTION_ORDER*2 long if (OFDM_SYM_LENGTH+FILTER_RESPONSE_LENGTH-1 > CONVOLUTION_ORDER) { printf("ERROR!!! Invalid sequence length\n"); return; } // build the complex input sequence // (which results OFDM_SYM_LENGTH samples long) and zero-pad it // so that it becomes long up to CONVOLUTION_ORDER samples memset(g_buffer1, 0, sizeof(int)*CONVOLUTION_ORDER*2); for (i=0; i<NUM_TOTAL_SYMBOLS; i++) { g_buffer1[((i+1)*SYMBOL_INTERVAL - 1)*2] = input[i*2]; g_buffer1[((i+1)*SYMBOL_INTERVAL - 1)*2 + 1] = input[i*2 + 1]; } // compute the FFT of the first sequence saving the // result in g_buffer2 // IMPORTANT: the function requires the input to be in the // [-INT_MAX/CONVOLUTION_ORDER;+INT_MAX/CONVOLUTION_ORDER] // range DSP_fft32x32(getTwiddlesFor(CONVOLUTION_ORDER), CONVOLUTION_ORDER, g_buffer1, g_buffer2); // IMPORTANT: g_buffer2 should now be in the range // [-8*INT_MAX/CONVOLUTION_ORDER;+8*INT_MAX/CONVOLUTION_ORDER] // multiply one FFT by the FFT of the other sequence // saving the result in g_buffer1 for (i=0; i<CONVOLUTION_ORDER; i++) { // multiplication of two 32bits integers generally leads to 64bits // integers; however here we’re multiplying g_filter_response_fft // (which is precomputed and that occupies the entire INT_MAX // range) with g_buffer2 which however is limited to the // [-8*INT_MAX/CONVOLUTION_ORDER;+8*INT_MAX/CONVOLUTION_ORDER] // range which corresponds to 23 bits when CONVOLUTION_ORDER=2048 // => integer_23bit*integer_32bit = integer_55bit // we need g_buffer1 to be in the // [-INT_MAX/CONVOLUTION_ORDER;+INT_MAX/CONVOLUTION_ORDER] 80 3. Implementazione con processori DSP // range (i.e. in 20 bits of precision); // => the shift must be of 55 - 20 = 35 positions // => for now keep it to 32 g_buffer1[i*2] = \ (_mpy32ll(g_buffer2[i*2],g_filter_response_fft[i*2]) _mpy32ll(g_buffer2[i*2+1],g_filter_response_fft[i*2+1]))>>32; g_buffer1[i*2+1] = \ (_mpy32ll(g_buffer2[i*2],g_filter_response_fft[i*2+1]) + _mpy32ll(g_buffer2[i*2+1],g_filter_response_fft[i*2]))>>32; } // do the inverse FFT... // IMPORTANT: the function requires the input to be in the // [-INT_MAX/CONVOLUTION_ORDER;+INT_MAX/CONVOLUTION_ORDER] // range DSP_ifft32x32(getTwiddlesFor(CONVOLUTION_ORDER), CONVOLUTION_ORDER, g_buffer1, output); // IMPORTANT: the output range should be in the // [-8*INT_MAX/CONVOLUTION_ORDER;+8*INT_MAX/CONVOLUTION_ORDER] // range // NOTE: of all the samples of the ’output’ buffer only those // with index [0;OFDM_SYM_LENGTH+FILTER_RESPONSE_LENGTH-1] // are ’valid’ }\bigskip Un ulteriore vantaggio della tecnica a convoluzione veloce è la facilità con cui si possono combinare più filtri assieme (vedi la fig. 3.38) Nel nostro caso specifico, questo può venir utile per unire all’operazione di filtraggio a radice di coseno rialzato anche il filtro di pre-distorsione per compensare la distorsione introdotta poi dal DAC (vedi la sez. 3.5.2). Per maggiori dettagli sulle altre parti di codice relative all’elaborazione del segnale si può fare riferimento alla sezione 3.4 che contiene la spiegazione dettagliata dei passi da eseguire in modulatore OFDM, o direttamente al codice sorgente. Nella figura 3.39 è mostrato il segnale finale visualizzato su un oscilloscopio all’uscita del DAC. Nella figura 3.40 è mostrato il relativo spettro di potenza cosı̀ come è stato misurato. Passando invece all’analisi dell’infrastruttura generale del trasmettitore, i dati da trasmettere vanno comunicati al DSP mediante una qualche interfaccia. La scelta è caduta sull’interfaccia Ethernet di cui la scheda EVM del DSP c6424 è dotata. Il DSP infatti può funzionare come nodo di una rete grazie all’implementazione hardware che esso contiene dei livelli 1 e 2 (PHY e MAC) dello stack ISO/OSI, e grazie al pacchetto software NDK (Network Development Kit) che implementa gli strati superiori. 3. Implementazione con processori DSP 81 Figura 3.38: Combinazione dei filtri h1 , h2 ...hk per il filtraggio di una sequenza x[n] con la tecnica della convoluzione veloce. Figura 3.39: Segnale OFDM per la modulazione di test implementata sul trasmettitore (basato su DSP C6424). 82 3. Implementazione con processori DSP Figura 3.40: Spettro del segnale OFDM generato dal trasmettitore e misurato attraverso uno spectrum analyzer. Grazie alla User’s Guide relativa (Texas Instruments literature number: SPRU523G) si è implementato dunque un piccolo web server HTTP sul DSP in grado di generare pagine HTML al volo. Il codice relativo è nel file client.c e sostanzialmente si limita a configurare la scheda EVM con un indirizzo IP statico (192.168.2.1) ed ad impostare come gateway predefinito un altro indirizzo IP statico (192.168.2.100). Collegando quindi con un cavo Ethernet cross il DSP con un PC configurato con l’indirizzo IP statico impostato come gateway e accedendo con un normale browser internet alla pagina http://192.168.2.1 appare la pagina inviata dal DSP all’hostPC (vedi la fig. 3.41). L’uso del framework Ethernet tuttavia pone alcuni vincoli sulla struttura del programma, visto che il DSP viene internamente configurato per rispondere agli eventi generati dalla ricezione di ogni pacchetto dati. Nella pratica questo costringe ad abbandonare il consueto paradigma del main() tipico del C; nel programma sviluppato l’esecuzione inizia dalla funzione StackTest() e la chiamata alla funzione interna NC NetStart() mette il DSP in una attesa infinita di richieste dall’interfaccia Ethernet. Il codice quindi che esegue la modulazione è parte di una routine (cgiTx()) che viene chiamata quando si accede ad una certa pagina del webserver (nella fattispecie, http://192.168.2.1/tx.cgi). Difatti, per usare il framework NDK tutte le funzioni che rispondono a input dall’utente devono essere callback ovvero funzioni precedentemente collegate alla richiesta di una certa pagina web. Questo sistema costringe (ma non si tratta di una limitazione eccessiva per i nostri scopi) ad una trasmissione a burst perchè se la funzione cgiTx() non restituisce il controllo al chiamante in tempi brevi, il DSP non è più in grado di rispondere ad ulteriori richieste provenienti dall’interfaccia Ethernet. 3. Implementazione con processori DSP 83 Figura 3.41: Pagina web generata dal DSP e accessibile sull’host-PC all’indirizzo http://192.168.2.1. 3.6 3.6.1 Implementazione del ricevitore La scheda EVM TMS320C6455 La scheda EVM6455, composta dal DSK Base Board e dal Mezzanine Board, è descritta dai diagrammi a blocchi presentati nelle figure 3.42 e 3.43. Lo scopo di questo capitolo è descrivere i componenti più importanti della scheda di valutazione, cioè il codec AIC23, la memoria, la logica CPLD, l’interfaccia ethernet, la porta McBSP, le interfacce JTAG e UTOPIA, il Serial Rapid IO, il I 2 C, LED e DIP. La memoria Con un bus di indirizzi di 32 bit il DSP C6455 può indirizzare fino a 4 GB di memoria, liberamente utilizzati per la memorizzazione del codice e dei dati. In questa sezione si riportano le due mappe di memoria del processore posizionato sul DSK Base Board e di quello del Mezzanine Board al solo scopo di illustrare come viene utilizzata la memoria esterna, cioè quella residente sulla piattaforma EVM. La memoria del DSK Base Board La mappa di memoria presentata nella figura 3.44 mostra lo spazio di indirizzamento del processore TMS320C6455 sulla colonna sinistra e i dettagli sull’utilizzo di ciascuna regione sulla destra. Per impostazione predefinita la memoria interna alla CPU risiede all’inizio dello spazio di indirizzamento, mentre è possibile rimappare delle sezioni di memoria via software come cache L2 piuttosto che come RAM. 84 3. Implementazione con processori DSP Figura 3.42: Schema a blocchi della scheda EVM del DSP C6455. Figura 3.43: Schema a blocchi della Mezzanine Board del DSP C6455. 3. Implementazione con processori DSP 85 Figura 3.44: Mappa di memoria per il DSP C6455 del DSK Base Board. L’interfaccia EMIFA (External Memory Interface A) presenta 4 distinte regioni indirizzabili chiamate chip enable (CE2-CE5). In CE0 viene mappata la memoria DDR2 presente sulla scheda EVM costituita da due blocchi da 512 Mb utilizzati in parallelo per creare un’interfaccia di 32 bit. La memoria totale disponibile è di 128 MB alla quale si può accedere tramite indirizzi da 0xE000 0000 a 0xE800 0000. Il DSK utilizza per la memoria DDR2 un clock a 250 MHz; il controller di questa memoria può essere attivato configurando EMIF via software. Il DSK Base Board presenta anche una memoria flash esterna di 4 MB come opzione per il boot connessa alla regione CE3 di EMIFA da un’interfaccia a 8 bit e accessibile con indirizzi da 0xB000 0000 a 0xB01F FFFF. Poichè la memoria flash non perde il suo contenuto quando viene interrotta l’alimentazione, in fase di lettura si può considerare come una semplice ROM asincrona. Questo tipo di memoria può essere cancellata in grandi blocchi detti settori (sectors) o pagine (pages). La regione EMIFA CE2 è dedicata alla logica programmabile CPLD, per la quale si rimanda alla sezione 3.6.1. CPLD (programmable logic) Il dispositivo CPLD è un esempio di programmable logic device, cioè un componente elettronico che non implementa una specifica funzione logica predeterminata (come un gate), ma che può essere programmato per svolgere una funzione desiderata. Il CPLD, evoluzione dei più semplici dispositivi detti PAL (programmable array logic) 86 3. Implementazione con processori DSP e GAL (generic array logic), permette di realizzare circuiti logici molto complessi, corrispondenti a molti dispositivi PAL collegati fra loro e a migliaia o decine di migliaia di porte logiche. Caratteristiche della logica CPLD sono: una memoria non volatile che permette di ottenere la configurazione desiderata già all’avvio del sistema senza utilizzo di ROM esterne e la possibilità di implementare numerose funzioni, semplici o complesse. I CPLD vengono usati per applicazioni particolari dove sono richieste alte velocità e bassi costi o (come nel caso della nostra piattaforma EVM) funzionalità di glue logic ovvero di interfacciamento tra due dispositivi complessi. Il DSK C6455 utilizza un CPLD Altera EPM3128TC100-10 che possiede le seguenti funzionalità: • cinque registri di controllo/stato mappati in memoria che permettono la gestione via software di varie caratteristiche della scheda, • logica per la decodifica degli indirizzi e l’accesso in memoria, • controllo dell’interfaccia e dei segnali della scheda figlia, • glue logic. L’interfaccia ethernet Una interfaccia ethernet Intel LTX971ACE da 10/100 Mbps è collegata al controller interno EMAC (ethernet MAC) del DSP. Tale interfaccia è risultata estremamente utile nell’implementazione del ricevitore ed è descritta più nel dettaglio in seguito. I 2 C Serial ROM e I 2 C BUS La scheda EVM TMS320C6455 possiede un sistema di comunicazione seriale bifilare detto I 2 C (Inter Integrated Circuit) che collega il processore al codec AIC23 e alla memoria I 2 C ROM. Attraverso il collegamento seriale la periferica può trasmettere/ricevere dati a 8 bit a/da la CPU. La ROM di 1 Mb può essere utilizzata come periferica di memorizzazione generica o essere configurata come il dispositivo di boot per la scheda. L’interfaccia JTAG Il DSK prevede un controller di emulazione integrato come strumento principale per il debug, tuttavia ha la possibilità di supportare un emulatore esterno attraverso una connessione JTAG a 14 o 60 pin. Quando l’interfaccia a 14 o 60 pin è inserita nella scheda l’emulatore integrato è disattivato. L’interfaccia a 60 pin supporta la funzione di trace se viene utilizzata con una appropriata piattaforma di emulazione. Il dispositivo McBSP Il dispositivo Multichannel Buffered Serial Port (McBSP) fornisce un’interfaccia di comunicazione seriale sincrona e ad alta velocità fra la CPU e alcuni dispositivi esterni. La piattaforma TMS320C6455 possiede due di tali dispositivi (porte seriali) indicati dagli acronimi McBSP0 ed McBSP1. 3. Implementazione con processori DSP Figura 3.45: Schema a blocchi dell’interfaccia McBSP. Figura 3.46: Lista dei pin per l’McBSP. 87 88 3. Implementazione con processori DSP Come illustrato nella figura 3.45, il dispositivo McBSP prevede un percorso per i dati e uno di controllo. La lista dei pin è presente nella figura 3.46 in cui I indica un pin di ingresso, O indica un pin di uscita e Z un pin ad alta impedenza. I dati vengono scambiati attraverso il pin Data Transmit (DX) in trasmissione ed il pin Data Receive (DR) in ricezione. Le informazioni di controllo (temporizzazione e sincronizzazione di frame) sono comunicate attraverso i pin CLKX, CLKR, FSX e FSR. La CPU comunica con il dispositivo McBSP attraverso dei registri di controllo accessibili mediante un bus periferico interno. Il blocco di controllo genera il clock interno, il segnale di sincronizzazione del frame, controlla la correttezza di questi segnali e seleziona i canali da utilizzare nella comunicazione. In caso di errore nell’esecuzione di una delle precedenti operazioni esso invia segnali di interrupt alla CPU o al controllore del DMA attraverso i pin RINT, XINT, REVT e XEVT. Come mostrato nella figura 3.45, le operazioni di ricezione e trasmissione vengono entrambe gestite mediante dei buffer. In ricezione il dato arriva sulla linea DR e viene shiftato nel registro Receive Shift Register (RSR). Una volta che un intero elemento (a 8, 12, 16, 20, 24 o 32 bit) viene ricevuto, il contenuto del registro RSR viene copiato nel Receive Buffer Register (RBR) solo se questo non è ancora stato svuotato dalla precedente operazione di ricezione. In trasmissione il dato viene scritto dalla CPU o dal controllore del DMA sul registro DXR. Se il registro XSR è vuoto, ovvero il dato precedentemente trasmesso è già stato inviato al codec, il dato in DXR viene copiato nel registro XSR. In caso contrario il contenuto di DXR viene copiato nel registro XSR solamente quando l’ultimo bit del dato è stato shiftato sulla linea di trasmissione DX. Il compander 3 hardware permette la compressione e l’espansione dei dati nei formati µ-law e A-law e il trasferimento dei dati iniziando dal LSB o dal MSB. I segnali di controllo Le informazioni di controllo sono scambiate tra i dispositivi esterni e la porta McBSP attraverso quattro pin bidirezionali ed uno unidirezionale; i segnali ad essi associati sono: il transmit clock (CLKX), il receive clock (CLKR), il transmit frame sync (FSX), il receive frame sync (FSR) e il signal clock (CLKS). Il clock CLKS è il master clock che temporizza tutti i dispositivi della scheda; i clock seriali CLKX e CLKR definiscono i limiti temporali tra bit consecutivi, rispettivamente, in trasmissione e ricezione; i segnali FSX e FSR definiscono l’inizio del trasferimento di un frame. I registri di controllo Il meccanismo di controllo della porta McBSP viene configurato mediante i bit di stato di otto registri a 32 bit accessibili attraverso il peripheral bus. La lista dei registri della porta seriale viene illustrata nella figura 3.47 (i registri RBR, RSR, XSR non sono direttamente accessibili dalla CPU e dal DMA/EDMA controller, mentre il registro DRR può solo essere letto, non scritto dalla CPU e dal DMA/EDMA controller ). Il Serial Port Control Register (SPCR) e il Pin Control Register (PCR) configurano la porta seriale. Il Receive Control Register (RCR) e il Transmit Control Register 3 Questo termine deriva dall’unione delle parole compressor ed expander. 3. Implementazione con processori DSP Figura 3.47: Lista di registri per la porta seriale McBSP. 89 90 3. Implementazione con processori DSP (XCR) configurano i parametri delle operazioni, rispettivamente, di ricezione e trasmissione. Il Sample Rate Generator Register (SRGR) configura i parametri del sample rate generator. Il Multichannel Control Register (MCR), il Transmit Channel Enable Register n (XCERn) e il Receive Channel Enable Register n (RCERn) configurano le operazioni multicanale. I segnali di stato La porta seriale McBSP possiede quattro segnali di stato che sincronizzano le operazioni di lettura/scrittura della CPU e del controller EDMA3, evitando cosı̀ che un dato vecchio venga letto due volte o che si scriva su un dato nuovo. Il Receive Event (REVT) segnala al controller EDMA3 che il contenuto di RBR è stato copiato in DRR e che il nuovo dato può essere letto. Il Transmit Event (XEVT) segnala al controller EDMA3 che il contenuto di DXR è stato copiato in XSR e che il nuovo dato può essere scritto. Il Receive Interrupt (RINT) e il Transmit Interrupt (XINT) segnalano alla CPU il cambiamento di stato, rispettivamente, del ricevitore e del trasmettitore della porta seriale. L’interrupt che segnala il cambiamento di stato può essere configurato secondo una delle seguenti opzioni: R/XRDY - si verifica un interrupt in corrispondenza della ricezione o della trasmissione di ogni elemento seriale, in modo del tutto analogo ai segnali R/XEVT; Blk - si verifica un interrupt in corrispondenza della fine di un subframe; Frame - si verifica un interrupt in corrispondenza della rilevazione di un impulso di sincronizzazione di frame; SyncErr - si verifica un interrupt in corrispondenza di un errore di sincronizzazione di frame. Il Serial Rapid IO (SRIO) Come si è illustrato all’inizio di questo capitolo, la piattaforma EVM6455 è composta da due schede connesse fra loro: DSK Base Board e Mezzanine Base Board. Ognuna di queste schede ospita un microprocessore DSP TMS320C6455. Il collegamento fra queste due CPU viene svolto dal sistema SRIO (Serial Rapid IO), le cui principali caratteristiche sono: • prestazioni molto elevate in termini di bit-rate (superiore alle decine di gigabit al secondo); • utilizzo della commutazione di pacchetto; • architettura flessibile che permette la comunicazione peer-to-peer; • metodi per la rilevazione degli errori; • frequenza di lavoro e ampiezza delle porte scalabili. L’architettura del sistema Rapid IO è gerarchica e distribuita su tre livelli: 3. Implementazione con processori DSP 91 1. livello logico: specifica i protocolli, incluso il formato dei pacchetti, necessari alle due parti per completare la transazione; 2. livello trasporto: definisce gli schemi di indirizzamento per recapitare correttamente i pacchetti all’interno di un sistema; 3. livello fisico: contiene le informazioni sull’interfaccia a livello del dispositivo elettronico (caratteristiche elettriche, gestione degli errori e controllo del flusso di dati). Il pacchetto è l’elemento di base della comunicazione e consiste di campi di dati corrispondenti a ciascun livello: • il livello logico prevede una intestazione che specifica il tipo di accesso e il payload di lunghezza massima 256 byte (se previsto); • il livello trasporto dipende dalle caratteristiche topologiche del sistema fisico e consiste negli identificatori del mittente e del destinatario del pacchetto; • il livello fisico comprende campi relativi alla priorità, al controllo degli errori e all’acknowledgement. Le transazioni del SRIO sono basate sulla richiesta e sull’invio di pacchetti: un dispositivo master genera la richiesta di un pacchetto che viene trasmessa al dispositivo destinatario che a sua volta risponde con l’invio del pacchetto desiderato. 3.6.2 La scheda EVM ADS62P45 I primi test di interconnessione della scheda EVM del C6455 sono stati effettuati con la scheda di valutazione ADS6244 (ADC a 14bit, 125MSPS seriale); tale integrato si è rivelato tuttavia troppo impegnativo da usare in congiunzione ad un DSP data l’enorme bitrate richiesta (pari a 16Fc dove Fc è la frequenza del segnale di clock) e dato lo standard di interconnessione LVDS non supportato direttamente dai DSP e difficile da usare altrimenti. Si è quindi passati ad un convertitore ADC più adatto: il modello ADS62P45 con uscite parallele con standard LVCMOS (0/+3.3V). La relativa scheda EVM di valutazione permette tramite l’installazione di appositi buffer (U12 e U13 nello schema elettrico della scheda) di usare un comodo connettore (J1) per prelevare il segnale campionato e quantizzato. Nella figura 3.48 sono riportate le tempistiche da rispettare per poter usare correttamente tale convertitore. Il funzionamento dell’ADC è abbastanza elementare: quando avverte una transizione basso-alto sul suo pin di ingresso del clock, allora effettua una acquisizione del segnale analogico fornitogli in ingresso; contemporaneamente al suo interno vengono effettuate le conversioni (o meglio quantizzazioni) di precedenti campioni e dopo un certo ritardo (indicato con tP DI nel datasheet e nella figura 3.48) presenta dati validi all’uscita (evento segnalato dalla transizione basso-alto del clock di uscita). 92 3. Implementazione con processori DSP Figura 3.48: Tempistiche da rispettare nella comunicazione DSP-ADC. C 13 1 C 11 J6 A IN _ C H -A S MA 1 S IG N A L _ IN A 1 2 T2 4 3 EN D 4 3 2 5 J7 DNI T1 S MA .1uF 1 2 R 66 EN D 4 3 2 5 1 1 5 2 6 1 WBC1-1 R67 DNI 2 R4 49.9 DNI R7 49.9 DNI 1 5 3 4 WBC1-1 1 .1uF 1 2 2 C71 5.6pF DNI CM SH4 R6 24.9 IN P _ A SH4 IN M _ A SH4 R 25 49.9 NOTE 1 .1uF C 66 C16 C 12 1 1 2 C15 2 4.99 R5 24.9 C70 5.6pF DNI 6 2 R27 2 .1uF C 65 3.3pF NOTE 2 R 26 49.9 R28 4.99 .1uF .1uF NOTE: FOR ADS6 2 PX2 / X3 / X4 / X5 1) R5 , R6 , R1 1 , R1 2 = 4 9 . 9 OHMS 2) REMOVE R2 5 , C6 5 , R2 6 , R7 1 , C6 5 , & C6 9 Figura 3.49: Schematico per l’ingresso analogico (canale A) della scheda ADS63P45EVM. E’ importante notare che il convertitore non integra un filtro anti-aliasing e quindi è necessario usarne uno esterno al suo ingresso per evitare problemi di aliasing con segnali spuri e picchi di rumore a frequenze maggiori di metà frequenza di clock. Un altra importante considerazione è quella relativa al percorso del segnale analogico in ingresso mostrato nella fig. 3.49. I due trasformatori T1 e T2 hanno lo scopo di effettuare la conversione da singleended a differenziale, nonchè di adattare a 50Ω l’ingresso. Il risultato è che l’ingresso è accoppiato in AC e il convertitore non è quindi in grado di campionare segnali a bassa frequenza (a 500kHz l’attenuazione della circuiteria di ingresso è di circa 60dB!). 3.6.3 Interconnessione ADC-DSP Come già per il DSP c6424 e il relativo DAC, nella tabella che segue sono raccolte le velocità e la tipologia dei principali bus digitali disponibili sulla scheda EVM del DSP c6455 elaborati dal relativo datasheet. 3. Implementazione con processori DSP Nome bus EMIFA SRIO GPIO McBSP Massima velocità <40MHz 9Gbps ∼50MHz ∼100MHz 93 Tipo Parallelo (32bit) Seriale Parallelo (32bit) Seriale Anche in questo caso la scelta è stata il General Purpose Input/Output (GPIO) e come già per il DAC2904 si è scelto di cloccare l’ADC con un segnale di clock generato da un piedino GPIO del DSP (perchè la scheda EVM del DSP non supporta segnali di clock esterni). A differenza del DAC però in questo caso la sorgente dati non è il DSP bensı̀ l’ADC; questo significa che il campionatore effettua sı̀ una acquisizione quando riceve la transizione basso-alto generata dal DSP sul suo pin di ingresso del clock, ma ciò non significa che sui suoi pin di uscita siano presenti dati validi, evento che è invece segnalato da una transizione del clock di uscita dell’ADC. Una possibile soluzione per rilevare tale evento sarebbe quella di impostare un piedino GPIO del DSP come sorgente di interrupt e collegarlo al clock di uscita dell’ADC; questo significherebbe però dover processare interrupt ad una frequenza Fc ovvero alla frequenza con cui si genera il segnale di clock dell’ADC. Purtroppo il DSP non è progettato per gestire un gran numero di interruzioni al secondo (per campionare a 10MHz sarebbero necessarie 10 milioni di interruzioni al secondo!) e quindi tale approccio non è fattibile. Il sistema utilizzato è stato semplicemente quello di effettuare una transizione basso-alto sul pin di ingresso del clock dell’ADC e supporre che i dati in uscita siano già validi nel momento in cui il DSP esegue l’operazione successiva (che consiste nel salvare in memoria lo stato dei pin GPIO collegati all’uscita dati dell’ADC). Tale sistema si è rivelato funzionare grazie al fatto che il tempo tP DI (vedi sez. precedente) è particolarmente piccolo (meno di 8ns da datasheet). Di seguito viene riportata la mappatura (realizzata fisicamente con un cavo ad-hoc; vedi foto 3.50 e 3.51) fra i pin disponibili per l’I/O su bus GPIO del connettore J1 e J3 della scheda del DSP e i relativi pin del connettore J1 della scheda dell’ADC: 94 3. Implementazione con processori DSP Figura 3.50: Foto della connessione fra la scheda EVM del DSP c6455 e il convertitore ADS62P45. Figura 3.51: Foto della connessione fra la scheda EVM del c6455 e il convertitore ADS62P45. 3. Implementazione con processori DSP Pin sul conn. J1 dell’ADC 35 = DA0 33 = DA1 31 = DA2 29 = DA3 27 = DA4 25 = DA5 23 = DA6 21 = DA7 19 = DA8 17 = DA9 15 = DA10 13 = DA11 11 = DA12 9 = DA13 Pin sulla scheda del DSP 10 su J1 = GP[2] 33 su J3 = GP[3] 53 su J3 = GP[4] 48 su J3 = GP[5] 67 su J3 = GP[6] 68 su J3 = GP[7] 42 su J3 = GP[8] 36 su J3 = GP[9] 41 su J3 = GP[10] 35 su J3 = GP[11] 68 su J1 = GP[12] 72 su J1 = GP[13] 76 su J1 = GP[14] 73 su J1 = GP[15] 95 Bit nel banco 1 del GPIO 2o 3o 4o 5o 6o 7o 8o 9o 10o 11o 12o 13o 14o 15o Oltre ai pin sopra-listati bisogna ricordare anche che il cavo contiene un pin dedicato alla massa (pin 2 su J1 sull’ADC, pin 1 su J1) e un pin dedicato al clock (pin 39 su J3 che si connette tramite cavo SMA al conn. J4 sulla scheda dell’ADC). Infine, riguardo la alimentazione è stata collegato un alimentatore DC impostato su 5V al connettore P5 e i connettori di massa P4 e P2 sono stati collegati assieme. Per quanto invece concerne il lato software le procedure di inizializzazione del GPIO sono diverse da quelle usate per il DSP c6424; di seguito si riportano quindi le versioni delle funzioni gpio config() e gpio free() per il DSP c6455 nonchè la funzione gpio init() che va anch’essa chiamata ad avvio programma: void gpio_init() { Bool gpioEn; /* Unlock the control register */ CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERLOCK, DEV_PERLOCK_LOCKVAL, UNLOCK); /* Enable the GPIO */ CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERCFG0, DEV_PERCFG0_GPIOCTL, ENABLE); do { gpioEn = (Bool) CSL_FEXT(((CSL_DevRegs*)CSL_DEV_REGS)->PERSTAT0, DEV_PERSTAT0_GPIOSTAT); } while (gpioEn != TRUE); 96 3. Implementazione con processori DSP /* Set CPLD Misc_register to McBSP1 off board */ do DSK6455_rset(6, 0x1); while( (0x1 & DSK6455_rget(6)) != 1); printf("CPLD configured to disable McBSP1 " "(to unlock GPIO pins)\n"); } void gpio_config(int allinputs) { CSL_GpioPinConfig CSL_Status CSL_GpioHwSetup CSL_GpioContext CSL_GpioObj int config; status; hwSetup; pContext; gpioObj; i; if (g_bAlreadyConfigured == 1) return; /* Initialize the GPIO CSL module */ status = CSL_gpioInit(&pContext); if (status != CSL_SOK) { printf("GPIO: Initialization error.\n"); return; } /* Open the CSL module */ g_hGpio = CSL_gpioOpen(&gpioObj, CSL_GPIO, NULL, &status); if ((g_hGpio == NULL) || (status != CSL_SOK)) { printf("GPIO: Error opening the instance.\n"); return; } /* Setup hardware parameters */ hwSetup.extendSetup = NULL; /* Setup the General Purpose IO */ status = CSL_gpioHwSetup(g_hGpio, &hwSetup); // configure all GPIO pins as INPUTs // (except for the pin used for the clock of the ADC) for (i=(int)CSL_GPIO_PIN0; i <= (int)CSL_GPIO_PIN15; i++) { 3. Implementazione con processori DSP 97 if (i == (int)CLOCK_ADC_PIN && allinputs == 0) { config.pinNum = (CSL_GpioPinNum)i; config.trigger = CSL_GPIO_TRIG_CLEAR_EDGE; config.direction = CSL_GPIO_DIR_OUTPUT; } else { config.pinNum = (CSL_GpioPinNum)i; config.trigger = CSL_GPIO_TRIG_RISING_EDGE; config.direction = CSL_GPIO_DIR_INPUT; } status = CSL_gpioHwControl(g_hGpio, CSL_GPIO_CMD_CONFIG_BIT, &config); if (status != CSL_SOK) { printf("GPIO: GPIO pin %d configuration error.\n", i); return; } } printf("All GPIO pins have been configured\n"); g_bAlreadyConfigured = 1; } void gpio_free() { CSL_Status status; if (g_bAlreadyConfigured == 0) return; // nothing to free status = CSL_gpioClose(g_hGpio); if (status != CSL_SOK) { printf("GPIO: Unable to close the instance. " "[status = 0x%x].\n", status); return; } printf("Released the GPIO pins\n"); g_bAlreadyConfigured = 0; } La routine per l’acquisizione effettiva dei dati viene presentata qui di seguito direttamente nella sua forma ottimizzata in assembler scritto a mano: 98 3. Implementazione con processori DSP ; -----------------------------------------------------------; C-CALLABLE FUNCTION: ; void gpioGetSamples_asm(Uint16*data, int data_size) ; ; DESCRIPTION: ; generates the ADC clock (on GPIO pin #0) and ; stores data_size samples in *data location. ; Note that data memory location has to be big enough! ; Before storing data, first 256 samples from the ADC ; are discarded as they usually contain invalid values ; ; C-EQUIVALENT CODE: ;\qquad for(i=0; i<data_size; i++) ; { ; GPIO_CLR_DATA = (1<<CLOCK_ADC_PIN); ; GPIO_SET_DATA = (1<<CLOCK_ADC_PIN); ;\qquad data[i] = GPIO_IN_DATA; ;\qquad } ; _gpioGetSamples_asm: ; data pointer is in register A4 ; data_size is in register B4 ; return location is in register B3 ; ; loop counter ’i’ is allocated in register A9 ; registers A1,A3,A5,B0,B1 are used as temporaries MVKL 0x2B00000,A3 ; move 0x0000 constant in lower part of A3 reg MVKH 0x2B00000,A3 ; move 0x02B0 constant in upper part of A3 reg MVK 1,A5 ; move (1<<PIN_ADC_CLOCK)==(1<<CSL_GPIO_PIN0)==1 into A5 MVK 256,B1 ; move 256 in B1 NOP 9 ; discard some initial samples: MVK STW 0,A9 A5,*+A3[7] NOP 2 DiscardLoop: STW A5,*+A3[6] ; i=0 ; put A5 into A3+(7<<2)=A3+0x1C == ; GPIO’s CLR_DATA ; required ; put A5 into A3+(6<<2)=A3+0x18 == ; GPIO’s SET_DATA 3. Implementazione con processori DSP 99 ; NOTE: following operations are interleaved to take ; advantage of instruction pipelining: LDW || || *A3[8],A1 ; [4-slots] load into A1 memory contents ; of A3+(8<<2)==GPIO’s IN_DATA ADD A9,1,A9 ; i++ STH A1,*+A4[0] ; always save in A4[0]=data[0] the contents of A1 STW A5,*+A3[7] ; put A5 into A3+(7<<2)=A3+0x1C == GPIO’s CLR_DATA CMPLT A9,B1,B0 ; [single cycle] i<256? [B0] BNOP DiscardLoop,5 ; if B0 == 1, goto DiscardLoop ; now start the real acquisition! MVK 0,A9 STW A5,*+A3[7] NOP 2 AcquireLoop: STW A5,*+A3[6] ; i=0 ; put A5 into A3+(7<<2)=A3+0x1C == GPIO’s CLR_DATA ; required ; put A5 into A3+(6<<2)=A3+0x18 == GPIO’s SET_DATA ; NOTE: following operations are interleaved to take ; advantage of instruction pipelining: || || LDW *A3[8],A1 ; [4-slots] load into A1 memory contents ; of A3+(8<<2)==GPIO’s IN_DATA ADD A9,1,A9 ; [single cycle] i++ STH A1,*+A4[A9] ; [??] save in A4[A9]=data[i] the contents of A1 STW A5,*+A3[7] ; [??] put A5 into A3+(7<<2)=A3+0x1C == GPIO’s CLR_DATA CMPLT A9,B4,B0 ; [single cycle] i<data_size? [B0] BNOP AcquireLoop,5 ; if i<data_size, goto AcquireLoop NOP B NOP 9 B3 5 ; return Per testare la corretta funzionalità del collegamento fra DSP e ADC si sono poi svolti numerosi test (campionamento di un’onda sinusoidale, etc). Per maggiori informazioni vedi [7]. 3.6.4 Codice per il ricevitore Il codice sviluppato per il ricevitore è anch’esso basato sull’NDK (Network Development Kit) fornito dalla TI per il DSP c6455. Dualmente al trasmettitore, il ricevitore ha il compito di prendere i dati in ingresso dal campionatore analogico-digitale e fornirli poi sottoforma di pagine web all’interfaccia Ethernet. 100 3. Implementazione con processori DSP Figura 3.52: Schermata principale dell’interfaccia web del ricevitore implementato su DSP C6455. Per velocizzare i tempi di sviluppo e fornire un feedback visivo sui dati acquisiti il firmware per il DSP del ricevitore utilizza una applet in tecnologia Flash denominata FusionCharts Free (vedi http://www.fusioncharts.com/free); tale applet richiede l’utilizzo di file XML per la graficazione delle forme d’onda acquisite e quindi il programma sviluppato è in grado di generare “al volo” tali file. Nelle figure 3.53 e 3.52 sono mostrate alcune schermate dell’interfaccia web implementata sul DSP. La realizzazione del ricevitore è sempre più impegnativa rispetto a quella del trasmettitore (per questo si è utilizzato il DSP C6455, il più potente, a tale scopo); questo significa in particolare che è necessario fare attenzione alle risorse (di elaborazione e memoria) richieste da ogni fase della demodulazione. In particolare, è l’acquisizione dei campioni del segnale e il loro processing in tempo reale che rappresenta la vera sfida da risolvere con un sistema a DSP. In altri lavori (vedi il riferimento [5]) si è optato per un sistema ad interrupt in cui tramite il sistema DMA, senza occupare il processore principale, i dati vengono trasferiti in un certo blocco di memoria e quando questo è pieno viene generato un interrupt. La routine di risposta all’interrupt indica poi al sottosistema DMA una nuova zona libera di memoria in cui salvare i dati e avvia contemporaneamente il processing nella zona di memoria piena di dati “freschi”. Tale tecnica (denominata di “double-buffering”) è sicuramente un metodo efficace e da tenere presente per future implementazioni ma di 3. Implementazione con processori DSP 101 Figura 3.53: Esempio di schemata di acquisizione dell’interfaccia web del ricevitore. più difficile applicazione nel nostro caso a causa della presenza del framework Ethernet. Rimane infatti da esplorare come può funzionare il sottosistema EDMA del DSP in concomitanza con il framework Ethernet. In ogni caso, a differenza del codice per il trasmettitore, il codice per il ricevitore su DSP non è stato completato a causa dei problemi che sono di seguito descritti. 3.7 Conclusioni per l’implementazione a DSP Nonostante tutti gli sforzi profusi nell’implementazione a DSP le conclusioni non sono state positive. Il segnale generato dal trasmettitore sembra infatti corretto ad una prima analisi (mediante oscilloscopio e analizzatore di spettro) ma è risultato impossibile da demodulare quando si sono forniti i campioni raccolati dall’ADC allo script MATLAB. Come descritto nella sezione 3.4.3, lo script del ricevitore MATLAB può essere impostato nella modalità “ADC SYSTEM TEST ” (tramite il parametro MODE ) nella quale invece che analizzare il segnale prodotto dallo script MATLAB del trasmettitore, analizza il segnale salvato facendo uso del toolbox MATLAB chiamato “Link for Code Composer Studio” che a sua volta permette di interfacciarsi ad un DSP collegato al software Code Composer Studio della Texas Instruments e in particolare di leggere la memoria della scheda EVM del DSP c6455 direttamente. Facendo uso di tale strumento appena possibile si è provato ad analizzare il segnale generato dal trasmettitore implementato su DSP c6424 e poi convertito dal DAC2904 e dall’ADS62P45. Tale segnale è mostrato nelle figure 3.54 e 3.55 come appare all’uscita del DAC. Nella figura 3.56 è invece mostrato come appare la metrica calcolata per il segnale 102 3. Implementazione con processori DSP Figura 3.54: Foto del segnale di clock spedito dal DSP al DAC come viene mostrato da un oscilloscopio a 4GSPS (per la modulazione a tempo di simbolo minore). Figura 3.55: Foto del segnale di clock spedito dal DSP al DAC come viene mostrato da un oscilloscopio a 4GSPS (per la modulazione a tempo di simbolo maggiore). 3. Implementazione con processori DSP 103 Bhargava−Letaief coarse timing metric 0.5 0.45 0.4 0.35 0.3 0.25 0.2 0.15 0.1 0.05 0 0 500 1000 1500 2000 2500 3000 3500 Figura 3.56: Metrica di coarse-timing calcolata dalla funzione OFDM rx() di MATLAB sui dati campionati dall’ADS62P45. come è stato salvato in memoria dopo il campionamento dal DSP c6455. Pur effettuando numerosi tentativi il risultato non si discosta mai molto da quello mostrato. Come appare evidente la metrica è molto diversa da quella tipica che si ha per un segnale modulato (crf con fig. 3.16) e non supera mai o quasi mai un valore di soglia adeguato (tipicamente si usa 0.8 o 0.9) che consenta di evitare false detections. Come si può notare dalla fig. 3.30, il sistema è particolarmente sensibile all’offset e al jitter di frequenza nelle frequenze di campionamento (da non confondere con il CFO che è l’offset di frequenza nella portante). Si è dunque proceduto ad una analisi più accurata dei segnali di clock forniti all’ADC e al DAC. Funzione utilizzata rx: gpioGenerateClockTest asm() tx: gpioAsmTransmitRealData() tx: gpioAsmTransmitRealData SLOW() Frequenza media 11.10M Hz = 90.1ns 19.78M Hz = 50.5ns 3.84M Hz = 260ns Deviazione standard 4.3ns 1.8ns 5.8ns Per confronto la deviazione standard sul periodo di una sinusoide di frequenza 40MHz generata da un generatore di funzioni Agilent e misurata su un oscilloscopio con ingresso adattato a 50Ω risulta essere di circa 30ps, ovvero circa 100 volte minore; anche i datasheet dei convertitore utilizzati pongono particolare enfasi sull’importanza di usare un clock a bassissimo jitter e consigliano l’uso di sorgenti di clock filtrate con jitter dell’ordine dei femtosecondi, o senza voler spingersi al limite, nell’ordine dei picosecondi. 104 3. Implementazione con processori DSP I motivi di una metrica di coarse timing non funzionante sono quindi da ricercarsi con tutta probabilità nella qualità dei segnali di clock che determinano la generazione e l’acquisizione di un segnale analogico non corretto; le possibili fonti di un jitter cosı̀ elevato sono principalmente tre: 1. le schede EVM dei DSP non sono pensate per trasportare segnali ad alta velocità e in particolare i buffer e i connettori che i segnali in uscita al DSP devono attraversare non hanno ingressi e uscite adattate, determinando forti onde riflesse che, pur non alterando il riconoscimento dei valori logici 1 e 0, cambiano il periodo della forma d’onda in modo aleatorio, dando quindi origine a jitter; a tale proposito bisogna notare che i segnali in ingresso e uscita al DSP sono correttamente adattati a 50Ω ma che il problema è la scheda su cui tali segnali viaggiano. 2. i cavi realizzati per l’interconnessione delle schede ADC e DAC ai DSP (e le saldature realizzate su di essi) non sono particolarmente adatti alla trasmissione ad alta frequenza dei segnali, nè tantomeno permettono un buon grounding fra le due schede (che difatti presentano elevati disturbi sulla massa). 3. i DSP e i convertitori DC-DC switching presenti sulle schede EVM generano un fondo di rumore molto elevato a frequenze multiple di quelle di funzionamento, rendendo quasi impossibile preservare un buon rapporto segnale-rumore all’uscita del DAC e all’ingresso dell’ADC. Purtroppo è difficile ovviare a questi problemi; inoltre anche le alternative di clocking possibili (quali l’uso della stessa sorgente “pulita” di clock condivisa tra il DSP e il DAC) non sono possibili nella pratica visto che le schede EVM dei DSP non permettono l’uso di una fonte di clock esterna. Identificati dunque questi problemi e la criticità dei fattori da cui derivano, si è infine deciso di cambiare completamente la piattaforma hardware su cui realizzare il modem, passando dunque dai DSP alle FPGA. Capitolo 4 Implementazione con dispositivi FPGA 4.1 Architettura del sistema Come già trattato nella sez. 3.1, le caratteristiche del sistema da realizzare (in particolare la bassa frequenza della portante) rendono molto competitiva l’architettura “direct digital synthesis”, che quindi si è scelto di perseguire non solo con i DSP ma anche con le FPGA. Non è stato però possibile all’interno del progetto di tesi occuparsi anche dei dettagli di interconnessione dei vari sistemi coinvolti (PC, FPGA, ADC e DAC), vista anche la momentanea mancanza delle relative schede hardware; nelle sezioni seguenti ci si concentrerà quindi sulle caratteristiche hardware delle FPGA, che come già accennato, richiedono l’uso di un approccio completamente diverso rispetto ai DSP, le MCU e le CPU in generale. 4.1.1 Cenni relativi alla storia delle FPGA L’industria delle FPGA è nata dalle memorie programmabili a sola lettura (PROM) e dai dispositivi logici programmabili (PLD). Sia i dispositivi PROM che i PLD avevano entrambi la possibilità di essere programmati in serie in fabbrica o direttamente “sul campo” (field programmable) ma la logic programmabile che essi contenevano era interconnessa in modo fisso, non alterabile, fra le varie celle logiche. Il co-fondatore della Xilinx, Ross Freeman, e Bernard Vonderschmitt, inventarono il primo FPGA (field-programmable gate array) nel 1985 — il chip XC2064. Il XC2064 aveva porte programmabili e interconnessioni fra tali porte anch’esse programmabili, e segnava quindi gli inizi di una nuova tecnologia e di un nuovo mercato. Il dispositivo XC2064 vantava giusto 64 blocchi logici configurabili (configurable logic blocks - CLB), con due tabelle di lookup (LUT) a 3 ingressi. Più di 20 anni dopo Freeman entrò nella “National Inventor’s Hall of Fame” degli Stati Uniti per la sua invenzione. In seguito, alcuni dei concetti e delle tecnologie basilari dell’industria FPGA furono brevettati da David W. Page e LuVerne R. Peterson nel 1985. A fine del 1980 l’esercito statunitense finanziò un esperimento proposto 105 106 4. Implementazione con dispositivi FPGA da Steve Casselman per sviluppare un computer che implementasse 600 mila porte riprogrammabili. Casselman ebbe successo e il suo sistema fu brevettato nel 1992. La Xilinx continuò senza rivali e crebbe velocemente dal 1985 fino a metà anni ’90, quando iniziarono a presentarsi dei concorrenti, erodendo quote di mercato significative, tantè che nel 1993 l’Actel, rivale della Xilinx, arrivò a servire il 18 percento del mercato. Gli anni ’90 furono un periodo di grande crescita delle FPGA, sia nella loro complessità interna sia nel volume di produzione. Nei primi anni ’90 le FPGA erano usate principalmente nelle telecomunicazioni e negli impianti di rete; a metà degli anni ’90 le FPGA avevano trovato applicazione nei mercati consumer, automobilistico e industriale. E’ da citare anche un’applicazione che ebbe un certo successo e portò alla ribalta le FPGA nel 1997, quando Adrian Thompson fuse la tecnologia degli algoritmi genetici con le FPGA per creare un dispositivo di riconoscimento audio. Una tendenza più recente è stata quella di portare ad un grado superiore l’approccio architetturale combinando i blocchi logici e le interconnessioni delle FPGA tradizionali con microprocessori embedded e periferiche correlate per formare un completo “programmable system-on-chip” (PSOC); esempi di tale tecnologia ibrida può essere trovata nei dispositivi Xilinx Virtex-II PRO e Virtex-4, che includono uno o più processori PowerPC integrati; l’Atmel FPSLIC è un’altro dispositivo di tal genere, che usa un processore AVR in combinazione con l’architettura logica programmabile. Un approccio alternativo all’uso di processori cablati è quello di fare uso dei processori “soft” (o meglio di “soft processor cores”) che sono funzionalmente analoghi a quelli cablati ma implementati sulle stesse celle logiche general-purpose messe a disposizione dall’FPGA. Come accennato precedentemente, molte FPGA moderne hanno la capacità di essere riprogrammate in tempo reale e questo sta conducendo all’idea di realizzare sistemi completamente riconfigurabili: CPU che possono adattarsi al meglio al compito da svolgere. Per meglio capire l’evoluzione e la crescita del settore sono di seguito forniti alcuni dati. Anno 1985 1992 1995 1999 2001 2002 2008 2009 Blocchi/elementi logici 64 (Xilinx, XC2064) 208 (Altera, Flex8k EPF8282A) 576 (Altera, Flex10K EPF10K10) 7.4k (Xilinx, XC4085XL) 27.6k (Xilinx, Virtex1 XCV1000) 20k (Altera, Cyclone1 EP1C20) 820k (Altera, Stratix IV) 566k (Xilinx, Virtex6 XC6VHX565T) 4. Implementazione con dispositivi FPGA PLL 107 IOEs PLL Embedded Multipliers IOEs Logic Array Logic Array Logic Array Logic Array IOEs M4KBlocks M4KBlocks PL L IOEs PL L Figura 4.1: Struttura generica delle FPGA Cyclone II. Le colonne IOEs indicano gli Input/Output Elements; i blocchi M4K sono memoria SRAM integrata. Anno 1987 1993 2005 2010 4.1.2 Dimensione mercato FPGA (M$=106 $) 14M$ 385M$ 1900M$ 2750M$ (stima) Funzionamento interno dei dispositivi Cyclone II Introduzione In questa sezione verrà analizzata la struttura interna di una famiglia di dispositivi FPGA prodotto dalla Altera, denominata “Cyclone II” (vedi la fig. 4.1); tali dispositivi appartengono alla fascia medium-level e sono un buon esempio di rapporto prestazioni/consumo/prezzo; difatti la loro architettura riflette quella di gran parte delle FPGA in commercio (anche se per i prodotti della Xilinx viene in generale usata una differente terminologia: CLB invece che LE, etc). Le informazioni proposte in questa sezione non vanno dunque viste come specifiche per il modello sopra citato di FPGA, ma piuttosto come una generica presentazione delle caratteristiche tipiche di tali dispositivi. A tal proposito vengono di seguito elencate le caratteristiche generiche per la famiglia Cyclone II: • blocchi di memoria integrati (nella forma di SRAM); • supporto per clock fino a 260MHz; 108 4. Implementazione con dispositivi FPGA • moltiplicatori integrati (fino a 150 moltiplicatori 18x18 bit o 9x9 bit); • rete del clock gerarchica; • 4 PLL (digitali, per la distribuzione del clock); • supporto per svariati sistemi di configurazione (seriale, JTAG, etc); e quelle relative al supporto I/O avanzato: • supporto per interfacce a diverse tensioni: 1.5V, 1.8V, 2.5V, 3.3V; • corrente di uscita dei pin programmabile; • uscite open-drain programmabili; • terminatori on-chip programmabili; • standard differenziali supportati: 1. Low Voltage Differential Signalling (LVDS); 2. Low-voltage positive emitter-coupled logic (LVPECL); 3. Reduced Swing Differential Signaling (RSDS); 4. High-Speed Transceiver Logic (HSTL); 5. Stub Series Terminated Logic (SSTL); e standard single-ended supportati: 1. versione single-ended degli standard SSTL, HSTL; 2. Peripheral Component Interconnect (PCI); 3. Low Voltage CMOS ( LVCMOS); 4. Low Voltage TTL (LVTTL). Come si può intuire dalla breve lista presentata, le FPGA sono estremamente flessibili ed inoltre sono capaci di trasferire notevoli quantità di dati in ingresso e uscita, sia grazie al loro elevatissimo parallelismo interno, sia grazie alla grande compatibilità con tutti gli standard elettrici in uso oggigiorno nei sistemi digitali. Gli elementi logici La più piccola unità logica dell’architettura delle FPGA Cyclone II è il logic element (LE; vedi la fig. 4.2); esso integra varie funzioni: • Una look-up table (LUT) a quattro ingressi, con la quale è possibile implementare qualsiasi funzione di quattro variabili; • registi programmabili; 4. Implementazione con dispositivi FPGA Register Chain Routing From Previous LE LAB-Wide Synchronous Load LAB-Wide Synchronous Clear LABCarry-In data1 data2 data3 Look-Up Table (LUT) Carry Chain Synchronous Load and Clear Logic 109 Register Bypass Packed Register Select D Q Programmable Register Row, Column, And Direct Link Routing data4 ENA CLRN labclr1 labclr2 Chip-Wide Reset (DEV_CLRn) Asynchronous Clear Logic Row, Column, And Direct Link Routing Local Routing Clock & Clock Enable Select Register Feedback labclk1 labclk2 labclkena1 labclkena2 LABCarr y-Out Figura 4.2: Struttura di un elemento logico (LE). Register Chain Output 110 4. Implementazione con dispositivi FPGA • una connessione per la catena di riporto (carry chain); • la possibilità di gestire tutti i tipi di interconnessione: local, row, column, register chain, and direct link interconnects; • supporto per un registro di packing; • supporto per un registro di feedback. I registri o latch delle LE posso essere configurati in modalità D, T, JK oppure SR. I registri hanno pin di dati, clock, clock enable e clear input. I segnali che usano il clock globale o i pin generici di I/O possono gestire il clock del registro ed il clear control signal; i pin generici di I/O o la logica interna possono comandare il clock enable. Per le funzioni combinatorie l’uscita della LUT può bypassare il registro ed agire direttamente sulle uscite del LE. La funzionalità “register packing”, che consiste nell’usare la LUT per gestire un’uscita ed il registro per gestirne un’altra indipendentemente, permette di migliorare l’utilizzo del dispositivo. Le uscite di riporto del registro consentono ai registri contenuti nella stessa LAB di essere configurati in cascata. Le LUT presenti possono operare in uno dei seguenti modi: • modalità normale; • modalità aritmetica. Ogni modalità utilizza le risorse degli elementi logici in modo diverso. La prima è usata per applicazioni logiche generali e per l’implementazione di funzioni logiche combinatorie; in tale modalità gli ingressi della LUT sono collegati a quattro interconnessioni locali provenienti dall’array di blocchi logici (LAB) descritto in seguito. La modalità aritmetica (vedi la fig. 4.3) è invece l’ideale per l’implementazione di sommatori, contatori, accumulatori e comparatori. Un LE in Arithmetic Mode implementa un full adder a 2 bit ed un catena di riporto. Gli array di blocchi logici Gli elementi logici descritti prima sono organizzati in array. Ciascun array di blocchi logici (Logic Array Blocks - LAB; vedi la figura 4.4), consiste in: • 16 elementi logici (LE); • segnali di controllo del LAB; • catene di riporto dei elementi logici (LE); • catene di registri; • interconnessioni locali; 4. Implementazione con dispositivi FPGA sload (LABWide) 111 sclear (LABWide) Register chain connection data1 data2 cin (from cout of previous LE) Three-Input LUT Three-Input LUT D Row, column, and direct link routing ENA CLRN Row, column, and direct link routing Q clock (LABWide) ena (LABWide) Local routing aclr (LABWide) cout Register chain output Register Feedback Figura 4.3: Struttura di un elemento logico (LE) configurato in modalità aritmetica. Le interconnessioni locali trasferiscono i segnali fra gli elementi logici (LE) all’interno dello stesso array di blocchi logici (LAB): le connessioni fra le catene di riporto infatti trasferiscono le uscite del registro di un elemento logico a quello adiacente (all’interno dello stesso LAB). Il compilatore Quartus II posiziona la logica associata dentro il LAB o nei LAB adiacenti. La interconnessione LAB locale è pilotata dalle interconnessioni di riga e di colonna e dalle uscite degli elementi logici di quel LAB. Gli array adiacenti, cosı̀ come pure le PLL, i moltiplicatori integrati e i blocchi di RAM M4K possono anch’essi pilotare le interconnessioni locali grazie alle connessioni dirette (direct links), le quali minimizzano l’uso delle interconnessioni locali di riga e di colonna. Ciascun elemento logico può pilotare 48 altri elementi logici attraverso interconnessioni locali veloci e “direct link” (che sono mostrati nella fig. 4.5). Ciascun LAB contiene logica dedicata per pilotare i segnali di controllo dei suoi elementi logici, che sono: • due clock; • due clock enable; • due “clear” asincroni; • un “clear” sincrono; • un “load” sincrono; Ciascun LAB può anche avere fino a 4 segnali non-globali di controllo; lo schema relativo è mostrato nella fig. 4.6. 112 4. Implementazione con dispositivi FPGA Row Interconnect Column Interconnect Direct link interconnect from adjacen t block Direct link interconnect from adjacent block Direct link interconnect to adjacent block Direct link interconnect to adjacent block LAB Local Interconnect Figura 4.4: Struttura dell’array di blocchi logici (LAB) della famiglia di FPGA Cyclone II. Direct link interconnect from left LAB, M4Kmemory block, embedded multiplier, PLL, or IOEoutput Direct link interconnect from right LAB, M4Kmemory block, embedded multiplier, PLL, or IOEoutput Direct link interconnect to right Direct link interconnect to left Local Interconnect LAB Figura 4.5: Connessione diretta (direct link). 4. Implementazione con dispositivi FPGA Dedicated LABRow Clocks 113 6 Local Interconnect Local Interconnect Local Interconnect Local Interconnect labclkena2 labclkena1 labclk1 labclk2 labclr1 syncload synclr labclr2 Figura 4.6: Segnali di controllo all’interno di un array di elementi logici (LAB). E’ infine da notare che i dispositivi Cyclone II sono forniti di un segnale di reset globale per l’intero chip (denominato DEV CLRn); tale segnale resetta tutti i registri dell’FPGA e ha una priorità più alta di tutti gli altri segnali di controllo. La rete globale di clock e i PLL I dispositivi Cyclone II prevedono un rete di clock globale e quattro PLL (vedi la fig. 4.7). Le PLL fornite possono essere usate per fornire le seguenti funzioni: • moltiplicazione e divisione del clock; • shift di fase; • duty cycle programmabile; • uscite di clock per supporto all’I/O differenziale; • cambio manuale del clock; I moltiplicatori integrati Le FPGA della famiglia Cyclone II integrano al loro interno dei blocchi moltiplicatori (vedi la fig. 4.8) ottimizzati per calcoli intensivi per il digital signal processing (DSP), per i filtri FIR, per la FFT, e per la discrete cosine transform (DCT). I moltiplicatori hanno due modalità di utilizzo, che dipendono dalle necessità dell’applicazione: • un moltiplicatore a 18bit; • fino a due moltiplicatori indipendenti a 9bit. L’operando di ciascun moltiplicatore può essere un numero con segno o senza segno. 114 4. Implementazione con dispositivi FPGA VCO Phase Selection Selectable at Each PLL Output Port Post-Scale Counters Manual Clock Switchover Select Signal 8 Reference Input Clock fREF = fIN /n CLK2 (1) Global Clock ÷c1 Global Clock ÷c2 (2) Global Clock fVCO CLK0 (1) CLK1 ÷c0 up inclk0 fIN ÷n Charge Pump PFD inclk1 8 Loop Filter VCO down CLK3 ÷k (3) 8 fFB ÷m PLL< #>_OUT To I/O or general routing Lock Detect & Filter Figura 4.7: Schema di funzionamento di una PLL digitale all’interno delle FPGA Cyclone II. signa (1) signb (1) aclr clock ena Data A D Q ENA Data Out D ENA CLRN Q CLRN Data B D Q ENA CLRN Input Register Output Register Embedded Multiplier Block Figura 4.8: Moltiplicatore integrato nelle FPGA Cyclone II. 4. Implementazione con dispositivi FPGA Symbol mapper data in {dn} channel symbols {cn} Matched filter p(t) 115 baseband signal s(t) sRF(t) exp{j2pfct} Local oscillator (Ts-1) FIR filter p[n] DAC Re{s(t)} cos(2pfct) m bits bits in {dn} Bit groups generator … Symbol mapper Re{cn} Local Oscillator sRF(t) Im{cn} sen(2pfct) (Ts-1) FIR filter p[n] DAC Im{s(t)} Figura 4.9: In alto: schema base di un trasmettitore PAM. In basso: schema più dettagliato dello stesso trasmettitore, con implementazione digitale dei filtri adattati. 4.2 Generalità sui sistemi PAM a singola portante Come si è visto nella sez. 3.2, la modulazione OFDM comporta una certa complessità implementativa (dovuta sia alle operazioni di FFT/IFFT sia al framework di sincronizzazione che richiede) nel trasmettitore e soprattutto nel ricevitore. Questa complessità addizionale unita alla assenza di know-how legato alla tecnologia FPGA (che a dispetto dei DSP richiede una differente “impostazione concettuale”) ha fatto propendere la scelta del formato di modulazione, per quanto riguarda l’implementazione descritta in questo capitolo, su una soluzione più semplice quale quella PAM a singola portante. 4.2.1 Il trasmettitore Nella figura 4.9 sono riportati due schemi (uno più generico ed uno più pratico) della struttura di un trasmettitore PAM [1]; in tali schemi a blocchi {dn } è una sequenza di bit zero/uno WSS (wide sense stationary; stazionaria in senso lato)1 . Il symbol mapper traduce tale sequenza in una sequenza complessa di simboli di canale {cn } appartenenti ad un alfabeto M -ario Ac ; esso associa cioè ad ogni gruppo di m = log2 M bit della sequenza {dn } una coppia di valori che rappresenta un punto nel piano complesso. L’alfabeto Ac è detto costellazione della modulazione e viene normalmente scelto fra una delle seguenti classi: l 1. M -PSK: Ac = {sl = ej2π M , l = 0, 1, ..., M − 1} che consiste nella disposizione degli M punti su una circonferenza di raggio unitario; il nome phase-shift-keying deriva dal fatto che i vari simboli complessi sl differiscono solo per la loro fase e non per il modulo; 1 Ovvero che rispetta le condizioni E{dn } = costante; E{dn+k dn } dipendente solo da k. 116 4. Implementazione con dispositivi FPGA 2. M -ASK: Ac = {±1, ±2, ..., ±(M − 1)} = {sl = (M − 1) − 2l, l = 0, 1, ..., M − 1} che consiste nella disposizione degli M punti sulla retta dei numeri reali, centrati rispetto l’origine; da qui il nome di amplitude-shift-keying; 3. M -QAM: Ac = {±1 ± j, ±2 ± 2j, ..., ±(M − 1) ± j(M − 1)} che consiste nella disposizione degli M punti su un reticolo centrato nell’origine del piano complesso; il nome quadrature-amplitude-modulation deriva dal fatto che le proiezioni dei simboli che compongono Ac si possono pensare come appartenenti a due segnali √ M -ASK indipendenti (quindi due segnali modulati solo in ampiezza), uno associato alla parte reale ed uno associato alla parte in fase (e quindi in quadratura, ovvero ortogonali, l’uno rispetto all’altro); Tali simboli sono poi forniti, a frequenza di simbolo T1s , in ingresso ad un filtro adattato con risposta impulsiva p(t); il segnale (complesso) risultante s(t, c) è il cosiddetto inviluppo complesso del segnale modulato e si esprime analiticamente come: s(t, c) = +∞ n=−∞ cn p(t − nTs ) Tale segnale, se si utilizza un impulso p(t) a radice di coseno rialzato con roll-off α, di dimostra avere una occupazione di banda pari circa a 0; 1+α 2Ts . Per adattarlo al canale di trasmissione (che tipicamente è di tipo passa-banda e non passa-basso) è quindi necessaria una operazione di conversione di frequenza, che si esprime analiticamente come: sRF (t) = Re{s(t, c)ej2πfc t } Si veda a tal proposito anche l’eq. equivalente 3.78. In basso nella figura 4.9 è poi mostrato uno schema più pratico di generazione del segnale PAM in cui si sono messi in evidenza i due rami in fase e in quadratura (corrispondenti a Re{s(t, c)} e a Im{s(t, c)}) nonchè il blocco “bit groups generator” che effettua l’operazione di conversione seriale/parallelo per la mappatura dei bit in ingresso. Come si può notare tale sistema è in pratica lo stesso sistema descritto nel cap. 3 e in particolare nella sezione 3.4, eccetto per l’operazione di FFT/IFFT che qui non è richiesta. 4.2.2 Il ricevitore Nella figura 4.10 sono riportati due schemi equivalenti della struttura di un demodulatore PAM. In tali schemi, assumendo il canale AWGN e con guadagno unitario, il segnale rRF (t) vale sRF (t) + w(t) dove w(t) è rumore AWGN. L’operazione di downconversion, come già illustrato nella sez. 3.4, permette la ricostruzione quasi-perfetta dell’inviluppo complesso r(t): r(t) = s(t) + n(t) 4. Implementazione con dispositivi FPGA received signal r(t) received RF signal rRF(t) Matched filter p(t) baseband signal x(t) 117 xk channel symbols {c~n} Optimum detector tk Symbol demapper ~ data out {dn} exp{j2pfct} Local oscillator Re{r(t)} ADC FIR filter p[n] Re{x(t)} tk Re{xk} cos(2pfct) rRF(t) m bits ~ Re{cn} Local Oscillator Synch recovery Optimum detector Im{c~n} Symbol demapper … Bit groups generator ~ bits out {dn} sen(2pfct) Im{r(t)} ADC FIR filter p[n] Im{xk} Im{x(t)} tk Figura 4.10: In alto: schema base di un ricevitore PAM. In basso: schema più dettagliato dello stesso ricevitore, con implementazione digitale dei filtri adattati. dove n(t) è un processo aleatorio di rumore AWGN. Tale segnale, passando attraverso il filtro adattato, viene campionato a frequenza di simbolo generando la sequenza xk ; il blocco optimum detector poi si occupa di decidere per ogni campione il simbolo complesso, appartenente all’alfabeto Ac , a cui associarlo (tipicamente secondo il criterio ottimo ML) generando dunque la sequenza {c̃n }. Tale sequenza differisce da {cn } solo se si sono verificati errori a causa di problemi di sincronismo o di picchi di rumore. La sequenza viene infine demappata generando la sequenza di bit ricostruiti. In basso nella figura 4.10 è nuovamente mostrato uno schema pratico di demodulazione in cui si sono messi in evidenza i due rami in fase e in quadratura nonchè il blocco che si occupa del recupero di sincronismo di clock e di frequenza di portante (il “synch recovery”); gli algoritmi che si utilizzano per realizzare quest’ultima funzione sono l’oggetto della sezione che segue. 4.3 Sincronizzazione nei sistemi PAM a singola portante Data la maggiore semplicità di un sistema PAM rispetto ad uno OFDM, la letteratura relativa convenzionalmente non presenta un’architettura di sincronizzazione troppo evoluta: di solito non vi è distinzione fra coarse e fine timing, ma in generale sono disponibili solo algoritmi di symbol timing e carrier recovery. Tuttavia, nel nostro caso si è voluto implementare una architettura simile a quella usata per il sistema OFDM; ciò permette sia un riutilizzo e un maggior velocità di conversione fra un tipo di sistema e l’altro, nonchè un recupero del sincronismo più veloce, cosa molto utile per un sistema con trasmissioni a burst. 4.3.1 Algoritmi per la temporizzazione grezza Come descritto nella sez. 3.3.4 la prima cosa che un ricevitore OFDM, ma anche uno PAM, deve effettuare normalmente è la rilevazione di un eventuale frame presente sul 118 4. Implementazione con dispositivi FPGA canale. Poichè gli algoritmi descritti nella sopracitata sezione non sono in realtà specifici per l’OFDM in quanto non richiedono nel trasmettitore e nel ricevitore alcuna operazione di FFT o IFFT, si è deciso di riutilizzarli per la temporizzazione coarse del sistema PAM. Scartato l’algoritmo proposto da Schmidl e Cox (troppo impreciso) si è preferito adottare la metrica ed il reference-block proposto da Shi&Serpedin, vista la sua minore complessità computazionale rispetto quello di Bhargava e Letaief. Si rimanda alla sezione sopracitata relativa al sistema OFDM per maggiori dettagli. 4.3.2 Algoritmi per la temporizzazione fine Per ciò che riguarda la temporizzazione fine (nel contesto delle modulazioni PAM detta symbol timing), sono disponibili vari algoritmi (vedi [8], [20], [21]); la necessità di semplicità ha fatto propendere per la scelta dell’algoritmo detto “zero crossing time-error detector” (o anche semplicemente “zero crossing detector”, ZCD). Tale algoritmo (presentato in [22] ma descritto anche in [8]) calcola una stima dell’errore di timing e(k) per il k-esimo simbolo PAM mediante l’equazione: e(k) = (ĉk−1 − ĉk )y(kTs − Ts /2 + τ̂ k−1 ) k = 1, 2, ...N − 1 (4.1) dove i simboli (complessi) ĉk−1 , ĉk rappresentano le decisioni effettuate dal demodulatore rispettivamente per il (k − 1)-esimo e per il k-esimo simbolo PAM (nel caso in cui l’algoritmo sia usato in modo non-data-aided, ma decision-directed, NDA DD) oppure il (k −1)-esimo e il k-esimo simbolo di canale noto (nel caso in cui l’algoritmo sia usato in modo data-aided, DA). Il segnale tempo-continuo y(t) è l’uscita del filtro adattato del ricevitore, mentre τ̂ k−1 indica l’offset frazionario del tempo di simbolo Ts calcolato grazie allo ZCD stesso nell’iterazione precedente (si assume τ̂ 0 = 0). Per completare la presentazione dell’algoritmo è necessaria un’equazione addizionale, che stabilisca come viene usato l’errore e(k) per il calcolo dell’offset τ̂ k da usare per i successivi campionamenti. Nel nostro caso si è semplicemente posto: τ̂ k = τ̂ k−1 + |e(k)| (4.2) Si può dare una spiegazione intuitiva dell’eq. (4.1): il termine y(kTs − Ts /2 + τ̂ k−1 ) rappresenta il valore (complesso) del segnale ricevuto mezzo tempo di simbolo dopo l’istante di campionamento usato per decidere a favore di ĉk−1 e metà tempo di simbolo prima dell’istante di campionamento che verrà usato per decidere ĉk . Se ĉk−1 = ĉk , allora il segnale in fase e/o quello in quadratura effettuano una transizione fra gli istanti relativi ai due simboli che, nel caso si utilizzi una costellazione 4-PSK o una BPSK, deve necessariamente passare per lo zero (visto che ĉk si trova necessariamente in un altro quadrante del piano complesso rispetto ĉk−1 ). Tale transizione per lo zero si verifica solo approssimativamente (a causa del filtraggio del trasmettitore e del ricevitore) a metà “strada” fra ĉk−1 e ĉk . Comunque il risultato è che se ĉk−1 = ĉk , non vi sono correzioni nell’istante di campionamento (e(k) = 0), mentre se ĉk−1 = ĉk , allora e(k) ≈ 0 solo se y(kTs −Ts /2+τ̂ k−1 ) ≈ 0, ovvero 4. Implementazione con dispositivi FPGA 119 Figura 4.11: Curva S per lo zero-crossing detector (ZCD) per diversi valori dell’ordine M della costellazione; vedi [8, fig. 7.17, pag. 386]. se l’offset di campionamento τ̂ k−1 è già corretto e fa sı̀ che l’istante t = kTs −Ts /2+τ̂ k−1 si trovi a metà fra gli istanti di campionamento ideali per ĉk−1 e ĉk . Per valutare le prestazioni di un algoritmo di symbol timing si può fare riferimento alla curva S, ovvero all’aspettazione della quantità e(k) al variare di τ̂ = Tδs (che è l’offset temporale da stimare ad anello aperto); se lo stimatore è perfettamente lineare la curva S diviene una retta. La curva S per lo ZCD è mostrata nella fig. 4.11. Si rimanda a [8, pag. 386] per ulteriori informazioni dello ZCD (self-noise, confronto con l’algoritmo Mueller&Mueller, etc). 4.4 Simulazione MATLAB del sistema Per testare il sistema si è proceduto come già fatto per i DSP nel realizzare dapprima un simulatore in MATLAB. Gli script del trasmettitore e del ricevitore PAM sono organizzati all’incirca nello stesso modo in cui sono organizzati i rispettivi script per la modulazione OFDM, descritti in dettaglio nella sez. 3.4; quindi in questa sezione si forniranno informazioni solo sulle principali differenze. 120 4.4.1 4. Implementazione con dispositivi FPGA Il trasmettitore Lo script PAM tx.m contiene la funzione PAM tx() che proprio come OFDM tx() richiede che siano dapprima inizializzate alcune costanti presenti sia nel trasmettitore che nel ricevitore (cosa di cui si occupa lo script PAM system.m). La funzione calcola i campioni di uscita per un frame PAM, il quale è composto da un numero fisso Nsynch symbols per f rame di simboli noti (il reference block della metrica di Shi&Serpedin descritto nella sezione precedente, usato anche per il symbol timing fine) e da un numero fisso Ndata symbols per f rame di simboli PAM che codificano dati utili. Non vi sono altre sostanziali differenze con quanto già detto a proposito della funzione OFDM tx(). 4.4.2 Il ricevitore La funzione PAM rx() si occupa della demodulazione utilizzando gli algoritmi descritti nella sez. precedente. Il valore del parametro SIGNAL SOURCE determina la sorgente dei dati analizzati dalla funzione; in modalità “MATLAB TX ” vengono analizzati i dati generati da MATLAB; in modalità “SIMULINK TX ” vengono analizzati quelli prodotti dal modello Simulink che verrà descritto nella sez. 4.5. Sui dati caricati la funzione effettua le operazioni di conversione di frequenza (down-conversion), filtraggio e calcolo della metrica di coarse timing in maniera del tutto simile a quanto fa OFDM rx(). Relativamente al calcolo della metrica di coarse timing, per il nostro sistema si è scelto un blocco di dimensione N = 16 e la metrica classica (vedi eq. (3.67)) è stata modificata per renderne più agevole l’implementazione (in Simulink, descritta in seguito): Γ(θ̃) = Λ1 (θ̃) + Λ2 (θ̃) + Λ3 (θ̃) (4.3) dove: Λ1 (θ̃) = rT0 (θ̃)r1 (θ̃) − rT1 (θ̃)r2 (θ̃) − rT2 (θ̃)r3 (θ̃) Λ2 (θ̃) = rT1 (θ̃)r3 (θ̃) − rT0 (θ̃)r2 (θ̃) Λ3 (θ̃) = rT0 (θ̃)r3 (θ̃) in cui l’operatore rT rappresenta il vettore r trasposto: il reference-block dell’algoritmo di Shi&Serpedin è infatti modulato solo in fase e quindi dei vettori del segnale ricevuto r sono state prese solo le parti reali e all’operatore hermitiano (che effettua la trasposizione e l’operazione di complesso coniugato) si è sostituito quello di trasposizione. Si sono inoltre eliminate le operazioni di modulo nonchè il denominatore di normalizzazione della metrica. Quest’ultima operazione si può giustificare grazie al fatto che in una implementazione concreta il range dei valori della sequenza in ingresso al blocco di coarse timing (ovvero l’escursione dei valori rj (θ̃)) è circa costante grazie alla presenza di un amplificatore a guadagno automatico (automatic gain control - AGC) prima del campionatore 4. Implementazione con dispositivi FPGA 121 A/D; non c’è quindi bisogno di effettuare l’operazione aggiuntiva di normalizzazione a patto di fissare una soglia per la metrica opportunamente calibrata. Sempre per motivi di semplicità dell’implementazione Simulink descritta in seguito, la funzione PAM rx() non effettua l’equalizzazione come descritto per l’OFDM, in cui si utilizzava uno stimatore per la CIR basata sull’intero reference-block di Bhargava&Letaief, ma piuttosto si limita unicamente a correggere il CPO (Carrier Phase Offset) sfruttando la conoscenza della fase assoluta di un singolo simbolo noto. In particolare, supponendo il canale AWGN, una volta che si è effettuata la stima coarse dell’inizio del frame, basta controruotare tutto il segnale ricevuto, effettuando l’operazione: φ̂CP O Ts = ∠r θ̃ + m − ∠β(m) Tc requ (t) = r(t)e−j φ̂CP O (4.4) in cui m è l’indice del simbolo noto scelto per l’equalizzazione, β(m) è il simbolo di canale scelto, θ̃ è l’indice del campione ritornato dalla metrica di coarse-timing, r(t) è il segnale (complesso) ricevuto in banda base dopo il filtraggio adattato. Un fattore importante da tenere in conto nella scelta del valore esatto del parametro m è che in questa fase non si è ancora effettuata l’operazione di stima fine del symbol Ts timing e quindi in generale r θ̃ + m Tc non corrisponde al campione del simbolo m- esimo del reference-block ma disterà da esso fino a ± TTsc campioni. Per questo è bene scegliere una “zona” (tramite la selezione del valore di m) del reference-block trasmesso che sia costituita da più di due-tre simboli dello stesso valore, in modo da essere il più insensibile possibile nella fase di equalizzazione agli errori di timing. Ottenuto il segnale equalizzato requ (t) la funzione PAM rx() procede con la stima fine del symbol-timing tramite l’eq. (4.1) dello stimatore ZCD descritto nella sez. precedente. Un esempio di andamento del segnale di errore e(k) computato è mostrato nella fig. 4.12; si può notare che la funzione va spesso a zero a causa di punti nel referenceblock in cui ĉk−1 − ĉk = 0; tuttavia complessivamente l’inviluppo del segnale ha un andamento che tende a zero (senzaperò raggiungerlo perfettamente). Questo è dovuto, come già detto, al fatto che lo stimatore ZCD assume che il segnale attraversi lo zero sempre a metà della coppia di simboli di canale filtrati che determinano la transizione; questo non è vero, come appare evidente, ad esempio, dalla fig. 4.13: il segnale segue traiettorie varie e passa per lo zero alle volte prima, alle volte dopo rispetto la metà di un tempo di simbolo Ts . Due note ulteriori sullo stimatore di symbol timing fine sono: 1. dopo l’aggiornamento di τ̂ k (vedi eq. (4.2)) la funzione MATLAB effettua un controllo sul nuovo valore di τ̂ k per evitare che diventi negativo (imponendo come limite inferiore lo zero) o maggiore di un tempo di simbolo (imponendo come limite superiore per l’appunto Ts ); questo serve ad evitare che un passo sbagliato nell’algoritmo (a causa del rumore, di un coarse timing offset molto lontano 122 4. Implementazione con dispositivi FPGA ZCD error e(k) 0 −50 −100 −150 −200 −250 −300 −350 −400 −450 0 5 10 15 20 Index k of the synchronization symbol 25 30 35 Figura 4.12: Segnale errore e(k) per un frame PAM contenente 16 simboli di sincronizzazione (e in cui la stima coarse fornisce l’indice di un campione posizionato oltre l’istante ideale di campionamento). 6 1 Eye Diagram for In−Phase Signal x 10 Amplitude 0.5 0 −0.5 −1 −0.5 −0.4 −0.3 −0.2 6 1 −0.1 0 Time 0.1 0.2 0.3 0.4 0.1 0.2 0.3 0.4 Eye Diagram for Quadrature Signal x 10 Amplitude 0.5 0 −0.5 −1 −0.5 −0.4 −0.3 −0.2 −0.1 0 Time Figura 4.13: Diagramma ad occhio relativo alla trasmissione di 4000 simboli PAM (4-PSK), con filtro a radice di coseno rialzato di ordine 99 con coefficiente di roll-off α = 0.5, e con un SNR infinito. 4. Implementazione con dispositivi FPGA 123 dall’istante di campionamento ideale o di errori numerici) comprometta tutta la demodulazione forzando il campionamento successivo ad avvenire eccessivamente lontano da quello precedente; 2. l’equazione di stima dell’errore e(k) non è esattamente l’eq. (4.1) ma piuttosto: e(k) = γ(ĉk−1 − ĉk )requ (kTs − Ts /2 + τ̂ k−1 ) (4.5) Per spiegare il fattore γ aggiuntivo è utile considerare un caso specifico: supponiamo che sia k = 1, ĉ1 = 1, ĉ2 = −1, e che a causa di un offset di − T2s nel coarse timing sia requ (Ts /2) ≈ requ,max = max |requ (t)| invece che requ (Ts /2) ≈ 0; in questa situazione deve risultare e(1) ≈ + T2s in modo da correggere l’offset non voluto: γ(ĉk−1 − ĉk )requ (kTs − Ts /2 + τ̂ k−1 ) = 2 γ requ,max = γ = Ts 2 Ts 2 Ts 4requ,max E’ chiaro quindi che il fattore γ rappresenta un grado di libertà in più che consente di ottenere un valore e(k) che si possa effettivamente usare nell’aggiornamento dell’offset fine τ̂ k . Si noti poi che γ è a tutti gli effetti una costante perchè il valore requ,max è una costante grazie alla presenza dell’AGC prima del campionatore A/D, come già descritto a proposito del timing coarse. Proseguendo nell’analisi di PAM rx(), dopo il symbol timing fine rimangono solo le operazioni di campionamento a tempo di simbolo e di decisione, che avvengono in maniera uguale a come quelle descritte per OFDM rx(). Infine bisogna notare che il ricevitore è, nonostante la scelta di base di mantenerlo il più semplice possibile per facilitare la successiva implementazione in Simulink, piuttosto robusto nei confronti del rumore introdotto dal canale. Nella fig. 4.14 sono infatti mostrati i simboli di canale ricevuti per tre diversi valori di rapporto segnale-rumore. 4.5 Implementazione del trasmettitore in Simulink L’ambiente Simulink, parte di MATLAB, permette la simulazione di sistemi dinamici tempo-continui o tempo-discreti; proprio come per un circuito elettronico (o una FPGA che è un microcircuito digitale riprogrammabile) in un modello Simulink tutte le varie parti vengono simulate contemporaneamente. A differenza quindi delle funzioni MATLAB descritte nelle sezioni precedenti, caratterizzate da un modello di esecuzione di tipo seriale (tipico di dispositivi quali MCU, DSP e CPU), il modello Simulink è intrinsecamente parallelo. Se da un lato questa caratteristica determina che in generale lo sviluppo di un modello Simulink è più difficile e richiede più tempo rispetto lo sviluppo di un programma 124 4. Implementazione con dispositivi FPGA 6 Received channel symbols x 10 1.5 1 Quadrature 0.5 0 −0.5 −1 −1.5 −1.5 −1 −0.5 0 In−Phase 0.5 1 1.5 6 x 10 Figura 4.14: Simboli di canale ricevuti (dopo l’equalizzazione) per un rapporto segnalerumore infinito (punti rossi), pari a 6dB (punti blu) e per 0dB (punti verdi). 4. Implementazione con dispositivi FPGA 125 C o MATLAB, dall’altro permette poi di traslare direttamente il modello Simulink su hardware parallelo quale le FPGA. Grazie infatti agli strumenti software messi a disposizione dai principali produttori (il “DSP Buider” per l’Altera e il “System Generator for DSP” per quanto concerne i prodotti Xilinx) è possibile programmare le FPGA direttamente senza dover scrivere il codice HDL che normalmente si utilizza per la programmazione di tali dispositivi. Complessivamente quindi l’utilizzo di Simulink riduce notevolmente i tempi di sviluppo per le piattaforme FPGA. La struttura a più alto livello del modello Simulink del modulatore è mostrata nella fig. 4.15: si notino le affinità con la fig. 4.9. Per una prima implementazione di test, non si è incluso nel modello Simulink alcun sistema di input dei bit da trasmettere, che sono invece memorizzati in una LUT (look-up table) all’interno del blocco “data bit groups generator”; prima però di trasmettere i dati utili il modulatore invia i dati noti per il sincronizzatore del ricevitore; di questo compito si occupa il blocco “synchronization channel symbols insertion” che emette un impulso (a frequenza di simbolo) sulla uscita “DATA NEXT” solo una volta che tutti i simboli noti sono stati trasmessi (dopodichè si limita a mettere sulle uscite i bit che riceve in ingresso). Il blocco “data bit groups generator” inizia allora ad emettere a frequenza di simbolo le coppie di m = log2 M = 2 bit che vengono trasformate dal blocco “channel symbols mapper” in valori che codificano la parte in fase e in quadratura del simbolo di canale da trasmettere. Completato l’invio di un certo numero prestabilito di dati utili, il blocco “data bit groups generator” avverte i blocchi a valle portando a zero il segnale “VALID OUTPUT”, forzando cosı̀ il “channel symbols mapper” ad emettere una sequenza infinita di zeri in uscita. I valori che codificano parte reale e parte immaginaria dei simboli da trasmettere arrivano al blocco “inphase and quadrature zero-stuffers and filters” che come dice il nome provvede a generare due segnali che contengono i valori in ingresso per un singolo periodo di clock e poi valgono zero per altri Ts − 1 periodi di clock (ovvero effettua lo zero-stuffing delle sequenze di ingresso); tali segnali sono poi forniti in ingresso ai filtri FIR adattati. I filtri sono stati realizzati usando lo strumento “FIR compiler ” della tool-suite DSP Builder di Altera e per l’esattezza sono filtri ad architettura completamente parallela (per ogni periodo di clock forniscono in uscita un campione valido) e coefficienti costanti. La loro uscita è l’ingresso del blocco “up conversion” che effettua la conversione di frequenza sfruttando i blocchi multiplier e il blocco NCO (numerically-controlled oscillator ) facenti anch’essi parte della tool-suite di Altera. Si noti come tale blocco richieda un certo tempo di start-up in cui la sua uscita non è valida; per questo ha un segnale di uscita “VALID OUTPUT” che assume il valore 1 solo quando il blocco è pronto e che determina l’avvio del blocco generatore del clock di simbolo. Il segnale RF è infine salvato su file e contemporaneamente anche sul workspace di MATLAB, per facilitare il debug; in un’implementazione pratica sarà necessario effettuare l’invio dei campioni calcolati di volta in volta ad un DAC. Nella figura 4.16 sono mostrati i principali segnali precedentemente descritti. E’ importante notare come nel modello globale il clock sia pari a 50MHz ma che tutti i blocchi del trasmettitore, eccetto per i filtri e per l’NCO, lavorino in realtà a frequenza molto più bassa ( T1s ). Questo è possibile grazie all’inerente parallelismo di B1 Clock 20 ns 50Mhz global clock D1 D1 D1 D1 Q BITS I BITS Channel symbols mapper VALID INPUT B1 B0 Signal Compiler Data bit groups generator VALID OUTPUT NEXT B0 CLK OUT Ts clock generator START D1 D1 D1 INPUT Q BITS INPUT I BITS TS CLOCK Q I D1 D1 Q I Up conversion VALID OUTPUT RF SIGNAL Once the frame has been transmitted, it endlessly transmit zeroes to the .DAC DATA NEXT Q BITS Synchronization channel symbols insertion DATA Q BITS DATA I BITS I BITS D1 D1 NOTE: the number of cycles simulated by Simulink must be greater or equal to (Nsynch_symbols+Ndata_symbols)*Ts+TstartupNCO where TstartupNCO ~= 50 clock cycles D1 D1 TS CLOCK SIGNAL PROCESSIN G o33:0 D1 accuracy reducer RF signal samples should be comprised outSig D1 RF signal To Workspace SIM_rf To File PAM_dac_input.mat The RF signal is then transmitted to the DAC SIGNAL OUTPU T 126 4. Implementazione con dispositivi FPGA Figura 4.15: Rappresentazione a più alto livello del modello Simulink del trasmettitore PAM. 4. Implementazione con dispositivi FPGA 127 Ts clock generator −> CLK OUT 1 0.5 0 Data bit groups generator −> VALID OUTPUT 1 0.5 0 Channel symbol mapper −> I BITS 1 0 −1 Synchronization channel symbols insertion −> I BITS 1 0 −1 Inphase and quadrature zero−stuffers and filters −> I 100 0 −100 4 Up conversion −> RF SIGNAL x 10 2 0 −2 200 400 600 Sample index 800 1000 1200 Figura 4.16: Principali segnali generati dai blocchi del modulatore PAM. tutto il sistema. Per il modello sviluppato si sono scelti i seguenti parametri di modulazione (per facilitare il debugging): Parametro mod. Ts Fc F IRresponse length α Nsynch symbols per f rame Ndata symbols per f rame Fcarrier Valore scelto 500ns 50M Hz 99 0.5 16 16 4M Hz da cui risulta che la larghezza di banda è: BWP AM = la durata di un frame PAM TP AM TP AM f rame 1+α = 1.5M Hz 2Ts f rame vale: = (Nsynch symbols per f rame + Ndata symbols per f rame ) Ts = 16us la bitrate netta del sistema BRP AM vale: 128 4. Implementazione con dispositivi FPGA BRP AM = Nbits per symbol Ndata symbols per f rame 2bit · 16 = = 2M bps TP AM f rame 16us e infine l’efficienza spettrale η P AM vale: η P AM = BRP AM = 1.33 bit/s/Hz BWP AM Come già accennato tali valori sono solo di prova e serviranno in futuri lavori a testare il sistema hardware per valutare eventuali criticità del sistema; in caso positivo sarà facile migliorare le prestazioni del sistema agendo sui parametri di modulazione e migliorando il sistema in termini di compattezza e di numero di bit utilizzato. Il sistema di test, sempre per facilitare il debug, è stato infatti realizzato utilizzando un ampio numero di bit per tutti i segnali; con uno studio di bit-accuracy sarà però possibile diminuire l’accuratezza della rappresentazione usata in numerosi punti diminuendo cosı̀ la quantità di risorse hardware dell’FPGA attualmente richieste dal modello. A tal fine sarà importante valutare il rapporto segnale rumore di quantizzazione SN Rq lungo tutto il percorso del modulatore, tenendo conto del rumore (dovuto agli errori numerici) introdotto da ciascun blocco, assicurandosi che tutti i bit forniti al DAC per rappresentare i campioni di uscita siano utilizzati per rappresentare segnale (e non rumore). Naturalmente bisognerà poi assicurarsi che all’uscita del DAC il rapporto segnale rumore SN R sia circa uguale al rapporto SN Rq , cioè che il rumore analogico all’uscita sia circa uguale al rumore di quantizzazione. 4.6 Implementazione del ricevitore in Simulink Nella fig. 4.17 è riportato lo schema generale del modello Simulink del ricevitore PAM, che si vede subito essere parecchio più complesso del trasmettitore, come del resto è lecito attendersi. Il segnale di ingresso viene caricato dal file generato dal modello Simulink del trasmettitore e viene elaborato dal blocco “down conversion” (che come il suo duale nel trasmettitore utilizza un NCO che lavora alla stessa frequenza); i segnali in fase e in quadratura cosı̀ ottenuti sono filtrati (con filtri FIR adattati identici a quelli usati nel trasmettitore) e vengono utilizzati per il calcolo della metrica di timing coarse mediante l’algoritmo di Shi&Serpedin semplificato come da eq. (4.3). Tale blocco, il cui schema interno è mostrato nella fig. 4.18, campiona a tempo di simbolo il segnale in-fase ed utilizza una linea di ritardo a N prese in modo da avere disponibili in ogni istante (eccetto per la fase iniziale in cui la linea di ritardo contiene ancora degli zeri) gli N campioni distanziati di Ts che compongono i vettori rj (θ̃) con j = 0, 1, 2, 3; i valori di tali vettori sono poi forniti ai blocchi trapezoidali che rappresentano gli operatori di dot-product e sommati assieme. Vengono quindi eseguite le operazioni di ricerca del massimo (tramite l’analisi della derivata della metrica, implementata con un blocco differenziatore tempo-discreto) e di controllo della soglia. Il risultato finale è il segnale “COARSE TRIGGER” che ha un transizione 0>1 e 1>0 nel caso in cui venga rilevato un frame in ingresso; quello dunque che era un Clock 20 ns i13:0 Input Resource Usage Signal Compiler Accuray reducer Logic: N/A RAM: N/A DSP: N/A 50Mhz global clock From File PAM_dac_input.ma t The RF signal is acquired from the ADC RF signal Logical Bit Operator system_ready I IN Q IN I Q VALID OUTPUT Down conversion RF SIGNAL AND SIGNAL INPUT Q I Q TSS I TSS COARSE TRIGGE R Q I Q TSS I TSS Equalizer EQU TRIGGE R NOTE: the number of cycles simulated by Simulink must be greater or equal to I EQU READY Q EQU transitions indicate the points where the signal SIM_output_bits encodes two valid output bits. Q OUT I OUT POWER LEVEL Q Automatic gain control (AGC ) LNA FEEDBACK I SIGNAL PROCESSING I EQU TS CLOCK SYNCH Fine timing (clock recovery) COARSE TRIGGE R POWER LEVEL Q EQU I EQU TS CLOCK SYNCH 4. Implementazione con dispositivi FPGA 129 Figura 4.17: Rappresentazione a più alto livello del modello Simulink del ricevitore PAM. 2 Goto word_1(43:0) [R0_0] Goto1 word_2(43:0) [R0_1] Goto2 word_3(43:0) [R0_2] Goto3 word_4(43:0) A A A A B B B B A A A A B B B B A A A A B B B B A A A A B B B B A A A A B B B B A A A A B B B B [R0_0] [R0_1] [R0_2] [R0_3] [R1_0] [R1_1] [R1_2] [R1_3] [R1_0] [R1_1] [R1_2] [R1_3] [R2_0] [R2_1] [R2_2] [R2_3] [R2_0] [R2_1] [R2_2] [R2_3] [R3_0] [R3_1] [R3_2] [R3_3] [R1_0] [R1_1] [R1_2] [R1_3] [R3_0] [R3_1] [R3_2] [R3_3] [R0_0] [R0_1] [R0_2] [R0_3] [R2_0] [R2_1] [R2_2] [R2_3] [R0_0] [R0_1] [R0_2] [R0_3] [R3_0] [R3_1] [R3_2] [R3_3] [R0_3] 3 2 1 0 3 2 1 0 3 2 1 0 3 2 1 0 3 2 1 0 3 2 1 0 3 2 1 0 3 2 1 0 3 2 1 0 3 2 1 0 3 2 1 0 3 2 1 0 Goto4 word_5(43:0) A dot B A dot B A dot B A dot B A dot B A dot B [R1_1] word_6(43:0) R0 dot R3 R0 dot R2 R1 dot R3 R2 dot R3 R1 dot R2 R0 dot R1 Goto5 Goto6 word_7(43:0) R0dotR3 R0dotR2 R1dotR3 R2dotR3 R1dotR2 R0dotR1 [R1_2] Goto7 [R1_3] word_8(43:0) Goto8 IMPORTANT: on these wires valid outputs are available with a delay of 2 clock cycles respect the delay line status [R1_0] Delay_line I TSS dl_end DL_inphase reset 0 + + + word_9(43:0) + Goto9 word_10(43:0) [R2_1] Parallel Adder Subtractor [R2_0] r metric Goto10 word_11(43:0) metric [R2_2] n x25 q Goto11 Ts sampler d SI(43:0) Threshold 4000000 Goto14 word_13(43:0) [R3_0] INPUT MAX DETECTED Comparator >= [R3_1] word_14(43:0) Maximum detector b a Goto15 signal Metric value too low 0 [R3_2] max detector Goto12 word_15(43:0) Goto13 2 Q Figura 4.18: Modello Simulink del blocco “Shi-Serpedin coarse timing metric”. d x25 q Ts sampler1 QUADRATUR E Multiplexer Delay matcher MUX sel(0:0) QUADRATURE_DELAYED parts of the samples (see PAM_rx.m) metric works well also considering only the real the coarse timing logic since the Shi&Serpedin NOTE: the quadrature samples are discarded by word_16(43:0) [R3_3] IMPORTANT: on this wire valid output is available with a delay of 5 clock cycles respect the delay line status [R2_3] word_12(43:0) I 1 coarse trigger Q TSS 3 metric dl_start 1 DEBUG COARSE TRIGGE R 130 4. Implementazione con dispositivi FPGA 4. Implementazione con dispositivi FPGA 131 valore θ̃ calcolato tramite uno stimatore nello script MATLAB diviene la transizione di un segnale nel modello Simulink. Tale segnale aziona tutto il resto del ricevitore ed in particolare l’equalizzatore (vedi la fig. 4.19), il quale memorizza N TTsc campioni sia per la parte in fase che per la parte in quadratura in memorie FIFO, cosı̀ da introdurre nei segnali da elaborare un ritardo pari a quello introdotto dal blocco di coarse-timing. Se infatti il primo simbolo PAM del frame è localizzato al campione di indice θ, il segnale “COARSE TRIGGER” ha una transizione in corrispondenza del campione di indice θ̃ + N TTsc (dove θ̃ = θ in caso di una stima perfetta). L’equalizzatore utilizza il campione di indice θ̃ + (N + m) TTsc per effettuare la stima del CPO e genera i segnali di uscita “I EQU” e “Q EQU” tramite l’eq. (4.4) opportunamente semplificata: requ [n] = r[n]e−j φ̂CP O = (Re{r[n]} + j Im{r[n]}) (cos φ̂CP O − j sin φ̂CP O ) = = Re{r[n]} cos φ̂CP O + Im{r[n]} sin φ̂CP O + j Im{r[n]} cos φ̂CP O − Re{r[n]} sin φ̂CP O da cui: Re{requ [n]} = Re{r[n]} cos φ̂CP O + Im{r[n]} sin φ̂CP O Im{requ [n]} = Im{r[n]} cos φ̂CP O − Re{r[n]} sin φ̂CP O La vera semplificazione consiste però nel modo in cui si possono esprimere il coseno ed il seno: cos φ̂CP O Ts − ∠β(m) = = cos ∠r θ̃ + (N + m) Tc Im{r θ̃ + (N + m) TTsc } − ∠β(m) = = cos arctan Ts Re{r θ̃ + (N + m) Tc } q0 = cos arctan − ∠β(m) i0 in cui si è posto q0 = Im{r θ̃ + (N + m) TTsc } e i0 = Re{r θ̃ + (N + m) TTsc } (parte reale e immaginaria del campione di ingresso usato per la stima). Posto poi y = tan x, x = arctan y per il teorema della funzione inversa2 risulta: 2 Le ipotesi di tale teorema richiedono che la funzione tan x sia continua, strettamente crescente e derivabile con derivata non nulla in un intervallo [a, b] (vedi [4, equ. 42.11, p.127]). d Nel caso specifico le ipotesi sono soddisfatte nell’intervallo aperto − π2 , + π2 (difatti dx tan x = 1 = 0 in tale intervallo). cos2 x 3 i q 1000 [TRIGGER] d r b(43:0) a(43:0) DEBUG inputs i Divider a=bXq+r r(43:0) q(43:0) IMPORTANT: the input range of I & Q samples is I TSS 2 Q TSS KeqR Single Pulse Multiplier X r (43:0) KeqR*Q/I b(43:0) a(43:0) 3 READY 1 5 Q 1 4 I y_i y_i KeqR_squared 1000000 + Scope2 wreq rreq d wreq rreq d r quadrature FIFO FIFO inphase FIFO FIFO q full usdw(9:0) empty full q empty r usdw(9:0) KeqN_sign_inverted d Pipelined Adder b a q_delayed i_delayed d(43:0) Scope5 1000000 Figura 4.19: Modello Simulink del blocco “equalizer”. Divider3 a = b X q +r Divider1 a = b X q +r 0 Ieq r(21:0) q(21:0) Qeq Constant5 1 Constant4 r(21:0) q(21:0) [IEQ] [QEQ] [QEQ] [IEQ] X r (43:0) X r (43:0) X r (43:0) X r (43:0) q_delayed i_delayed Multiplier4 b(43:0) a(43:0) Multiplier3 b(43:0) a(43:0) Multiplier2 b(43:0) a(43:0) Multiplier1 b(43:0) a(43:0) IEQ+j*QEQ signal baseband signal INPHASE+j*QUADRATURE and the Qeq Ieq + 1 r r (2 x 22) True DPRA M q_delayed_equ q_delayed_equ ct 1 I EQU M DEBUG1 Q EQU 2 signal equalized baseband i_delayed_equ i_delayed_equ i_delayed_equ wren_b addr_b(0:0) data_b(21:0) wren_a addr_a(0:0) [TRIGGER] EQU TRIGGE R data_a(21:0) [TRIGGER] Pipelined Adder2 b a Pipelined Adder1 b a IMPORTANT: Ieq and Qeq values are valid after 2 clock cycles respect the current status of the input I & Q samples b(21:0) a(21:0) denominator b(21:0) a(21:0) NOTE: the blocks above implement a complex multiplication between the Square Root q(21:0) KeqN_per_KeqR q_b q_a [QEQ] Output o21:0 Output1 o21:0 [IEQ] Qeq Ieq Qeq_Ieq_stored is SIGNED to use the Output Block and explicitely specify that the signal to be unsigned; to correctly see the values entered in the RAM we need IMPORTANT: the output of the RAM block is considered by Simulink Ieq = KeqR*KeqN/(KeqD*sqrt(KeqR^2 + (KeqR*Q/I)^2)) NOTE: the equation which is implemented: is FIXME: q_a and q_b are 22 bits; multiplier inputs are 44bits!!! 132 4. Implementazione con dispositivi FPGA 4. Implementazione con dispositivi FPGA 133 d 1 arctan y = d = cos2 (arctan y) dy tan x dx x=arctan y π π ∀x ∈ − ,+ → ∀y ∈ (−∞; +∞) 2 2 d tan−1 y = dy e ricordando che ∀y ∈ ℜ, d dy arctan y = 1 1+y 2 allora è facile dimostrare che: 1 cos (arctan y) = + 1 1 + y2 ∀y ∈ ℜ (nell’estrarre la radice si è tenuto conto che cos (arctan y) > 0, ∀y ∈ ℜ) e analogamente: y sin (arctan y) = + 1 1 + y2 ∀y ∈ ℜ da cui, se si sceglie l’indice m in modo tale che ∠β(m) = 0: cos φ̂CP O = cos(arctan sin φ̂CP O = sin(arctan q0 1 )= 2 i0 1 + (q0 /i0 )2 q0 / q0 i0 )= 2 i0 1 + (q0 /i0 )2 In conclusione l’equalizzatore si limita quindi a calcolare dapprima i coefficienti q0 / i0 qeq = 1 e i = memorizzandoli in un blocco “dual port RAM” eq 2 2 q q 1+( 0 /i0 ) 1+( 0 /i0 ) (fornito da Altera) e poi a calcolare per tutti i campioni del resto del segnale ricevuto: Re{requ [n]} = Re{r[n]}qeq + Im{r[n]}ieq Im{requ [n]} = Im{r[n]}qeq − Re{r[n]}ieq in cui tutte le quantità che vanno moltiplicate sono numeri reali. Il segnale in fase una volta equalizzato è fornito (a frequenza di clock e non di simbolo!) in ingresso al blocco che si occupa di implementare la stima fine del symbol timing (vedi la fig. 4.20) tramite l’equazione (4.5). Tale blocco si è dapprima provato ad implementarlo utilizzando una linea di ritardo programmabile, ma visti poi i problemi causati da tale approccio (riguardo allo stato interno della linea che inevitabilmente veniva compromesso), si è preferito ripiegare su una soluzione diversa: si può pensare che l’algoritmo ZCD fornisca di volta in volta il numero di campioni (τ̂ k − τ̂ k−1 ) di cui ritardare l’istante di campionamento successivo. Quindi il blocco denominato “fine symbol timing (clock recovery)” si limita a calcolare, partendo dal campione θ̃ + ∆ + T2s (in cui ∆ rappresenta il ritardo introdotto sia dal coarse-timing che dall’equalizzatore), l’errore e(k); attesi e(k) periodi di clock, genera una transizione sul clock interno denominato “TED CLOCK”. In risposta a tale evento viene T q(3:0) 3 I EQU i_equ b(87:0) a(87:0) Divider a=bXq+r err 24 + r add + + tau_new NOTE: in ideal conditions the TED clock signal should be aligned with the points where the equalized inphase signal crosses the zero. r(87:0) q(87:0) IMPORTANT: the FRAME DETECTED signal and the bit/Ts clock signal must be aligned! 1 POWER LEVE L 100000 FIXME: here there should be POWER LEVE L Multiplier a(43:0) X r (87:0) b(43:0) TODO: use also the power level signal to determine frame presence (3:0) TED clock and Zero counter RAM (2 x 6) q tau is_synchronizing Number of synch 15 current_zero fd FD PERIOD current_zero CLK OUT TED clock generator TED clock delay RA M wren addr(0:0) d(5:0) clk_enamod21 q(4:0) 0 AND q b a fd < q AUTO and1 AND frame_detected NOT is_synchronizing d FD mod25 q(4:0) data_symbols_availabl e synch Ts clock generator ena sset Coarse_trigger clock 2 24 b a COARSE TRIGGE R < 2 AUTO b a 15 z z == z q AUTO synch_clock q(4:0) clk_ena Data symbols counter d mod2^5 frame_detector d 1 TS CLOCK SYNCH 134 4. Implementazione con dispositivi FPGA Figura 4.20: Modello Simulink del blocco “fine timing (clock recovery)”. 4. Implementazione con dispositivi FPGA 135 Down conversion −> RF SIGNAL 1 0 −1 −2 5 Down conversion −> I x 10 2 0 −2 Inphase and quadrature filters −> I OUT 1000 0 −1000 Shi−Serpedin coarse timing metric −> I TSS 1000 0 −1000 Shi−Serpedin coarse timing metric −> COARSE TRIGGER 1 0.5 0 6 Automatic Gain Control (AGC) −> POWER LEVEL 6 Equalizer −> I EQU x 10 10 5 0 x 10 1 0 −1 Fine timing (clock recovery) −> TS CLOCK SYNCH 1 0.5 0 200 400 600 800 1000 1200 1400 1600 1800 Sample index Figura 4.21: Principali segnali generati dai blocchi del demodulatore PAM. calcolato il valore e(k + 1) e cosı̀ via. Le transizioni nel segnale “TED CLOCK” non sono quindi equidistanziate. Nell’eseguire il calcolo di e(k) si utilizza una look-up table per i fattori ĉk−1 −ĉk che sono noti a priori e dopo aver generato N − 1 transizioni sul “TED CLOCK” il sincronizzatore fine si disattiva. Da quel momento in avanti si limita a generare transizioni sul clock che fornisce in uscita denominato “TS SYNCH CLOCK” equidistanziate di un tempo di simbolo. Infatti l’ultimo blocco del ricevitore (cioè il “channel symbol detector”) utilizza quel clock per campionare il segnale equalizzato, per stabilire in quale quadrante si trova (per fare questo, essendo M = 4 si limita a controllare il segno della parte in fase e di quella in quadratura) e per segnalare che le sue uscite sono valide. Controllando il valore di tali uscite in corrispondenza degli eventi di “TS SYNCH CLOCK” si può risalire ai bit decodificati e verificare se erano effettivamente quelli trasmessi (per automatizzare tale operazione si è scritta una funzione in MATLAB presente nel file sample output bits.m). L’evoluzione temporale dei segnali principali descritti finora è mostrata nella fig. 4.21. Come considerazione conclusiva bisogna specificare che anche per il ricevitore sarà importante in futuro effettuare un lavoro di ottimizzazione e uno studio di bit-accuracy (come già accennato nella sezione precedente a proposito del trasmettitore). Inoltre a differenza del trasmettitore che per sua natura è relativamente semplice, per il ricevitore ci sono architetture utilizzabili potenzialmente più ottimizzate in termini di risorse richieste sull’FPGA (per il modello sopra esposto le parti che richiedono il maggior 136 4. Implementazione con dispositivi FPGA numero di celle logiche sono i filtri adattati, l’NCO e i buffer FIFO utilizzati nell’equalizzatore, nonchè il gran numero di moltiplicatori presenti nei vari sottosistemi) che non si è avuto modo di esplorare per motivi di tempo. 4.7 Conclusioni per l’implementazione a FPGA I modelli Simulink del trasmettitore e del ricevitore sono stati testati più volte e con diversi segnali e risultano funzionare correttamente, nonostante tutte le varie nonidealità. Bisogna comunque aspettarsi che nel passaggio dal modello Simulink all’hardware vero e proprio ci saranno correzioni da apportare, in quanto il modello Simulink non tiene conto dei ritardi di propagazione del segnale all’interno dell’FPGA. Ad ogni modo, per giungere a modelli Simulink funzionanti sono state necessarie intense ore di lavoro e un continuo raffronto fra i risultati di Simulink e quelli dei relativi script MATLAB. Il lavoro svolto è stato però stimolante e mi ha dato modo di conoscere meglio i dispositivi FPGA e le tecniche con cui si programmano. Capitolo 5 Conclusioni In questo lavoro di tesi sono state analizzate due possibili implementazioni di un modem digitale a larga banda. Sebbene l’approccio a DSP non si sia rivelato proficuo ha comunque permesso di studiare e di mettere in pratica numerosi algoritmi senza i quali è impossibile oggigiorno realizzare un sistema ad elevate prestazioni, nonchè di guadagnare esperienza preziosa per la realizzazione di sistemi futuri. L’implementazione con dispositivi FPGA si è invece rilevata assai più promettente e, sebbene non sia stato possibile per motivi di tempo effettuare una verifica sperimentale dei modelli sviluppati, dovrebbe essere possibile convertire il modello Simulink in files atti alla programmazione dell’hardware senza eccessivi sforzi e in tempi brevi. In futuri progetti, si spera anche grazie alle informazioni qui contenute, sarà più facile scegliere la giusta piattaforma hardware tenendo a mente che, se da un lato i DSP consentono tempi di sviluppo ridotti grazie all’uso di un linguaggio di programmazione “convenzionale” quale il C, hanno in generale un throughput limitato. Le FPGA dualmente abbinano ad un throughput molto elevato (grazie all’elevatissimo parallelismo interno) tempi di sviluppo sensibilmente più lunghi a causa della necessità di usare linguaggi di descrizione dell’hardware o simulazioni di elaborazione parallela (come consente di fare Simulink). In questa luce appare vincente un design che faccia uso dei DSP o di un processore soft per quelle parti algoritmiche di signal-processing caratterizzate da frequenze ridotte (ad esempio, le operazioni di equalizzazione e di decodifica eseguite a frequenza di simbolo) e delle FPGA per quelle parti in cui è invece necessario un elevato parallelismo per fare fronte alla mole di dati da processare (ad esempio, le operazioni di filtraggio e di coarse- e fine- timing del demodulatore). Per questo sarà importante in futuro esplorare le modalità di uso e le funzionalità offerte dai processori soft integrabili su FPGA, quali il processore Nios II offerto da Altera. Rimangono inoltre aperte numerose possibilità di miglioramento, sia sulla parte algoritmica che sulla quella hardware, che vengono riassunte nell’appendice A. 137 Appendice A Sviluppi futuri Eventuali futuri sviluppi sul lavoro presentato in questo documento possono riguardare: • miglioramento dell’elettronica analogica; in particolare inserimento di un filtro anti-immagine di ordine elevato dopo il DAC e di un filtro anti-aliasing uguale prima dell’ADC; • esecuzione di misure accurate sulla circuiteria (analogica) di ingresso e uscita dei convertitori (in cui ci sono trasformatori per l’accoppiamento AC del segnale); • a lato trasmettitore unire all’operazione di filtraggio a radice di coseno rialzato anche il filtro di pre-distorsione per compensare la distorsione dal DAC (vedi sez. 3.5.2); • utilizzare mixer di up- e down- conversione esterni per guadagnare banda; in questo modo a lato ricevitore si può campionare alla notevolmente più bassa frequenza di simbolo e per effettuare il timing fine si può utilizzare un ritardatore di fase programmabile per il clock del campionatore oppure utilizzare un interpolatore interno; • aumentare l’efficienza della metrica di coarse timing generando reference block modulati sia in fase che in quadratura; • aggiungere un codice a correzione o rilevazione d’errore; • implementare lo strato 2 (MAC), aggiungendo una procedura di automatic repeat request (ARQ); • studio degli algoritmi di sincronizzazione utilizzati negli standard a larga banda per identificare ulteriori punti che necessitano di miglioramento; • studio del processore soft Nios II offerto da Altera per la creazione di un sistema ibrido; 138 Bibliografia [1] G.M.Vitetta, “Tecniche di Trasmissione Digitali”, appunti del corso di Trasmissione Numerica A. [2] G.M.Vitetta, M. Luise, “Teoria dei segnali”, seconda edizione, McGraw Hill, 2003. [3] J.G. Proakis, “Digital communications”, quarta edizione, 2001. [4] P. Marcellini, C. Sbordone, “Elementi di Analisi Matematica uno”, prima edizione, Liguori Editore, 2002. [5] F. Morselli, “Realizzazione di un sistema di trasmissione OFDM per Power Line Communication”, Tesi di laurea specialistica, Università degli Studi di Modena e Reggio Emilia, 2007. [6] R. Basso Brusa, “Introduzione all’utilizzo della scheda DSP Texas Instruments EVM TMS320C6455”, Tesi di laurea triennale, Università degli Studi di Modena e Reggio Emilia, 2008. [7] I. Baroni, “Gestione dell’ingresso e dell’uscita digitali su scheda DSP Texas Instruments EVM TMS320C6455”, Tesi di laurea triennale, Università degli Studi di Modena e Reggio Emilia, 2009. [8] U. Mengali, A. D’Andrea, “Synchronization Techniques for Digital Receivers”, Plenum Press, New York and London, 1997. [9] F. Gianaroli, A. Barbieri, F. Pancaldi, A. Mazzanti, G. M. Vitetta, “A novel approach to powerline channel modeling”, IEEE PES Transactions on Power Delivery, 2009. [10] M. Morelli, C.C. Jay Kuo, Man-On Pun, “Synchronization Techniques for Orthogonal Frequency Division Multiple Access (OFDMA): A Tutorial Review”, Proceedings of the IEEE, vol. 95, No. 7, July 2007. [11] M. Morelli, U. Mengali, “An Improved Frequency Offset Estimator for OFDM Applications”, IEEE Communications Letters, vol. 3, no. 3, March 1999. [12] Hlaing Minn, Vijay K. Bhargava, Khaled Ben Letaief, “A Robust Timing and Frequency Synchronization for OFDM Systems”, IEEE Transactions on Wireless Communications, vol. 2, no. 4, July 2003. 139 140 BIBLIOGRAFIA [13] Giovanni Santella, “A Frequency and Symbol Synchronization System for OFDM Signals: Architecture and Simulation Results”, IEEE Transactions on Vehicular Technology, vol. 49, no.1, January 2000. [14] Michael Speth, Stefan A. Fechtel, Gunnar Fock, Heinrich Meyr, “Optimum Receiver Design for Wireless Broad-Band Systems Using OFDM - Part I”, IEEE Transactions on Communications, vol. 47, no. 11, November 1999. [15] Michael Speth, Stefan A. Fechtel, Gunnar Fock, Heinrich Meyr, “Optimum Receiver Design for Wireless Broad-Band Systems Using OFDM - Part II: A Case Study”, IEEE Transactions on Communications, vol. 49, no. 4, April 2001. [16] Kai Shi, Erchin Sherpedin, “Coarse Frame and Carrier Synchronization of OFDM Systems: A New Metric and Comparison”, IEEE Transactions on Wireless Communications, vol. 3, no 4, July 2004. [17] T. M. Schmidl e D. C. Cox, “Robust frequency and timing synchronization for OFDM”, IEEE Transactions on Communications, vol. 45, no. 12, pp. 1613-1621, Dec. 1997. [18] Dong Kyu Kim, Sang Hyun Do, Hong Bae Cho, Hyung Jin Choi and Ki Bum Kim, “A new Joint Algorithm of Symbol Timing Recovery and Sampling Clock Adjustment for OFDM Systems”, IEEE Transactions on Consumer Electronics, vol. 44, no. 3, August 1998. [19] Thomas Keller, Lajos Hanzo, “Adaptive Multicarrier Modulation: A Convenient Framework for Time-Frequency Processing in Wireless Communications”, IEEE Procedings of the IEEE, Vol. 88, No. 5, pp. 611-640, May 2000. [20] William G. Cowley, Lesley P. Sabel, “The performance of two symbol timing recovery algorithms for PSK demodulators”, IEEE Transactions on Communications, vol. 42, no. 6, June 1994. [21] M. H. Meyers, L. E. Franks, “Joint carrier phase and symbol timing recovery for PAM systems”, IEEE Transactions on Communications, vol. 28, no. 8, August 1980. [22] F. M. Gardner, “Demodulator reference recovery techniques suited for digital implementation”, European Space Agency, Final report, ESTEC contract no. 6847/86/NL/DG, August 1988. BIBLIOGRAFIA 141 Bibliografia per PLC: [23] E. Sironi, “Analisi sperimentale delle interferenze nelle comunicazioni a larga banda su linee elettriche”, Tesi di laurea triennale, Università degli Studi di Modena e Reggio Emilia, 2009. [24] K. Dostert, Powerline Communications, Prentice Hall, 2001. [25] M. Gebhardt, F. Weinmann e K. Dostert, “Physical and Regulatory Constraints for Communication over the Power Supply Grid”, IEEE Commun. Mag., vol. 41, no. 5, mag. 2003. [26] Hrasnica, A. Haidine e R. Lenhert, Broadband Powerline Communications Networks — Network design, John Wiley & Sons, 2004. [27] S. Martini, “Sistemi di comunicazione su linee elettriche (Powerline Communications)”, Tesi di Laurea in Ingegneria delle Telecomunicazioni, Università degli Studi di Pisa, 2001. [28] S. Galli e O. Logvinov, “Recent Developments in the Standardization of Power Line Communications within the IEEE”, IEEE Comm. Mag., lug. 2008. [29] S. Galli, “PLC Standardization Progress and Some PHY Considerations”, Keynote Talk, 13th Int. Symp. Power-Line Comm. Appl., apr 2009. [30] ETSI TS 101 867 v. 1.1.1, “Powerline Telecommunications (PLT); Coexistence of Access and In-House Powerline Sytems”, nov. 2000. [31] ETSI TR 102 494 v. 1.1.1, “Powerline Telecommunications (PLT); Technical requirements for In-House PLC modems”, giu. 2005. [32] ETSI TR 102 578 v. 1.2.1, “Powerline Telecommunications (PLT); Coexistence between PLT Modems and Short Wave Radio broadcasting services”, ago. 2008. [33] Sito web dell’ IEEE P1901 Working http://grouper.ieee.org/groups/1901/. [34] Sito web dell’associazione http://www.plcforum.org/. Group. PLCforum. Disponibile Disponibile on-line: on-line: [35] M. Zimmermann e K. Dostert, “A multipath model for the powerline channel”, IEEE Trans. Comm., vol. 50, no. 4, Apr. 2002. [36] F. J. Cañete, J. A. Cortés, L. Dı́ez, e J. T. Entrambasaguas, “Modeling and Evaluation of the Indoor Power Line Transmission Medium”, IEEE Comm. Mag., vol. 41, apr. 2003. [37] F. J. Cañete, J. A. Cortés, L. Dı́ez, J. T. Entrambasaguas e J. L. Carmona, “Fundamentals of the Cyclic Short-Time Variation of Indoor Power-line Channels”, in Proc. 9th Int. Symp. Power-Line Comm. Appl., apr. 2005. 142 BIBLIOGRAFIA [38] F. J. Cañete, J. A. Cortés, L. Dı́ez, e J. T. Entrambasaguas, “Analysis of the Cyclic Short-Time Variation of Indoor Power Line Channels”, IEEE J. Sel. Areas Comm., vol. 24, no. 7, lug. 2006. Ringraziamenti Lo svolgimento del progetto descritto in questa tesi è stato possibile grazie all’aiuto di varie persone che desidero qui ringraziare di cuore. Un sentito grazie va al prof. G. M. Vitetta che mi ha messo a completa disposizione strumenti e fondi economici per lo sviluppo del progetto e che mi ha sempre incoraggiato e motivato nonostante i (tanti) insuccessi. Un’altro ringraziamento speciale va all’ing. Fabrizio Pancaldi e all’ing. Andrea Mazzanti per aver ascoltato le mie lamentele e i miei problemi (per la parte di telecomunicazioni e per la parte più strettamente elettronica rispettivamente) e avermi suggerito immancabilmente tante buone idee e soluzioni. Ringrazio anche i vari tesisti che hanno condiviso con me parti ausiliare e non del progetto di tesi: Ivano Baroni, Raffaella Miranda, Alessandro Lipari, Michele Po e Alessandro Gulli (anche se alle volte hanno messo alla prova la mia pazienza con domande non troppo profonde!). Ringrazio Roberto Formentini che, anche se in modi alle volte un pò burberi, ci ha fornito aiuti indispensabili nelle saldature lillipuziane e in tante altre cose. Ringrazio il dott. Paganelli che è sempre un passo avanti nel campo delle telecomunicazioni (e non solo) e che mi ha fornito aiuto disinteressato in tanti problemi piccoli e grandi senza che potessi contraccambiare(!). Ringrazio il dott. Setti perchè nei pochi stralci di tempo libero che siamo riusciti a trovare in questo periodo di tesi mi ha aiutato ad accudire i nostri progetti di elettronica. Ringrazio inoltre anche tutte le altre persone dell’ottimo ambiente di lavoro in cui mi sono trovato in questi mesi: Simone, Alessandro e Daniela nonchè i ragazzi di AUTOLAB (Giovanni, Davide, Federica, Marco...) e di OPTOLAB (Stefano, Matteo, Less, Lullo, Luca...). Ringrazio infine la mia famiglia per avermi supportato durante tutta l’attività di tesi (e non solo). 143