33
Cap´ ıtulo 3 Implementaci´ on en MatLab de la capa PHY PRIME OFDM 3.1. Introducci´ on La mejor forma para comprender el funcionamiento de PRIME en su nivel as bajo (capa f´ ısica PHY), es mediante su implementaci´on en c´odigo y la co- rrespondiente simulaci´ on de la transmisi´ on y recepci´on de s´ ımbolos OFDM. En este documento la implementaci´on en c´ odigo se realizar´a mediante el simulador matem´ atico MatLab, y para ello se dividir´ a el sistema de la capa PHY en los di- versos sub-bloques que lo componen vistos en el cap´ ıtulo anterior, concretamente en la figura 2.2 (que corresponde al transmisor). Evidentemente, se desarrollar´ an tambi´ en los bloques rec´ ıprocos del receptor, por ello, en las secciones que a con- tinuaci´ on se desarrollar´ an, los bloques expuestos se implementar´ an con la dupla ”Transmisor-Receptor”, es decir, para un bloque en concreto se desarrollar´ a el odigo implementado en el transmisor y el correspondiente del receptor. La figu- ra 3.1 recoge los diferentes ficheros que compondr´an cada uno de los diferentes sub-bloques, tanto del transmisor y receptor. 3.2. Bloque CRC 3.2.1. Transmisor En el transmisor este bloque se encargar´a del c´ alculo del checksum CRC. Dicho CRCir´a en un campo dela “header” que ocupa 8 bits, por tanto la salida de la funci´on “CRCgenerator.m” tendr´a longitud 8 bits. Como par´ametro de entrada a la funci´ on se tiene el vector de datos que representa los campos de la cabecera que se quieren “proteger”; mediante el polinomio generador del checksum se crea 22

5.CAPITULO 3

Embed Size (px)

DESCRIPTION

señalizacion en telecomunicaciones

Citation preview

Capıtulo 3

Implementacion en MatLab de lacapa PHY PRIME OFDM

3.1. Introduccion

La mejor forma para comprender el funcionamiento de PRIME en su nivelmas bajo (capa fısica PHY), es mediante su implementacion en codigo y la co-rrespondiente simulacion de la transmision y recepcion de sımbolos OFDM. Eneste documento la implementacion en codigo se realizara mediante el simuladormatematico MatLab, y para ello se dividira el sistema de la capa PHY en los di-versos sub-bloques que lo componen vistos en el capıtulo anterior, concretamenteen la figura 2.2 (que corresponde al transmisor). Evidentemente, se desarrollarantambien los bloques recıprocos del receptor, por ello, en las secciones que a con-tinuacion se desarrollaran, los bloques expuestos se implementaran con la dupla”Transmisor-Receptor”, es decir, para un bloque en concreto se desarrollara elcodigo implementado en el transmisor y el correspondiente del receptor. La figu-ra 3.1 recoge los diferentes ficheros que compondran cada uno de los diferentessub-bloques, tanto del transmisor y receptor.

3.2. Bloque CRC

3.2.1. Transmisor

En el transmisor este bloque se encargara del calculo del checksum CRC.Dicho CRC ira en un campo de la “header” que ocupa 8 bits, por tanto la salida dela funcion “CRCgenerator.m” tendra longitud 8 bits. Como parametro de entradaa la funcion se tiene el vector de datos que representa los campos de la cabeceraque se quieren “proteger”; mediante el polinomio generador del checksum se crea

22

Figura 3.1: Esquema de bloques-ficheros.

una estructura “system object”, la cual se puede entender como una caja negra enla que recibe el vector de datos, y a la salida devuelve ese mismo vector seguidode el valor CRC calculado.

1 function [ y ] = CRCgenerator( x )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Bloque del Tx que se encarga del calculo del CRC sobre6 % los siguientes campos de la cabecera: PROTOCOL, LEN,7 % PAD_LEN, MAC_H. En total dichos campos suman 70 bits.8 %9 % Entrada ��> x: Vector que representa los datos a

10 % "proteger".11 % Salida ��> y: El valor CRC calculado (devuelto con una12 % longitud de 8 bits)13 %14 % El polinomio generador es el vector15 % "gen=[1 0 0 0 0 0 1 1 1]".

23

16 %17 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18

19 dat = x’; % Column vector20 gen = [1 0 0 0 0 0 1 1 1];

21

22 hGen = comm.CRCGenerator(gen); % CRC generator system object23 codeword = step(hGen ,dat); % Codeword=[x CRC]24

25 y = codeword(length(x)+1: end)’;

26

27 y = [zeros(1,8-length(y)) y]; % Length(y)=828

29

30 end

3.2.2. Receptor

En el receptor, el bloque CRC sigue una polıtica parecida a la del transmisor:recibe el vector de datos de interes, y con el polinomio generador conocido creauna estructura “system object” que con el vector de datos a la entrada devuelve ala salida el vector “[txerr]”, donde “tx” es el vector de entrada y “err” valdra ”1”en caso de que se haya producido al menos un error, o “0” en caso contrario.

1 function [ tx,err ] = CRCdetector( x )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Bloque del Rx que a partir de la trama HEADER recibida,6 % comprueba su validez y que esté libre de errores.7 %8 % Entrada ��> x: Vector que representa:9 % "[PROTOCOL|LEN|PAD_LEN|MAC_H|CRC_Ctrl|FLUSHING_H]".

10 % | 4 | 6 | 6 | 54 | 8 |<��(bits)11 %12 % Salida ��> y: Devuelve el numero de errores (0 en caso13 % de que no haya).14 %15 % El polinomio generador es el vector16 % "gen=[1 0 0 0 0 0 1 1 1]".17 %18 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%19

24

20 dat = x(1 ,1:78) ’; % Column vector21 gen = [1 0 0 0 0 0 1 1 1];

22

23 hDetect = comm.CRCDetector(gen); % System object24 [tx, err] = step(hDetect , dat); % tx=x(1:70)25 tx = tx ’; % Row vector26

27 end

3.3. Bloque coder/decoder convolucional

3.3.1. Transmisor

En el transmisor, el codificador convolucional se crea mediante una estructuratrellis, a la cual hay que pasarle dos parametros:

La longitud de restriccion o constraint length “k”. Para las caracterısticasdel codificador convolucional de esta especificacion, se tiene una k = 7.

Los polinomios generadores. Teniendo en cuenta que el codificador es de unaproporcion de 1/2, es decir, por cada bit que entra salen dos, es necesario quehaya dos polinomios generadores para cumplir dichas caracterısticas. Estospolinomios son los indicados en el fichero “conv encoder.m”.

1 function [ y ] = conv_encoder( x )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Bloque del Tx que simula el comportamiento de un6 % codificador convolucional. El flujo de bits NO7 % codificados (x) pasan a traves de este bloque para formar8 % un flujo de bits SI codificados (y). La tasa de codigo es9 % de 1/2,los polinomios generadores son gen1=[1 1 1 1 0 0 1]

