Улучшение отношения сигнал/шум при микшировании видео изображения, сжатого по стандарту MPEG2, страница 14

Если же флаг равен 1, то сканирование производится так:

u

0

1

2

3

4

5

6

7

0

0

4

6

20

22

36

38

52

1

1

5

7

21

23

37

39

53

2

2

8

19

24

34

40

50

54

3

3

9

18

25

35

41

51

55

4

10

17

26

30

42

46

56

60

5

11

16

27

31

43

47

57

61

6

12

15

28

32

44

48

58

62

v

7

13

14

29

33

45

49

59

63

Матрицы квантования также преобразуются из одномерного массива в двумерный, правда используется только первый порядок сканирования.

Инверсное квантование

Инверсное квантование заключается в умножении матрицы коэффициентов ДКП на шаг квантователя. Шаг квантователя модифицируется за счет применения двух механизмов: новая матрица квантования или коэффициент масштабирования (чтобы не передавать целую матрицу).

Процесс инверсного квантования показан на рис.1.6.2.

Рис.1.6.2. Процесс инверсного квантования

Как видно из рис.1.6.2, процесс инверсного квантования состоит из 3 составляющих, которые будут подробно описаны далее. Надо отметить, что метод приведения коэффициентов к нужному диапазону в стандарте отличается от метода MPEG-1.

DC-коэффициенты интра блоков обрабатываются по другому, чем остальные коэффициенты. В интраблоках F’’[0][0] может быть получено за счет умножения QF[0][0] на постоянный множитель intra_dc_mult (постоянный в том смысле, что на него не влияют ни матрица квантования ни масштабирующий коэффициент). Этот множитель связан с параметром intra_dc_precision, используемым в дополнении кодирования изображения. Связь следующая: если точность воспроизведения задается 8,9,10,11 битами, то множитель равен 8,4,2,1, соответственно.

Остальные же коэффициенты обрабатываются на основе матриц квантования и коэффициента масштабирования. Этот коэффициент quantiser_scale передается 5 битами в параметре quantiser_scale_code. Параметр q_scale_type задает вид связи между quantiser_scale_code и quantiser_scale, как это показано в табл.П.2.41.

Для получения F''[v][u] из QF[v][u] для всех коэффициентов, кроме DC-коэффициентов интра блоков применяется выражение

Насыщение заключается в приведении коэффициентов к диапазону от -2048 до 2047 в соответствии с выражением

Контроль правильности заключается в следующем. Во-первых все коэффициенты блока суммируются. Если сумма нечетная, то ничего делать не надо. Если сумма четная, то корректируется коэффициент из правого нижнего угла. Если он нечетный, из него вычитается 1, а если четный, то 1 прибавляется. 

В целом, процесс инверсного квантования может быть описан на псевдокоде:

for (v=0; v<8;v++) {

for (u=0; u<8;u++) {

if ( (u==0) && (v==0) && (macroblock_intra) ) {

F''[v][u] = intra_dc_mult * QF[v][u];

} else {

if ( macroblock_intra ) {

F''[v][u] = ( QF[v][u] * W[w][v][u] * quantiser_scale * 2 ) / 32;

} else {

F''[v][u] = ( ( ( QF[v][u] *  2 ) + Sign(QF[v][u]) ) * W[w][v][u] * quantiser_scale ) / 32;

}

}

}

}

sum = 0;

for (v=0; v<8;v++) {

for (u=0; u<8;u++) {

if ( F’'[v][u] > 2047 ) {

F’[v][u] = 2047;

} else {

if ( F’'[v][u] < -2048 ) {

F’[v][u] = -2048;

} else {

F’[v][u] = F'‘[v][u];

}

}

sum = sum + F’[v][u];

F[v][u] = F’[v][u];

}

}

if ((sum & 1) == 0) {

if ((F[7][7] & 1) != 0) {

F[7][7] = F'[7][7] - 1;

} else {

F[7][7] = F'[7][7] + 1;

}

}