Vous êtes sur la page 1sur 11

LABORATORIO DE TRATAMIENTO DE SEALES III

TELEVISIN DIGITAL TERRESTRE


LABORATORIO 1 - VERSIN 2.0 - ENERO/2013
UNIVERSIDAD DE ANTIOQUIA
FACULTAD DE INGENIERA
INGENIERA DE TELECOMUNICACIONES
TRATAMIENTO DE SEALES III
LABORATORIO 1
TELEVISIN DIGITAL TERRESTRE

JUSTIFICACIN
La televisin digital es el resultado de la aplicacin de tecnologas digitales sobre la seal de televisin,
siendo transmitida de forma inalmbrica terrestre en las bandas VHF y UHF, bandas C, Ku y Ka para
transmisin satelital, o travs de medios guiados. La televisin digital permite debido a su codificacin, y
comparada con su predecesora -la analgica-, tener un nmero mayor de canales y mejor uso del
espectro electromagntico, obtener una mejor calidad en la imagen y el sonido recibidos, incluso,
recibir informacin generada y/o solicitada por el usuario. Adicionalmente, ofrece interoperabilidad con
otros sistemas de comunicaciones, permitiendo el despliegue de servicios interactivos multimedia.
Todas estas caractersticas la convierten en un gran desarrollo tecnolgico que revoluciona la
transmisin de la informacin audiovisual, adems de generar una nueva concepcin de los sistemas de
televisin, presentndonos un nuevo paradigma para los mismos.

OBJETIVOS
1.

2.

Conocer de forma bsica las tcnicas utilizadas en la codificacin de imgenes, especficamente el


estndar JPEG, utilizado en la construccin del fotogramas en el estndar de video MPEG-2,
utilizado por estndar de televisin digital europeo (DVB-T) adoptado por Colombia, como entrada
de video digital.
Verificar la compresin en los datos de la fuente.

ENTREGABLES
1.

Simulacin, archivos de imagen y cdigo en matlab funcional, debidamente comentado y


presentado al docente en el transcurso de la prctica.

TEORA
El estndar de televisin digital terrestre europeo, conocido como DVB-T, est especificado en la norma
ETSI EN 300 744, cuya ltima revisin es la 1.5.1 de junio de 2004. En dicho documento se especifican la
estructura de datos, la codificacin de canal y la modulacin utilizados por DVB-T. El estndar define el
bloque funcional de dispositivos destinados a la adaptacin de seales de televisin en banda base, cuya
entrada y salida son streams de transporte MPEG-2, para ser adaptadas a las caractersticas del canal
terrestre. El estndar de video MPEG-2 utiliza fotogramas JPEG para construir el stream de video.
Como primer paso en la codificacin de los datos de la fuente, y para eliminar informacin redundante
del espacio RGB (colores), se utiliza el espacio YCbCr (luminancia - crominancia). Si la imagen tiene
relacin de aspecto diferente de 16:9, se completa el resto del fotograma con informacin del color
negro. La transformacin entre estos espacios es lineal. Las ecuaciones matriciales de transformacin
son las siguientes:

Ingeniera de telecomunicaciones

LABORATORIO DE TRATAMIENTO DE SEALES III


TELEVISIN DIGITAL TERRESTRE
LABORATORIO 1 - VERSIN 2.0 - ENERO/2013

Luego de transformado el espacio, se utiliza el esquema de digitalizacin de imgenes 4:2:0, el cual es el


primer paso en la compresin de la informacin de las imgenes.

Seguidamente, la imagen es dividida en bloques de 8x8 pixeles, para luego aplicarles la transformada
discreta del coseno bidimensional (DCT). La DCT es un operador lineal, de la forma:

Donde f es el bloque 8x8 pixeles y A es la matriz de transformacin, cuyas componentes vienen dadas
por:

Con N=8, e i=0,1,2,,7. La matriz de cuantizacin que utiliza el estndar JPEG es:

El clculo de la matriz cuantizada, se efecta mediante la divisin coeficiente a coeficiente de las


matrices T y DCTQ respectivamente:
Ingeniera de telecomunicaciones

LABORATORIO DE TRATAMIENTO DE SEALES III


TELEVISIN DIGITAL TERRESTRE
LABORATORIO 1 - VERSIN 2.0 - ENERO/2013

Seguidamente, se crea un vector a partir de la anterior matriz, leyndolo de la siguiente forma:

Para finalizar, como indicador de fin de archivo, se utiliza la palabra de 16 bits 0xffd9.