10 % y gen2=[1 0 1 1 0 1 1], y la longitud del codificador es11 % de k=7.12 %13 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14

15 % gen1 = [1 1 1 1 0 0 1]; %Polinomios generadores16 % gen2 = [1 0 1 1 0 1 1];17

18 k = 7; % Constraint length

25

19

20 % [171 133]Octal �> [gen1 gen2]Bin21 trellis = poly2trellis(k ,[171 133]);

22

23 y = convenc(x,trellis ); % Codificación24

25 end

3.3.2. Receptor

En el receptor se realiza el proceso de decodificacion, el cual se logra median-te el algoritmo de Viterbi implementado en la funcion de MatLab ”vitdec”. Losparametros que se le han pasado son:

in: vector de bits codificados.

trellis: estructura que especifica las caracterısticas del codigo convolucionalutilizado en el transmisor.

tblen: especifica la profundidad de rastreo (traceback depth). Si el ratio delcodigo es de 1/2, un valor tıpico para “talen” es cinco veces el valor de la“constraint length” (k=7). En este caso se pondrıa 35.

trunk: en este campo se indica el modo de operacion del decodificador. En elmodo “trunk” se asume que el codificador ha comenzado en el estado “todoa ceros”. Ademas en este modo no se incurre en ningun retraso.

soft: aquı se especifica que el metodo de decision utilizado por el decodificadores el metodo suave o metodo “soft”

nsdec: este parametro es necesario en el caso de utilizar el metodo de decision“soft”. Aquı se establece el numero de bits de cuantizacion. El maximo es13, por ello se establecera a dicho valor.

1 function [ y ] = conv_decoder( x )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Bloque del Rx que simula el comportamiento de un6 % decodificador convolucional. La decodificación se realiza7 % mediante el algoritmo de Viterbi implementado en la8 % función de MatLab "vitdec".9 %

26

10 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11

12 k=7; % Constraint length13

14 % Soft decision decoding��>13 bits of quantizacion15 nsdec = 13;

16 in = round ((2^ nsdec -1)*x);

17

18 %Polinomios generadores19 % gen1 = [1 1 1 1 0 0 1] (Binario) = 171 (Octal);20 % gen2 = [1 0 1 1 0 1 1] (Binario) = 133 (Octal);21 trellis = poly2trellis(k ,[171 133]); % Estructura decod.22 tblen = 35; % 5⇤k siendo k=7.23

24 y = vitdec(in,trellis ,tblen ,’trunc ’,’soft’,nsdec );

25

26 end

3.4. Bloque Scrambler

3.4.1. Transmisor/Receptor

Este bloque es exactamente el mismo para transmisor y receptor, ya que enel transmisor se hace la XOR con una secuencia “pn”, y en el receptor se vuelve ahacer la XOR con dicha secuencia “pn” para dejarlo en su valor original. Lo quese hace es dividir el flujo de bits de entrada en trozos de 127 bits (en el caso deque la longitud de entrada sea mayor que 127. Se rellena con ceros para que seamultiplo de 127). Posteriormente se realiza la XOR de la secuencia “pn” con cadatrozo.

1 function [ y ] = scrambler( x, pn )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Bloque del Tx que simula el comportamiento de un scrambler.6 % Dicho bloque realiza una "xor" entre el flujo de bits de7 % entrada "x", y una secuencia "pn".8 %9 % pn: secuencia cíclica de 127 bits de longitud generada por

10 % un registro de desplazamiento LFSR.11 %12 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

27

13

14 if(length(x) <= length(pn)) % Si es menor que 12715 pad = length(pn) - length(x);

16 a = [x zeros(1,pad)];

17 y = xor(a,pn);

18 y = y(1: length(pn)-pad);

19 else

20 % Si es mayor, divide "x" en trozos de 127 bits de21 % longitud, siendo el ultimo trozo rellenado con22 % ceros en el caso de que no sea múltiplo de 127.23 Ns = ceil(length(x)/ length(pn));

24 pad = Ns*length(pn) - length(x);

25 p = pn ’*ones(1,Ns);

26 a = [x zeros(1,pad)];

27 a = reshape(a,length(pn),Ns);

28

29 % Se hace la XOR a cada trozo y luego se reorganiza.30 y = xor(a,p);

31 y = reshape(y,1,Ns*length(pn));

32 y = y(1:Ns*length(pn)-pad); % Se quitan los 0’s.33 end

34

35 end

3.5. Bloque Interleaver

3.5.1. Transmisor

En el transmisor el “entrelazamiento” de los bits se produce por trozos, es de-cir, el interleaver actuara en grupos de bits. Ası, si una trama PPDU esta formadapor “Ns” sımbolos, y cada sımbolo esta formado por “Ncbps” bits, el interleaverrealizara el “entrelazamiento” Ns veces a cada conjunto de los Ncbps bits. En elcomienzo del codigo, lo que se hace es hallar los parametros Ncbps y s necesariospara calcular el vector “ind” que es precisamente el indicador del orden de per-mutacion que se producira en los Ncbps de cada uno de los Ns sımbolos. Noteseque se diferencia entre si se trata de la “Header” o la “Payload”.

1 function [ w ] = interleaver( v, Nbpsc_H , Nbpsc_P )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Bloque del Tx que simula el comportamiento de un

28

6 % "interleaver" (intercalador), el cual aleatoriza los7 % errores de bits antes de la decodificacion.8 %9 % v: vector de bits codificados a la entrada del interleaver.

10 % w: vector de bits codificados intercalados a la salida.11 %12 % Nbpsc_H: no de bits por subportadora de la "header".13 % Nbpsc_P: no de bits por subportadora de la "payload".14 %15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16

17 if(Nbpsc_H == 0)

18 % Bits de entrada corresponden a PAYLOAD.19 Nbpsc = Nbpsc_P; % No bits por subportadora.20 Ncbpsc = 2* Nbpsc; % No bits codific. por subp.21 Ncbps = 96* Ncbpsc; % No bits codific. por simb.22 s = 8*(1 + floor(Ncbpsc /2));

23

24 else

25 % Bits de entrada corresponden a HEADER.26 Nbpsc = Nbpsc_H;

27 Ncbpsc = 2* Nbpsc;

28 Ncbps = 84* Ncbpsc;

29 s = 7;

30 end

31

32 Ns = length(v)/ Ncbps; % No de símbolos.33 ind = zeros(1,Ncbps); % Índice de permutación34 % del interleaver.35

36 for k=0:Ncbps -1

37 ind(k+1) = (Ncbps/s) * mod(k,s) + floor(k/(s)) + 1;

38 end

39

40 w = zeros(Ncbps ,Ns);

41 z = reshape(v’,Ncbps ,Ns); % El interleaver actuará42 % sobre cada columna (sobre43 % cada símbolo).44

45 for k=1:Ns

46 w(ind ,k) = z(:,k);

47 end

48

29

49 w = reshape(w,1,Ncbps*Ns); % Se devuelve a vector fila.50

51 end

3.5.2. Receptor

