ArPhy

From ciapini
Revision as of 17:56, 21 January 2014 by Cesco (talk | contribs)
Jump to navigation Jump to search

physical layer per canali di comunicazione sfigati

per resistere agli errori di trasmissione, gli header e i dati passano attraverso un #FEC ed un #Interleaver.

FEC

algoritmo di FEC: Hadamard code

la dimensione del blocco di uscita del FEC e' di 2^input-1

il grado di ridondanza del FEC puo essere scelto a seconda della dimensione del blocco di input:

  • k = 4bit -> 8 bit
  • k = 6bit -> 32 bit (come allinearlo?)
  • k = 8bit -> 128 bit

applicato a una PDU arNet di 32bit:

  • k = 4, 8*4 -> 8*8 -> 64bit
  • k = 8, 4*8 -> 128*8 -> 1024bit

forse ha senso considerare dei block codes diversi da quello di Hadamrd, che e' non-ottimale per k maggiore di 7 [1].

letture:

Interleaver

i possibili problemi 'descrivibili' del path di trasmissione sono:

problemi di spettro:

  • interferenze coerenti (toni sovrapposti a uno dei nostri bin)
  • errori della risposta in frequenza (equalizzazione..)

entrambi comportano il danneggamiento sistematico di una o piu determinate lettere dell'alfabeto in ogni simbolo

problemi nella sequenza di simboli:

  • disturbo impulsivo prolungato su tutto lo spettro
  • disturbo impulsivo ciclico su tutto lo spettro

che comportano la perdita di piu simboli contigui o la perdita sistematica di un determinato simbolo.

per mitigare questi problemi puo essere conveniente una qualche forma di interleaving sia nel dominio del tempo che in quello del codice.

il sistema piu rudimentale e' l'interleaving elicoidale, ad esempio una rotazione nel senso della sequenza combinata con una rotazione nel senso del simbolo. l'incremento sarebbe di un bit/simbolo in senso verticale e di un sottoblocco + un simbolo in senso orizzontale

uint8_t InterleaveBlock(uint8_t *InData, int16_t *DataMatrix, uint8_t *ModulationSymbolsBuffer){
   uint8_t BitPos, SymbolOffset, BitOffset;
   for (uint8_t FECBlock = 0; FECBlock < HadamardCodesPerInterleaverBlock; FECBlock++){
 
      BlockEncodeChar(DataMatrix, InData[FECBlock]);
      for (uint8_t FECBit = 0; FECBit < HadamardCodeSize; FECBit++){
	 BitPos = (FECBlock * HadamardCodeSize) + FECBit;
	 BitOffset = BitPos % BitsPerModulationSymbol;
	 SymbolOffset = ((FECBit * HadamardCodeSize) + FECBlock) % SymbolsPerInterleaverBlock;
	 ModulationSymbolsBuffer[SymbolOffset] |= (DataMatrix[FECBit] & 0b1) << BitOffset;
	 // printf("%u,%u,%u\n", SymbolOffset, BitOffset, BitPos);
      }
//      printf("\n in FEC: ");
//      printbuf(DataMatrix, HadamardCodeSize, 8);
   }
}

che produce una disposizione [2], dove il colore e' l'ordine dei bit in ingresso (dal blu al rosso), la x e' il tempo e la y il simbolo in uscita

i parametri rilevanti da passare all'interleaver sono:

  • dimensione della costellazione
  • numero di simboli per interleaver block

http://cgit.brokenbydesign.org/cgit.cgi/armando.git/plain/interleaver.c

Soft-Decision

nella catena di demodulazione si possono ottenere diversi indici di affidabilita

  • rapporto tra il tono di picco e la media degli altri toni
  • valore del picco carattere nella trasformata di hadamard

una cosa MOLTO carina da fare (dato che siamo in uno dei pochi casi in cui le risorse di calcolo sono ben piu grandi della banda) e' avere una qualche strategia di soft-decision pilotata dai valori in uscita dalla fft, magari triggerata da differenze tra l'energia nei bin inferiori a una data soglia.