PREINFORME
Conseguir de internet alguna imagen en formato RGB (imagen no comprimida, *.bmp, *.tiff, etc).

PROCEDIMIENTO
IDENTIFICACIN DE LAS DIFERENTES TCNICAS DE COMPRESIN UTILIZADAS EN
JPEG
En el script dado en el adjunto, comente cada una de las funciones que tiene, identificando que
procedimiento del estndar ejecuta.

COMPRESIN DE LA IMAGEN EN FORMATO RGB A JPEG


Ejecute el script de matlab presentado en el anexo, ingresando como parmetro la imagen solicitada en
el preinforme. Verifique que se haya almacenado y comprimido correctamente dicha imagen abrindola
con algn visor de imgenes, verificando su extensin y comparando el tamao de la imagen original
con el de la nueva imagen.

METADATOS DE LA IMAGEN
Introduzca el nombre de alguno de los integrantes del equipo como autor de la imagen.

REFERENCIAS
[1]. http://www.videotechnology.com/jpeg/j1.html

Ingeniera de telecomunicaciones

LABORATORIO DE TRATAMIENTO DE SEALES III


TELEVISIN DIGITAL TERRESTRE
LABORATORIO 1 - VERSIN 2.0 - ENERO/2013

ANEXO
SCRIPT DE CODIFICACIN JPEG
function encodeimage(inputfile, outputfile)
[data, map] = imread(inputfile);
if ~isempty(map)
data = ind2rgb(data, map);
end
data = im2uint8(data);
adjustedImage = adjustimage(data);
yCbCrImage = rgb2ycbcr(adjustedImage);
grayscaleImage = yCbCrImage(:, :, 1);
offsetedImage = double(grayscaleImage) - 128;
imageBlocks = divideimage(offsetedImage);
transformedBlocks = transformblocks(imageBlocks);
quantizedBlocks = quantizeblocks(transformedBlocks);
reorderedBlocks = reorderblocks(quantizedBlocks);
codedData = huffmanencode(reorderedBlocks);
paddedData = paddingandbytestuffing(codedData);
decimalData = bin2decimalvector(paddedData);
[m, n, ~] = size(grayscaleImage);
writeimage(decimalData, m, n, outputfile);
end
%-------------------------------------------------------------------function [aimage] = adjustimage(image)
[m, n, ~] = size(image);
nRows = roundtom(m, 72);
nColumns = 16 * (nRows / 9);
if (nRows ~= m)
filler1 = zeros(floor((nRows - m) / 2), n, 3);
filler2 = zeros(ceil((nRows - m) / 2), n, 3);
image = cat(1, filler1, image, filler2);
end
if (nColumns ~= n)
filler1 = zeros(nRows, floor((nColumns - n) / 2), 3);
filler2 = zeros(nRows, ceil((nColumns - n) / 2), 3);
image = cat(2, filler1, image, filler2);
end
aimage = image;
end
%-------------------------------------------------------------------function [multiple] = roundtom(num, n)
remainder = rem(num, n);
if (remainder == 0)
multiple = num;

Ingeniera de telecomunicaciones

LABORATORIO DE TRATAMIENTO DE SEALES III