El receptor sigue la misma filosofıa que el transmisor, con la diferencia de queel calculo del vector ‘ınd” sera de tal manera que al aplicarlo se realizara el procesoinverso a la permutacion realizada en el transmisor.

1 function [ v ] = deinterleaver( w, Nbpsc_H , Nbpsc_P )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Bloque del Rx que simula el comportamiento de un6 % "de�interleaver" (des�intercalador), el cual realiza la7 % operacion inversa al "interleaver" reorganizando los bits8 % permutados.9 %

10 % v: vector de bits codificados a la salida del interleaver.11 % w: vector de bits codificados intercalados a la entrada.12 %13 % Nbpsc_H: numero de bits por subportadora de la "header".14 % Nbpsc_P: numero de bits por subportadora de la "payload".15 %16 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17

18 if(Nbpsc_H == 0)

19 % Bits de entrada corresponden a PAYLOAD.20 Nbpsc = Nbpsc_P; % No bits por subportadora.21 Ncbpsc = 2* Nbpsc; % No bits codific. por subp.22 Ncbps = 96* Ncbpsc; % No bits codific. por simb.23 s = 8*(1 + floor(Ncbpsc /2));

24

25 else

26 % Bits de entrada corresponden a HEADER.27 Nbpsc = Nbpsc_H;

28 Ncbpsc = 2* Nbpsc;

29 Ncbps = 84* Ncbpsc;

30 s = 7;

31 end

32

33 Ns = length(w)/ Ncbps; % No de símbolos.

30

34 ind = zeros(1,Ncbps); % Índice de permutación35 % del de�interleaver.36

37 for k=0:Ncbps -1

38 ind(k+1) = s*k - (Ncbps -1)* floor(s*k/Ncbps )+1;

39 end

40

41 v = zeros(Ncbps ,Ns);

42 z = reshape(w’,Ncbps ,Ns); % El de�interleaver actuará43 % sobre cada columna (sobre44 % cada símbolo).45

46 for k=1:Ns

47 v(ind ,k) = z(:,k);

48 end

49

50 v = reshape(v,1,Ncbps*Ns); % Se devuelve a vector fila.51

52

53 end

3.6. Bloque mapper/de-mapper

3.6.1. Transmisor

Este bloque del transmisor esta constituido por el mapper. Se seguiran di-ferentes esquemas de modulacion segun se trate de los pilotos o de la carga util,realizandose una modulacion PSK para unos y DPSK para otros, respectivamen-te. Para ello se creara dos estructuras “system object” que definiran cada una lascaracterısticas del mapper. Puesto que la estructura en la insercion de los pilotoses distinta para la “header” y para la “payload”, se tienen dos ficheros distintos,cada uno con sus propios parametros de entrada. En ambos ficheros se produce unaconversion serie-paralelo (S/P) de los datos de entrada, y a la salida se tiene unamatriz 2⇥97 y Ns⇥97 segun sea el fichero de la header o de la payload. Se puedeapreciar que cada uno de los sımbolos estan compuestos por 97 subportadoras.

1 function [ s ] = SP_h( HEAD ,pn )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Sub�bloque del modulador que agrupa los bits de información6 % codificados de la "header" en dos símbolos, se encarga de

31

7 % la inserción de pilotos y realiza el esquema de modulación8 % adecuado según se trate de bit piloto o bit de la "header".9 %

10 % HEAD: bits codificados de entrada correspondientes a11 % la "header".12 % s: salida ��> 2 símbolos OFDM con 13 pilotos insertados13 % por símbolo.14 %15 % pn: secuencia cíclica de 127 bits de longitud generada por16 % un registro de desplazamiento LFSR. Cada bit de dicha17 % secuencia formará parte de una subportadora�piloto.18 %19 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20

21 header = HEAD;

22 s = zeros (2 ,97);

23

24 % Mapper DPSK, utilizado para los bits de la "header".25 DPSKmod = comm.DPSKModulator (2,0,’BitInput ’,true);

26 % Mapper PSK, utilizado para los bits de la secuencia "pn".27 PSKmod = comm.PSKModulator (2,0,’BitInput ’,true);

28

29 pmap = step(PSKmod ,pn(1)’)’; % Pilot mapped.30 release(PSKmod)

31 xmap = step(DPSKmod ,[pn(1) header (1:7)] ’) ’; % x mapped.32 release(DPSKmod)

33 s(1 ,1:8) = [pmap xmap (2:end)]; % pmap��>BPSK34 % xmap��>DBPSK35

36 for i=2:26

37 % En los 2 símbolos de la cabecera hay 26 pilotos (13+13).38 if(i<13)

39 pmap = step(PSKmod ,pn(i)’)’;

40 release(PSKmod)

41 xmap = step(DPSKmod ,[pn(i) header (7*i -6:7*i)]’)’;

42 release(DPSKmod)

43 s(1 ,1:8*i) = [s(1 ,1:8*(i-1)) pmap xmap (2:end)];

44 elseif(i==13)

45 s(1,:) = [s(1,1:end -1) step(PSKmod ,pn(i)’)’];

46 release(PSKmod)

47 elseif(i==14)

48 pmap = step(PSKmod ,pn(i)’)’;

49 release(PSKmod)

32

50 xmap = step(DPSKmod ,[pn(i),...

51 header (7*(i-1) -6:7*(i-1))]’) ’;

52 release(DPSKmod)

53 s(2 ,1:8) = [pmap xmap (2:end)];

54 elseif ((14<i)&&(i <26))

55 pmap = step(PSKmod ,pn(i)’)’;

56 release(PSKmod)

57 xmap = step(DPSKmod ,[pn(i),...

58 header (7*(i-1) -6:7*(i-1))]’) ’;

59 release(DPSKmod)

60 s(2 ,1:8*(i -13)) = [s(2 ,1:8*(i-14)) pmap xmap (2:end)];

61 else

62 s(2,:) = [s(2,1:end -1) step(PSKmod ,pn(i)’)’];

63 release(PSKmod)

64 end

65

66 end

67

68 end

1 function [ s ] = SP_p( DATA , M, Ns, PROT , pn )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Sub�bloque del modulador que agrupa los bits de6 % información codificados de la "payload" en dos símbolos,7 % se encarga de la inserción de pilotos y realiza el8 % esquema de modulación adecuado según se trate de bit9 % piloto o bit de "payload".

10 %11 % DATA: bits codificados de entrada correspondientes a12 % la "payload".13 % s: salida ��> "Nsimb" símbolos OFDM con un piloto14 % insertado por símbolo.15 %16 % pn: secuencia cíclica de 127 bits de longitud generada por17 % un registro de desplazamiento LFSR. Cada bit de dicha18 % secuencia formará parte de una subportadora�piloto.19 % M = 2,4 o 8 según sea DBPSK, DQPSK o D8PSK, respectiv.20 % Ns: no de símbolos despues de la codificación (si es que21 % se ha realizado).22 % PROT: protocolo utilizado (véase especificación).23 %

33

24 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25

26 if ((PROT == 4) || (PROT == 5) || (PROT == 6))

27 % FEC "ON"28 Nbps_P = length(DATA)/Ns; % No bits por símbolo.29 Nsimb = Ns;

30 else

31 % FEC "OFF"32 Nbps_P = length(DATA)/Ns;

33 Nsimb = Ns;

34 end

35

36 % Mapper DPSK, utilizado para los bits de la "payload".37 DPSKmod = comm.DPSKModulator(M,0,’BitInput ’,true);

38 % Mapper PSK, utilizado para los bits de la secuencia "pn".39 PSKmod = comm.PSKModulator (2,0,’BitInput ’,true);

40

41 s = zeros(Nsimb ,97);

42

43 for i=27:26+ Nsimb

44 % En los "Nsimb" símbolos de la payload hay "Nsimb" pilotos.45 pmap = step(PSKmod ,pn(i)’)’;

46 release(PSKmod)

47

48 if(pn(i) == 1)

49 if(M == 2)

50 px = 1;

51 elseif(M == 4)

52 px = [1 1];

53 else

54 px = [1 1 0];

55 end

56 else

57 if(M == 2)

58 px = 0;

59 elseif(M == 4)

60 px = [0 0];

61 else

62 px = [0 0 0];

63 end

64 end

65

66 xmap = step(DPSKmod ,[px ,...

34

67 DATA(Nbps_P *(i-26) -( Nbps_P -1): Nbps_P *(i-26))] ’) ’;

68 release(DPSKmod)

69 s(i-26,:) = [pmap xmap (2:end)]; % pmap��>BPSK70 % xmap��>M�DPSK71

72 end

73

74 end

3.6.2. Receptor

El receptor al igual que el transmisor estara constituido por dos ficheros segunse trate de header o de la payload (“getH.m” y “getP.m”, resp.). En ambos casosse procedera a la demodulacion y eliminacion de los pilotos, teniendo en cuenta laestructura que se impuso en el lado del transmisor.

1 function [ HEADER ] = getH( x )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Función que se encarga de la obtención de la cabecera.6 % Para ello realiza la demodulacion, eliminación de pilotos7 % y conversión paralelo�serie (P/S).8 %9 % x: Matriz de 2⇤97.

10 %11 % y: Vector de longitud 168.12 %13 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14

15 HEADER = zeros (1 ,168);

16

17 % System object PSK ��> Demodulación BPSK.18 PSKdemod = comm.PSKDemodulator (2,0,’BitOutput ’,true);

19 % System object DPSK ��> Demodulación DBPSK.20 DPSKdemod = comm.DPSKDemodulator (2,0,’BitOutput ’,true);

21

22 % Demodulación del piloto.23 pdemap = step(PSKdemod ,complex(real(x(1,1)),0)’)’;

24 release(PSKdemod)

25 % Demodulación de los datos.26 xdemap = step(DPSKdemod ,[ complex (1-2*pdemap ,0) x(1,2:8)]’) ’;

27 release(DPSKdemod)

35

28

29 HEADER (1 ,1:7) = xdemap(1,log2 (2)+1:8);

30

31 for i=2:26 -2

32 % Eliminación del resto de pilotos (26 pilotos en total, 1333 % por símbolo) y demodulación de los datos.34 if(i<13)

35 pdemap = ...

36 step(PSKdemod ,complex(real(x(1,8*i-7)),0)’)’;

37 release(PSKdemod)

38 xdemap = step(DPSKdemod ,[ complex (1-2*pdemap ,0),...

39 x(1,8*i-6:8*i)]’)’;

40 release(DPSKdemod)

41 HEADER (1 ,1:7*i) = [HEADER (1 ,1:7*(i-1)),...

42 xdemap(1,log2 (2)+1:8)];

43 elseif(i == 13)

44 pdemap = step(PSKdemod ,complex(real(x(2,1)),0)’)’;

45 release(PSKdemod)

46 xdemap = step(DPSKdemod ,[ complex (1-2*pdemap ,0),...

47 x(2 ,2:8)] ’)’;

48 release(DPSKdemod)

49 HEADER (1 ,1:7*i) = [HEADER (1 ,1:7*(i-1)),...

50 xdemap(1,log2 (2)+1:8)];

51 else

52 %((i>13)&&(i<25))53 pdemap = ...

54 step(PSKdemod ,complex(real(x(2,8*(i-12) -7)),0)’) ’;

55 release(PSKdemod)

56 xdemap = step(DPSKdemod ,[ complex (1-2*pdemap ,0),...

57 x(2 ,8*(i-12) -6:8*(i-12))] ’) ’;

58 release(DPSKdemod)

59 HEADER (1 ,1:7*i) = [HEADER (1 ,1:7*(i-1)),...

60 xdemap(1,log2 (2)+1:8)];

61 end

62 end

63

64

65 end

1 function [ y ] = getP( x, M )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %

36

5 % Función que se encarga de la obtención de la carga útil6 % (payload). Para ello realiza la demodulacion, eliminación7 % de pilotos y conversión paralelo�serie (P/S).8 %9 % x: size(x)=[Ns 97] (Ns: número de símbolos OFDM de

10 % payload).11 %12 % y: Vector de longitud Ns⇤96.13 %14 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15

16 Ns = size(x);

17 Ns = Ns(1);

18

19 % System object PSK ��> Demodulación BPSK.20 PSKdemod = comm.PSKDemodulator (2,0,’BitOutput ’,true);

21 % System object DPSK ��> Demodulación DMPSK.22 DPSKdemod = comm.DPSKDemodulator(M,0,’BitOutput ’,true);

23

24 y = zeros(1,Ns*96* log2(M));

25

26 for i=1:Ns

27 % Por cada símbolo se quita la primera subportadora,28 % que corresponde al piloto.29 pdemap = step(PSKdemod ,complex(real(x(i,1)),0)’)’;

30 release(PSKdemod)

31 xdemap = step(DPSKdemod ,[ complex (1-2*pdemap ,0),...

32 x(i,2:end)]’)’;

33 release(DPSKdemod)

34 y(1 ,96* log2(M)*i-96* log2(M)+1:96* log2(M)*i) = ...

35 xdemap(1,log2(M)+1: end);

36 end

37

38

39 end

3.7. Bloque IFFT/FFT

3.7.1. Transmisor

En el transmisor se realizara una IFFT de 512 puntos, mapeando las 97 sub-portadoras que forman cada sımbolo segun la posicion que marca la especificacion

37

PRIME para este caso (las subportadoras iran desde los puntos 87 hasta el 183, ysus conjugados desde 331 hasta la 427).

1 function [ y ] = ifftTx( x )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Bloque del Tx que calcula la Transformada Rápida de6 % Fourier Inversa (IFFT) de la entrada "x". Se realiza una7 % IFFT de 512 puntos, y el mapeo se realiza segun las8 % indicaciones de la especificacion PRIME.9 %