TELEVISIN DIGITAL TERRESTRE
LABORATORIO 1 - VERSIN 2.0 - ENERO/2013
else
multiple = num + n - remainder;
end
end
%-------------------------------------------------------------------function [blocks] = divideimage(image)
[m, n, ~] = size(image);
nRows = m / 8;
nColumns = n / 8;
k = 1;
blocks = cell(1, nRows * nColumns);
for i = 1:nRows
for j = 1:nColumns
blocks{k} = image((i * 8 - 7):i * 8, (j * 8 - 7):j * 8);
k = k + 1;
end
end
end
%-------------------------------------------------------------------function [tblocks] = transformblocks(blocks)
nBlocks = length(blocks);
tblocks = cell(1, nBlocks);
for i = 1:nBlocks
tblocks{i} = dct2(blocks{i});
end
end
%-------------------------------------------------------------------function [qblocks] = quantizeblocks(blocks)
nBlocks = length(blocks);
qblocks = cell(1, nBlocks);
Q = [16 11 10 16 24 40 51 61
12 12 14 19 26 58 60 55
14 13 16 24 40 57 69 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99];
for i = 1:nBlocks
qblocks{i} = round(blocks{i}./Q);
end
end
%-------------------------------------------------------------------function [rblocks] = reorderblocks(blocks)
nBlocks = length(blocks);
order = [1 9 2 3 10 17 25 18 11 4 5 12 19 26 33 ...
41 34 27 20 13 6 7 14 21 28 35 42 49 57 50 ...

Ingeniera de telecomunicaciones

LABORATORIO DE TRATAMIENTO DE SEALES III


TELEVISIN DIGITAL TERRESTRE
LABORATORIO 1 - VERSIN 2.0 - ENERO/2013
43 36 29 22 15 8 16 23 30 37 44 51 58 59 52 ...
45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 ...
62 63 56 64];
zigzagrow = zeros(1, 64);
rblocks = zeros(64, nBlocks);
for i = 1:nBlocks
row = blocks{i}(:);
for j = 1:64
zigzagrow(j) = row(order(j));
end
%rblocks = cat(2, rblocks, zigzagrow');
rblocks(:, i) = zigzagrow';
end
end
%-------------------------------------------------------------------function [bsequence] = huffmanencode(blocks)
nBlocks = size(blocks, 2);
temp = cell(1, nBlocks * 2);
temp{1} = dcsequence(blocks(1, 1), 0);
temp{2} = acsequence(blocks(2:64, 1));
for i = 2:nBlocks
temp{2 * i - 1} = dcsequence(blocks(1, i), blocks(1, i - 1));
temp{2 * i} = acsequence(blocks(2:64, i));
end
bsequence = cat(2, temp{:});
end
%-------------------------------------------------------------------function [bsequence] = dcsequence(dc, dcold)
codeWord = {'00' '010' '011' '100' '101' '110' '1110' '11110' ...
'111110' '1111110' '11111110' '111111110'};
difference = dc - dcold;
category = getcategory(difference);
catseq = codeWord{category + 1};
dcmagseq = magnitudesequence(difference);
bsequence = strcat(catseq, dcmagseq);
end
%-------------------------------------------------------------------function [bsequence] = acsequence(accoeffs)
bsequence = [];
EOB = '1010';
ZRL = '11111111001';
codeWord = {
'00'

'01'

'100'

'1011'

'11010'

'1111000'

'11111000'

'1111110110'

'1111111110000010' '1111111110000011';...
'1100'

'11011'

'1111001'

'111110110'

'11111110110'

'1111111110000100' '1111111110000101'

'1111111110000110' '1111111110000111' '11111111100001000';...


'11100'

'11111001'

'1111110111'

Ingeniera de telecomunicaciones

'111111110100'

'1111111110001001' '1111111110001010'

LABORATORIO DE TRATAMIENTO DE SEALES III


TELEVISIN DIGITAL TERRESTRE
LABORATORIO 1 - VERSIN 2.0 - ENERO/2013
'1111111110001011' '1111111110001100' '1111111110001101' '1111111110001110';...
'111010'

'111110111'

'111111110101'

'1111111110001111' '1111111110010000' '1111111110010001'

'1111111110010010' '1111111110010011' '1111111110010100' '1111111110010101';...


'111011'

'1111111000'

'1111111110010110' '1111111110010111' '1111111110011000' '1111111110011001'

'1111111110011010' '1111111110011011' '1111111110011100' '1111111110011101';...


'1111010'

'11111110111'

'1111111110011110' '1111111110011111' '1111111110100000' '1111111110100001'

'1111111110100010' '1111111110100011' '1111111110100100' '1111111110100101';...


'1111011'

'111111110110'

'1111111110100110' '1111111110100111' '1111111110101000' '1111111110101001'

'1111111110101010' '1111111110101011' '1111111110101100' '1111111110101101';...


'11111010'

'111111110111'

'1111111110101110' '1111111110101111' '1111111110110000' '1111111110110001'

'1111111110110010' '1111111110110011' '1111111110110100' '1111111110110101';...


'111111000'

'111111111000000' '1111111110110110' '1111111110110111' '1111111110111000' '1111111110111001'

'1111111110111010' '1111111110111011' '1111111110111100' '1111111110111101';...


'111111001'

'1111111110111110' '1111111110111111' '1111111111000000' '1111111111000000' '1111111111000010'

'1111111111000011' '1111111111000100' '1111111111000101' '1111111111000110';...


'111111010'

'1111111111000111' '1111111111001000' '1111111111001001' '1111111111001010' '1111111111001011'

'1111111111001100' '1111111111001101' '1111111111001110' '1111111111001111';...


'1111111001'

'1111111111010000' '1111111111010001' '1111111111010010' '1111111111010011' '1111111111010100'

'1111111111010101' '1111111111010110' '1111111111010111' '1111111111011000';...


'1111111010'

'1111111111011001' '1111111111011010' '1111111111011011' '1111111111011100' '1111111111011101'

'1111111111011110' '1111111111011111' '1111111111100000' '1111111111100001';...


'11111111000'

'1111111111100010' '1111111111100011' '1111111111100100' '1111111111100101' '1111111111100110'

'1111111111100111' '1111111111101000' '1111111111101001' '1111111111101010';...


'1111111111101011' '1111111111101100' '1111111111101101' '1111111111101110' '1111111111101111' '1111111111110000'
'1111111111110001' '1111111111110010' '1111111111110011' '1111111111110100';...
'1111111111110101' '1111111111110110' '1111111111110111' '1111111111111000' '1111111111111001' '1111111111111010'
'1111111111111011' '1111111111111100' '1111111111111101' '1111111111111110'
};
ind = find(accoeffs);
if isempty(ind)
bsequence = EOB;
else
nZeros = ind(1) - 1;
if nZeros > 15
while (nZeros > 15)
bsequence = strcat(bsequence, ZRL);
nZeros = nZeros - 16;
end
runLength = nZeros;
index = ind(1);
category = getcategory(accoeffs(index));
runcatseq = codeWord{runLength + 1, category};
acmagseq = magnitudesequence(accoeffs(index));
bsequence = strcat(bsequence, runcatseq, acmagseq);
else
runLength = nZeros;
index = ind(1);

Ingeniera de telecomunicaciones

LABORATORIO DE TRATAMIENTO DE SEALES III


TELEVISIN DIGITAL TERRESTRE
LABORATORIO 1 - VERSIN 2.0 - ENERO/2013
category = getcategory(accoeffs(index));
runcatseq = codeWord{runLength + 1, category};
acmagseq = magnitudesequence(accoeffs(index));
bsequence = strcat(bsequence, runcatseq, acmagseq);
end
for i = 2:length(ind)
nZeros = ind(i) - ind(i - 1) - 1;
if nZeros > 15
while (nZeros > 15)
bsequence = strcat(bsequence, ZRL);
nZeros = nZeros - 16;
end
runLength = nZeros;
index = ind(i);
category = getcategory(accoeffs(index));
runcatseq = codeWord{runLength + 1, category};
acmagseq = magnitudesequence(accoeffs(index));
bsequence = strcat(bsequence, runcatseq, acmagseq);
else
runLength = nZeros;
index = ind(i);
category = getcategory(accoeffs(index));
runcatseq = codeWord{runLength + 1, category};
acmagseq = magnitudesequence(accoeffs(index));
bsequence = strcat(bsequence, runcatseq, acmagseq);
end
end
if ind(length(ind)) ~= 63
bsequence = strcat(bsequence, EOB);
end
end
end
%-------------------------------------------------------------------function [category] = getcategory(value)
if (value == 0)
category = 0;
elseif (abs(value) <= 1)
category = 1;
elseif (abs(value) <= 3)
category = 2;
elseif (abs(value) <= 7)
category = 3;
elseif (abs(value) <= 15)
category = 4;
elseif (abs(value) <= 31)
category = 5;
elseif (abs(value) <= 63)

Ingeniera de telecomunicaciones

LABORATORIO DE TRATAMIENTO DE SEALES III


TELEVISIN DIGITAL TERRESTRE
LABORATORIO 1 - VERSIN 2.0 - ENERO/2013
category = 6;
elseif (abs(value) <= 127)
category = 7;
elseif (abs(value) <= 255)
category = 8;
elseif (abs(value) <= 511)
category = 9;
elseif (abs(value) <= 1023)
category = 10;
elseif (abs(value) <= 2047)
category = 11;
end
end
%-------------------------------------------------------------------function [magseq] = magnitudesequence(a)
if a > 0
magseq = dec2bin(a);
elseif a < 0
a = a - 1;
temp = dec2bin(mod((a), 2^11), 11);
i = 1;
while (temp(i) ~= 48)
i = i + 1;
end
magseq = temp(i:length(temp));
else
magseq = [];
end
end
%-------------------------------------------------------------------function [finalseq] = paddingandbytestuffing(originalseq)
% Padding
originalLength = length(originalseq);
paddedLength = roundtom(originalLength, 8);
difference = paddedLength - originalLength;
pseq = strcat(originalseq, 48 * ones(1, difference));
for i = originalLength + 1:paddedLength
pseq(i) = '1';
end

%Byte stuffing
counter = 0;
indexes = [];
for i = 1:paddedLength/8
byte = pseq(8 * i - 7: 8 * i);
if isequal(byte, '11111111')
counter = counter + 1;

Ingeniera de telecomunicaciones

LABORATORIO DE TRATAMIENTO DE SEALES III


TELEVISIN DIGITAL TERRESTRE
LABORATORIO 1 - VERSIN 2.0 - ENERO/2013
indexes = cat(2, indexes, i);
end
end
finalseq = blanks(paddedLength + 8 * counter);
j = 0;
for i = 1:paddedLength/8
byte = pseq(8 * i - 7: 8 * i);
finalseq(8 * (i + j) - 7: 8 * (i + j)) = byte;
if any(i == indexes)
j = j + 1;
finalseq(8 * (i + j) - 7: 8 * (i + j)) = '00000000';
end
end
end
%-------------------------------------------------------------------function [dvec] = bin2decimalvector(bdata)
dLength = length(bdata) / 8;
dvec = zeros(1, dLength);
for i = 1:dLength
byte = bdata(8 * i - 7: 8 * i);
dvec(i) = bin2dec(byte);
end
end
%-------------------------------------------------------------------function writeimage(dsequence, m, n, outputfile)
% http://www.videotechnology.com/jpeg/j1.html
% SOI marker

-- FFD8 -- 255 216

% JFIF marker

-- FFE0 -- 255 224

% Define Quantization table marker -- FFDB -- 255 219


% Start of frame marker

-- FFC0 -- 255 192

% Define Huffman table marker


% Start of Scan marker

-- FFC4 -- 255 196

-- FFDA -- 255 218

EOI = [255 217];


jfifHeader = ...
[255 216 255 224 000 016 074 070 073 070 000 001 002 000 000 096 000 096 000 000 ...
255 219 000 067 000 016 011 012 014 012 010 016 014 013 014 018 017 016 019 024 ...
040 026 024 022 022 024 049 036 037 029 040 058 051 061 060 057 051 056 055 064 ...
072 092 078 064 068 087 069 055 056 080 109 081 087 095 098 103 194 103 062 077 ...
113 121 112 100 120 092 101 103 099 255 219 000 067 001 017 018 018 024 021 024 ...
047 026 026 047 099 066 056 066 099 099 099 099 099 099 099 099 099 099 099 099 ...
099 099 099 099 099 099 099 099 099 099 099 099 099 099 099 099 099 099 099 099 ...
099 099 099 099 099 099 099 099 099 099 099 099 099 099 099 099 099 099 255 192 ...
000 011 008 000 000 000 000 001 001 034 000 255 196 000 031 000 000 001 005 001 ...
001 001 001 001 001 000 000 000 000 000 000 000 000 001 002 003 004 005 006 007 ...
008 009 010 011 255 196 000 181 016 000 002 001 003 003 002 004 003 005 005 004 ...
004 000 000 001 125 001 002 003 000 004 017 005 018 033 049 065 006 019 081 097 ...
007 034 113 020 050 129 145 161 008 035 066 177 193 021 082 209 240 036 051 098 ...

Ingeniera de telecomunicaciones

10

LABORATORIO DE TRATAMIENTO DE SEALES III


TELEVISIN DIGITAL TERRESTRE
LABORATORIO 1 - VERSIN 2.0 - ENERO/2013
114 130 009 010 022 023 024 025 026 037 038 039 040 041 042 052 053 054 055 056 ...
057 058 067 068 069 070 071 072 073 074 083 084 085 086 087 088 089 090 099 100 ...
101 102 103 104 105 106 115 116 117 118 119 120 121 122 131 132 133 134 135 136 ...
137 138 146 147 148 149 150 151 152 153 154 162 163 164 165 166 167 168 169 170 ...
178 179 180 181 182 183 184 185 186 194 195 196 197 198 199 200 201 202 210 211 ...
212 213 214 215 216 217 218 225 226 227 228 229 230 231 232 233 234 241 242 243 ...
244 245 246 247 248 249 250 255 218 000 008 001 001 000 000 063 000];
M = dec2hex(m, 4);
N = dec2hex(n, 4);
jfifHeader(1,164) = hex2dec(M(1,1:2));
jfifHeader(1,165) = hex2dec(M(1,3:4));
jfifHeader(1,166) = hex2dec(N(1,1:2));
jfifHeader(1,167) = hex2dec(N(1,3:4));
data = uint8(cat(2, jfifHeader, dsequence, EOI));
fid = fopen(outputfile, 'wb');
if fid < 0
error('No se pudo crear o abrir archivo.');
end
fwrite(fid, data, 'uint8');
fclose(fid);
end

Ingeniera de telecomunicaciones

11

Vous aimerez peut-être aussi