10 % x: matriz de "Nsimb"x"97" (filas X columnas)11 %12 % y: matriz de dimensión "Nsimb x 512".13 %14 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15

16 Ns = length(x(: ,1)); % No símbolos.17 p = zeros(Ns ,512);

18

19 p(: ,87:183) = x;

20 p(: ,331:427) = conj(x(:,end : -1:1));

21

22 y = ifft(p’,512)’;

23

24 end

3.7.2. Receptor

En el receptor se realizara la FFT de la matriz de sımbolos de entrada, yasean de la header o de la payload. Una vez realizada se cogeran los datos que seencuentres en la posicion de interes, que en este caso es desde la 87 hasta la 183.

1 function [ y ] = fftRx( x )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Bloque del Rx que calcula la Transformada Rápida de6 % Fourier (FFT) de la entrada "x". Se realiza una FFT de7 % 512 puntos.8 %9 % x: matriz de datos ��> size(x) = [Nsimb 512].

38

10 %11 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12

13 a = fft(x’,512)’;

14

15 y = a(: ,87:183);

16

17 end

3.8. Bloque prefijo cıclico

3.8.1. Transmisor

La adicion de un prefijo cıclico en el transmisor se realiza en un sencillo codigo:se copian las ultimas 48 muestras de cada sımbolo, y estas se anexan al principiode cada uno de los dichos sımbolos, respectivamente.

1 function [ y ] = cpTx( x )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Bloque del Tx que crea un prefijo cíclico "Ncp" de 486 % muestras, las cuales se copian del final de la trama y7 % se "adjunta" al principio de ésta.8 %9 % x: matriz de entrada ��> size(x) = [Ns 560].

10 %11 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12

13 % Numero de simbolos OFDM (header + payload).14 Ns = length(x(: ,1));

15

16 % Se copian las últimas 48 muestras y se anexionan17 % al principio del vector.18 y = [x(: ,512 -47:512) x(: ,1:512)];

19

20 % Conversión paralelo�serie (P/S)21 y = reshape(y’,1,Ns *560);

22

23 end

39

3.8.2. Receptor

En el receptor se seguira el proceso inverso: cuando se reciban los sımbolossimplemente se desecharan las primeras 48 muestras de cada sımbolo.

1 function [ y ] = cpRx( x )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Bloque del Rx que quita el prefijo cíclico creado en el6 % bloque del Tx. Realiza también la conversión7 % serie�paralelo (S/P).8 %9 % x: vector fila de longitud "Ns"x"560".

10 % y: size(y)=[Ns 512].11 %12 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13

14 Ns = length(x)/560; % No simbolos: 512 + 48.15

16 a = reshape(x,560,Ns)’; % Conversión serie�paralelo.17 y = a(: ,49:end); % Quito el CP de todos los18 % símbolos (vect. fila).19

20 end

3.9. Conexion de los bloques

3.9.1. Transmisor

Antes de ver como se hara la conexion de todos los bloques del transmisorvistos anteriormente, hay que recordar que a la salida del transmisor debe de haberun no entero de sımbolos OFDM. Para lograr tal fin, es necesario realizar lo quese conoce como proceso de “padding”.

Proceso de “padding” en el transmisor

El proceso de “padding” tiene como funcion introducir un numero de bits derelleno (ceros) adicionales a los bits de datos (payload), con el fin de que a lasalida del transmisor haya un numero entero de sımbolos OFDM. Para empezar,se calcula el no de bits Nbps P que habra por sımbolo OFDM, y a partir de esto, essimplemente asegurarse de que la longitud de la “payload” (longitud de la MSDU

40

mas ocho bits a cero de “flushing”) es multiplo de Nbps P. Para ello, se puedendar tres situaciones:

Longitud de payload es menor que Nbps P : simplemente se rellenan con ceroshasta Nbps P.

Longitud de payload es igual que Nbps P : no se rellena nada.

Longitud de payload es mayor que Nbps P : se rellena con ceros hasta conse-guir el multiplo de Nbps P.

En el proceso la funcion devuelve el no de sımbolos enviados antes de la codifi-cacion (“LEN”), y finalmente se devuelve el valor en bytes del no de bits de rellenoinsertado (“PAD LEN”) y se devuelve tambien el vector “PAYLOAD”, con susbits de relleno ya insertados.

1 function [ PAYLOAD ,PAD_LEN ,LEN ] = pad( MSDU , Nbpsc_P ,PROT)

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Función que se encarga de realizar el proceso de PADDING,6 % con el fin de asegurar que el numero de bits (codificados)7 % generados, rellenan el hueco adecuado hasta formar un8 % numero entero de simbolos OFDM. Estos bits de relleno son9 % añadidos antes de la codificacion (en el caso de que

10 % hubiera).11 %12 % A parte de los bits referidos a la MSDU, hay que tener en13 % cuenta los 8 bits adicionales del FLUSHING_P.14 %15 % y(1,:) = PAYLOAD: [MSDU FLUSHING_P PAD]16 %17 % y(2,1:6) = PAD_LEN: vector de 6 bits que indica en bytes18 % el numero de bits de relleno insertados en el19 % proceso de PADDING.20 %21 % y(3,1:6) = LEN: vector de 6 bits que indica la longitud22 % de payload en simbolos OFDM (before coding).23 %24 % IMPORTANTE!! ��> Se sabe que la MSDU tiene que ser25 % multiplo de 8.26 %27 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%28

29 FLUSHING_P = [0 0 0 0 0 0 0 0];

41

30 PAD_LEN = zeros (1,6);

31 LEN = [0 0 0 0 0 0];

32

33 Nbps_P = 96* Nbpsc_P; % Numero bits por simbolo OFDM.34

35 if ((PROT == 4) || (PROT == 5) || (PROT == 6)) % FEC "ON"36 Nbps_P = 2* Nbps_P;

37 end

38

39 if (length(MSDU )+8 < Nbps_P)

40 PAD = Nbps_P - length(MSDU) - 8; % ... � 8 ��> FLUSH.41 n = PAD/8;

42 PAD = zeros(1,PAD);

43 LEN = [0 0 0 0 0 1];

44 elseif (length(MSDU )+8 == Nbps_P)

45 n = 0;

46 PAD = [];

47 LEN = [0 0 0 0 0 1];

48 else

49 aux = ceil(( length(MSDU )+8)/ Nbps_P );

50 if(aux >63)

51 disp(’ERROR LONGITUD MSDU’)

52 end

53 PAD = aux*Nbps_P - length(MSDU) - 8;

54 n = PAD/8;

55 PAD = zeros(1,PAD);

56

57 % Se pasa a binario58 m = dec2bin(aux ,6);

59

60 % Se actualiza el valor de LEN61 LEN(1) = str2double(m(1));

62 LEN(2) = str2double(m(2));

63 LEN(3) = str2double(m(3));

64 LEN(4) = str2double(m(4));

65 LEN(5) = str2double(m(5));

66 LEN(6) = str2double(m(6));

67 end

68

69 % Se pasa a binario70 n = dec2bin(n,6);

71

72 % Se actualiza el valor de PAD_LEN

42

73 PAD_LEN (1) = str2double(n(1));

74 PAD_LEN (2) = str2double(n(2));

75 PAD_LEN (3) = str2double(n(3));

76 PAD_LEN (4) = str2double(n(4));

77 PAD_LEN (5) = str2double(n(5));

78 PAD_LEN (6) = str2double(n(6));

79

80 PAYLOAD = [MSDU FLUSHING_P PAD];

81

82 end

Union de sub-bloques

En primer lugar hay que asegurarse de que la longitud de la MSDU pasadacomo parametro de entrada tiene que ser multiplo de 8. Una vez que se cumple, losiguiente es obtener los valores de M (valdra 2,4 o 8 segun sea DBPSK, DQPSKo D8PSK, resp.) y el no de bits por subportadora Nbpsc, en funcion del parame-tro de entrada ”PROT”. Posteriormente se llama a la funcion que se encarga derealizar el proceso de “padding” visto en fichero “pad.m” de arriba; dicha funcionme devolvera los vectores de interes “LEN” y “PAD LEN” que formaran parte delos campos de mismo nombre de la header, y el vector de datos “PAYLOAD”.

A continuacion se pasa el vector “PAYLOAD” por el codificador convolucionalsi procede (si FEC a “ON”), y si lo hace se multiplica por dos el valor de “LEN”,pues ahora se cuenta con el doble de sımbolos. En este punto del codigo ya setienen los campos necesarios de la header para calcula su checksum CRC, y finali-zado el calculo de este ya se tiene por finalizado todos los campos que componenla header, por lo que se puede proceder a pasarlo por el codificador convolucional.

Posteriormente “entra en accion” el sub-bloque del scrambler, pero antes es ne-cesario definir el registro de desplazamiento de 7 bits LFSR que creara la secuenciacıclica necesaria para la utilizacion del scrambler: la secuencia “pn”. Ademas, di-cha secuencia sera aprovechada tambien para la creacion de los pilotos en el bloquede modulacion. Una vez que se ha pasado por el scrambler tanto el vector headercomo el vector PAYLOAD, si la FEC esta a “ON” el vector PAYLOAD se pa-sara adicionalmente por el interleaver, en caso contrario solo lo hara la header.

Es el momento para la insercion de los pilotos y la modulacion de la headery PAYLOAD. Con esto se aprovechara para realizar una conversion serie-paralelo(S/P) de los sımbolos, para posteriormente realizarles la IFFT. Todo esto se hacecomo ya se explico en el punto 3.6 en los ficheros “SP h.m” y “SP p.m”. Una

43

vez hecho lo anterior, se concatenan la header y la PAYLOAD, obteniendose unamatriz en la que las dos primeras filas corresponden a los dos sımbolos de la header,y el resto de filas a los sımbolos de la PAYLOAD.

A continuacion se pasa al dominio del tiempo al realizarse la IFFT de la ma-triz anterior. Tras esto, se anade un prefijo cıclico a cada sımbolo y se realiza laconversion paralelo-serie (P/S).

1 function [ PhyFrame ,h_tx ] = tx( MSDU , MAC_HEAD , PROT )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Especificacion de la capa fisica (PHY Layer) OFDM PRIME6 % del Tx.7 %8 % PROT:0(DBPSK), 1(DQPSK), 2(D8PSK), 4(DBPSK_F), 5(DQPSK_F),9 % 6(D8PSK_F)

10 % El sufijo "_F" significa FEC a "ON".11 %12 % Nbpsc_H: Numero bits por subportadora en la cabecera13 % (Header). Tiene un valor fijado e igual a 0.5.14 % Nbpsc_P: Numero bits por subportadora en la carga util15 % (Payload). Varia en funcion de la modulacion16 % utilizada (DBPSK, DQPSK o D8PSK) y si los bits17 % han pasado por el "convolutional encoder"(ON o18 % OFF):19 % � DBPSK/ON ��> Nbpsc_P=0.5 | DBPSK/OFF ��> Nbpsc_P=120 % � DQPSK/ON ��> Nbpsc_P=1 | DQPSK/OFF ��> Nbpsc_P=221 % � D8PSK/ON ��> Nbpsc_P=1.5 | D8PSK/OFF ��> Nbpsc_P=322 %23 % M = 2, 4 o 8 segun sea DBPSK, DQPSK o D8PSK,24 % respectivamente.25 %26 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%27

28 if(mod(length(MSDU),8) ~= 0)

29 disp(’ERROR MSDU: longitud tiene que ser multiplo de 8’);

30 else

31 if (PROT == 0)

32 % Campo de cabecera (protocolo utilizado:DBPSK)33 PROTOCOL = [0 0 0 0];

34 % Numero de bits por subportadora en payload.35 Nbpsc_P = 1;

36 M = 2;

44

37 elseif (PROT == 1)

38 PROTOCOL = [0 0 0 1]; % DQPSK39 Nbpsc_P = 2;

40 M = 4;

41 elseif (PROT == 2)

42 PROTOCOL = [0 0 1 0]; % D8PSK43 Nbpsc_P = 3;

44 M = 8;

45 elseif (PROT == 4)

46 PROTOCOL = [0 1 0 0]; % DBPSK47 Nbpsc_P = 0.5;

48 M = 2;

49 elseif (PROT == 5)

50 PROTOCOL = [0 1 0 1]; % DQPSK51 Nbpsc_P = 1;

52 M = 4;

53 elseif (PROT == 6)

54 PROTOCOL = [0 1 1 0]; % D8PSK55 Nbpsc_P = 1.5;

56 M = 8;

57 else

58 disp(’Error: PROT = 0/1/2/4/5/6 ’);

59 end

60

61 % Puesta a punto de la trama de carga util (payload) y62 % cabecera (header).63 % En la funcion "pad" se tiene en cuenta el campo64 % "FLUSHING_P".65 [PAYLOAD ,PAD_LEN ,LEN] = pad(MSDU ,Nbpsc_P ,PROT);

66

67 % PAYLOAD = [MSDU FLUSHING_P PAD]68 % PAD ��> Longitud de "PAD" en bytes (before coding).69 % LEN ��> Longitud en simbolos OFDM (before coding).70

71 % Si FEC "ON" ��> Se pasa payload por el convolutional72 % encoder.73 if ((PROT == 4) || (PROT == 5) || (PROT == 6))

74 PAYLOAD = conv_encoder(PAYLOAD );

75 end

76

77 if ((PROT == 4) || (PROT == 5) || (PROT == 6))

78 % FEC "ON"79 if (LEN(1,1) == 1)

45

80 disp(’ERROR LENGTH MSDU: demasiado grande.’)

81 end

82 % Longitud en simbolos OFDM (after coding): el doble.83 LEN = [LEN (2:6) 0];

84 end

85

86 % Numero de simbolos (payload)87 Ns = (2^5)* LEN (1)+(2^4)* LEN (2)+(2^3)* LEN (3)+ ...

88 (2^2)* LEN (4)+(2^1)* LEN (5)+(2^0)* LEN (6);

89

90 % Primeros 54 bits de la cabecera MAC.91 MAC_H = MAC_HEAD;

92 % Para dejar a 0 el registro del encoder.93 FLUSHING_H = zeros (1 ,6);

94

95 % Cálculo del CRC96 CRC_Ctrl = CRCgenerator ([ PROTOCOL LEN PAD_LEN MAC_H ]);

97

98 header = [PROTOCOL LEN PAD_LEN MAC_H CRC_Ctrl ,...

99 FLUSHING_H ];

100 h_tx = header; % Información de la header.101

102 % Se pasa la header por el coder.103 header = conv_encoder(header );

104

105 % LFSR (registro de desplazamiento de 7 bits)106 reg = ones (1,7);

107 pn = zeros (1 ,127);

108 for i=1:1: length(pn)

109 pn(i) = xor(reg(4),reg (7));

110 reg = [pn(i) reg(1:end -1)];

111 end

112 % Ya se tiene la secuencia de interés: "pn".113

114 % Scrambling & Interleaving (Interleaving solo si115 % FEC a "ON")116 if ((PROT == 4) || (PROT == 5) || (PROT == 6))

117 % FEC "ON"118 header = scrambler(header ,pn);

119 header = interleaver(header ,0.5 ,0);

120 PAYLOAD = scrambler(PAYLOAD ,pn);

121 PAYLOAD = interleaver(PAYLOAD ,0,Nbpsc_P );

122 else

46

123 %FEC "OFF"124 header = scrambler(header ,pn);

125 header = interleaver(header ,0.5 ,0);

126 PAYLOAD = scrambler(PAYLOAD ,pn);

127 end

128

129 % Convertidor Serie�Paralelo(S_P) & Mapper130 % & Insercion de pilotos131 s_H = SP_h(header ,pn); % Header132 s_P = SP_p(PAYLOAD ,M,Ns ,PROT ,pn); % Payload133 s = [s_H;s_P];

134

135 % IFFT136 s = ifftTx(s);

137

138 % Prefijo cíclico & Convertidor Paralelo�Serie(P/S)139 s = cpTx(s);

140

141 PhyFrame = s;

142

143 pic(PhyFrame );

144

145 % % Preámbulo146 % t = 0:1e�9:2048e�6;147 % f_0 = 41992; % Start frecuency (Hz)148 % f_f = 88867; % Final frecuency (Hz)149 % T = 2048e�6; % us150 % mu = (f_f�f_0)/T;151 % s_ch = cos(2⇤pi⇤(f_0⇤t + 1./(2⇤mu⇤(t.^2))));152 %153 % % PHY Frame154 % PhyFrame = [s_ch s];155 end

156

157 end

3.9.2. Receptor

Lo primero que se hace en el receptor cuando se recibe la Phy Frame es qui-tar los prefijos cıclicos de cada uno de los sımbolos recibidos. Aprovechando estoultimo se precede a la conversion serie-paralelo (S/P) de los sımbolos recibidos, detal manera que con la matriz obtenida se realiza una FFT de 512 puntos, pasando

47

de esta forma al dominio de la frecuencia.

La siguiente parte consiste en la obtencion de la cabecera, para ello se demodu-lan los datos, eliminan los pilotos y se realiza la conversion P/S (archivo ”getH.m”)y a la salida tenemos un vector fila de 168 bits de longitud. Dicho vector se pasapor el de-interleaver, luego por el scrambler (previamente se crea la secuencia “pn”definiendo el LFSR, como en el transmisor) y posteriormente por el decoder. Eneste punto ya se dispone de la header y lo siguiente antes de obtener sus campos,es comprobar que esta libre de errores. En el caso de que este libre de errores, seprocede a obtener cada uno de sus campos de interes: del campo PROTOCOL sededuce el numero de bits por subportadora Nbpsc P y la M (DBPSK, DQPSK oD8PSK), se lee la longitud de los bits de relleno de PAD LEN y se leen los datosreferente a la MAC HEADER.

A continuacion se obtienen los datos pertenecientes a la PAYLOAD llamando ala funcion “getP”, y una vez conseguido se pasan los datos por el interleaver (solosi FEC a “ON”), el scrambler y el decoder (el decoder solo si FEC a “ON”). Final-mente se quitan los bits de relleno teniendo en cuenta el valor leıdo en PAD LEN.

1 function [ MSDU_rx ,MH_rx ,HEADER_rx ] = rx( PhyFrame )

2

3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 %5 % Especificacion de la capa fisica (PHY Layer) OFDM PRIME6 % del Tx.7 %8 % PROT:0(DBPSK), 1(DQPSK), 2(D8PSK), 4(DBPSK_F), 5(DQPSK_F),9 % 6(D8PSK_F)

10 % El sufijo "_F" significa FEC a "ON".11 %12 % Nbpsc_H: Numero bits por subportadora en la cabecera13 % (Header). Tiene un valor fijado e igual a 0.5.14 % Nbpsc_P: Numero bits por subportadora en la carga util15 % (Payload). Varia en funcion de la modulacion16 % utilizada (DBPSK, DQPSK o D8PSK) y si los bits17 % han pasado por el "convolutional encoder"(ON o18 % OFF):19 % � DBPSK/ON ��> Nbpsc_P=0.5 | DBPSK/OFF ��> Nbpsc_P=120 % � DQPSK/ON ��> Nbpsc_P=1 | DQPSK/OFF ��> Nbpsc_P=221 % � D8PSK/ON ��> Nbpsc_P=1.5 | D8PSK/OFF ��> Nbpsc_P=322 %23 % M = 2, 4 o 8 segun sea DBPSK, DQPSK o D8PSK,24 % respectivamente.

48

25 %26 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%27

28 % Prefijo cíclico & Convertidor Serie�Paralelo(S/P).29 s = cpRx(PhyFrame );

30

31 % FFT32 s = fftRx(s); % size(s)=[Nsimb(header+data) 97].33

34 % Obtención de la cabecera (HEADER).35 HEADER = getH(s(1:2 ,:));

36

37 % Se reorganizan los bits conmutados por el interleaver.38 HEADER = deinterleaver(HEADER ,0.5 ,0);

39

40 % Registro de desplazamiento LFSR.41 reg = ones (1,7);

42 pn = zeros (1 ,127);

43 for i=1:1: length(pn)

44 pn(i) = xor(reg(4),reg (7));

45 reg = [pn(i) reg(1:end -1)];

46 end

47 % Ya se tiene la secuencia de interés: "pn".48

49 % Se pasa por el scrambler.50 HEADER = scrambler(HEADER ,pn);

51

52 % Se procede a su decodificación.53 HEADER = conv_decoder(HEADER );

54

55

56 % Comprobación de errores en la cabecera57 [result ,err] = CRCdetector(HEADER ); % result=HEADER(1:70)58 if(err ~= 0) % Hay al menos un error.59 disp(’ERROR CRC’);

60 HEADER_rx = HEADER;

61 MSDU_rx = -1;

62 MH_rx = -1;

63 else

64 % Obtención de los campos de la cabecera:65 % PROTOCOL,LEN,PAD_LEN,MAC_H66 PROTOCOL = result (1 ,1:4);

67 PROTOCOL = (2^3)* PROTOCOL (1) + (2^2)* PROTOCOL (2) + ...

49

68 (2^1)* PROTOCOL (3) + (2^0)* PROTOCOL (4);

69 if (PROTOCOL == 0) % Campo de cabecera (DBPSK)70 Nbpsc_P = 1; % No de bits por subportadora.71 M = 2;

72 elseif (PROTOCOL == 1) % DQPSK73 Nbpsc_P = 2;

74 M = 4;

75 elseif (PROTOCOL == 2) % D8PSK76 Nbpsc_P = 3;

77 M = 8;

78 elseif (PROTOCOL == 4) % DBPSK79 Nbpsc_P = 0.5;

80 M = 2;

81 elseif (PROTOCOL == 5) % DQPSK82 Nbpsc_P = 1;

83 M = 4;

84 elseif (PROTOCOL == 6) % D8PSK85 Nbpsc_P = 1.5;

86 M = 8;

87 else

88 disp(’Error: PROT = 0/1/2/4/5/6 ’);

89 M = 2;

90 end

91

92 % Se lee la longitud de relleno.93 PAD_LEN = result (1 ,11:16);

94 PAD_LEN = (2^5)* PAD_LEN (1) + (2^4)* PAD_LEN (2) + ...

95 (2^3)* PAD_LEN (3) + (2^2)* PAD_LEN (4) + ...

96 (2^1)* PAD_LEN (5) + (2^0)* PAD_LEN (6);

97 % Se obtienen los datos de MAC_HEADER98 MH_rx = result (1 ,17:70);

99

100 % Obtención de la payload & Convertidor101 % Paralelo�Serie del payload (P/S)102 PAYLOAD = getP(s(3:end ,:),M);

103

104 % Se reorganizan los bits conmutados por el105 % interleaver (si FEC ON)106 if (( PROTOCOL ==4)||( PROTOCOL ==5)||( PROTOCOL ==6))

107 PAYLOAD = deinterleaver(PAYLOAD ,0,Nbpsc_P );

108 end

109

110 % Se pasa por el scrambler

50

111 PAYLOAD = scrambler(PAYLOAD ,pn);

112

113 % Se procede a su decodificación (si FEC a ON)114 if (( PROTOCOL ==4)||( PROTOCOL ==5)||( PROTOCOL ==6))

115 PAYLOAD = conv_decoder(PAYLOAD );

116 end

117

118 % Se quita el relleno metido en la carga útil.119 PAD_LEN = PAD_LEN *8; % Se pasa a número de bits.120 % Hay que tener en cuenta los 8 bits de FLUSHING_P121 MSDU_rx = PAYLOAD (1,1:end -PAD_LEN -8);

122 HEADER_rx = HEADER;

123

124 end

125

126 end

3.10. Simulacion del modelo

Para comprobar el correcto funcionamiento del modelo implementado, se reali-zara como ejemplo una transmision DBPSK sin pasar por el codificador (FECa “OFF”). Lo primero de todo es crear los vectores de datos correspondientesa la MSDU y MAC HEADER, que contienen la informacion de interes. Para ellomediante la funcion randi se generan un flujo de bits aleatorios que simularan lainformacion contenida en dichos vectores.

Notese que la longitud de la MAC HEADER por exigencias de la especificaciontiene que ser igual a 54. Por otro lado, la longitud de la MSDU es indiferente paraesta simulacion, siempre y cuando esta sea multiplo de 8 y no sea tan grande queproduzca un numero de sımbolos mayor a 63. Para este caso se ha escogido unalongitud igual a 5760 bits, de tal manera que teniendo en cuenta que se usa unaDBPSK con FEC a “OFF”, el numero de bits por subportadora sera Nbpsc = 1.Para comprobar que es menor que 63, se hacen unos sencillos calculos:

Nbps = 96 ·Nbpsc; (No bits por sımbolo)

5760 + 8 = 5768 > Nbps = 96 ! Nsimb =

⇠5768

96

⇡= 61 < 63;

Npad = 61 · 96� 5768 = 88;

(3.1)

51

Es decir, si se le pasa a la capa PHY del transmisor una MSDU de 5760 bitsde longitud, esto equivaldrıa a mandar 61 sımbolos OFDM, con 88 bits de rellenoen el ultimo sımbolo. Por tanto, la longitud de 5760 es un buen ejemplo de mues-tra, pues es multiplo de 8 y equivale a mandar menos de 63 sımbolos teniendo encuenta que se usa una DBPSK con FEC a “OFF”.

Una vez tenemos la MSDU y MAC HEADER, el unico parametro que faltapor pasarle a la funcion del transmisor de la capa PHY es alguno de los protocolosque aparecen en el cuadro 3.1 :

Cuadro 3.1: Equivalencia PROTOCOL y esquema de transmision. En amarillo elutilizado para el ejemplo.

PROTOCOL Esquema de Tx0 DBPSK1 DQPSK2 D8PSK4 DBPSK F5 DQPSK F6 D8PSK F

Donde el sufijo “ F” significa FEC a “ON”. Como para este ejemplo se hadicho que se va a utilizar una DBPSK con FEC a “OFF”, se utilizara por tantoPROTOCOL = 0. Pasandole los tres parametros a la funcion tx.m:

A la salida del transmisor se tendra un conjunto de 61 sımbolos OFDM referidosa los datos mas 2 sımbolos OFDM correspondiente a la cabecera, es decir, 63sımbolos en total cuya representacion tanto en el dominio frecuencial como en eltemporal es la mostrada en figura 3.2. 1

1Ver anexo para el codigo que dibuja en el dominio temporal y frecuencial.

52

(a) Dominio del tiempo.

(b) Dominio de la frecuencia.

Figura 3.2: Salida de la funcion “tx.m”.

53

Teniendo en cuenta que por cada sımbolo OFDM hay 560 muestras, a la entradadel receptor llegaran 63 ·560 = 35280 muestras, que son las que estan almacenadasen el vector “s tx”. Una vez que se le pase al receptor el parametro “s tx”, en el ex-tremo seran devueltos los vectores de informacion MSDU rx y MAC HEADER rx,que son los datos que se pasaran a la capa superior a PHY.

Para comprobar que el sistema Tx-Rx funciona correctamente, se comparamuestra a muestra entre lo que se envio y lo devuelto por rx.m: valdra “1” si lasdos muestras son iguales, y “0” en caso contrario. Si se suma el resultado de todasesas comparaciones, se tendra que obtener, si todo esta correcto, la longitud delvector comparado (por un lado el de la MSDU y por otro el de la MAC HEADER).

54