📄 tcq_dequantizer.c
字号:
/*****************************************************************************/
/* Copyright 1999 Science Applications International Corporation (SAIC). */
/* Copyright 1995 University of Arizona, Arizona Board of Regents. */
/* All rights reserved */
/* File: "tcq_dequantizer.c" */
/* Description: Trellis coded dequantization */
/* Author: Joe Triscari/Tom Flohr */
/* Affiliation: SAIC */
/* Version: VM7.1 */
/* Last Revised: 20 April, 2000 */
/*****************************************************************************/
/*****************************************************************************************************
*
* Functions to perfrom perfrom Adaptive inverse Trellis Coded Quantization of sequences of data.
*
*****************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
/******
*
* itcq: Inverse of trellis quantizer
*
******/
#define PRIME 2999957
void fitcq (float *class_coef, long *quant_code_words,
long num_codewords, float step,
int use_inverse_TCQ, int *scan_order)
{
long code_book, code_word, stage, state = 0, pos;
float *class_coef_ptr, val;
float *center_qls;
int k;
if (!use_inverse_TCQ) {
int i;
for (i=0; i<num_codewords; i++) {
class_coef[i] = step * ((float) quant_code_words[i]);
}
return;
}
step /= 2.0F;
center_qls = (float *)malloc(4 * sizeof(float));
center_qls[0] = -3.875F * step;
center_qls[1] = -1.875F * step;
center_qls[2] = 0.875F * step;
center_qls[3] = 2.875F * step;
class_coef_ptr = &class_coef[0]; /* use same array for input and output */
pos = -PRIME;
{
for(k = 0; k < num_codewords; k++){
stage = scan_order[k];
#ifdef RANDOM
pos = (pos + PRIME) % num_codewords;
#else
pos = stage;
#endif
code_word = quant_code_words[pos]; /* get current code word */
switch(state){ /* switch on odd or even superset */
case 0:
code_book = (code_word & 1) * 2;
switch(code_word){
case 0:
class_coef_ptr[pos] = 0;
break;
case 1:
class_coef_ptr[pos] = *(center_qls + 2); /* refined codeword for ql +1 */
break;
case -1:
class_coef_ptr[pos] = *(center_qls + 1); /* refined codeword for ql -2 */
break;
case 2:
class_coef_ptr[pos] = *(center_qls + 3); /* refined codeword for ql +3 */
break;
case -2:
class_coef_ptr[pos] = *center_qls; /* refined codeword for ql -4 */
break;
default: /* ql's +5, -6, +7, -8, +9, -10 ... */
val = step * 2.0F * ((float) code_word);
class_coef_ptr[pos] = (code_word > 0) ? (val - step) : val;
break;
}
switch(code_book){
case 0:
state = 0;
break;
case 2:
state = 4;
break;
}
break;
case 1:
code_book = (code_word & 1) * 2;
switch(code_word){
case 0:
class_coef_ptr[pos] = 0;
break;
case 1:
class_coef_ptr[pos] = *(center_qls + 2); /* refined codeword for ql +1 */
break;
case -1:
class_coef_ptr[pos] = *(center_qls + 1); /* refined codeword for ql -2 */
break;
case 2:
class_coef_ptr[pos] = *(center_qls + 3); /* refined codeword for ql +3 */
break;
case -2:
class_coef_ptr[pos] = *center_qls; /* refined codeword for ql -4 */
break;
default: /* ql's +5, -6, +7, -8, +9, -10 ... */
val = step * 2.0F * ((float) code_word);
class_coef_ptr[pos] = (code_word > 0) ? (val - step) : val;
break;
}
switch(code_book){
case 2:
state = 0;
break;
case 0:
state = 4;
break;
}
break;
case 2: /* All these states are in odd superset */
if(abs(code_word)>1)
code_word = -code_word;
code_book = 1 + (code_word & 1) * 2;
switch(code_word){
case 0:
class_coef_ptr[pos] = 0;
break;
case 1:
class_coef_ptr[pos] = -(*(center_qls + 2)); /* refined codeword for ql -1 */
break;
case -1:
class_coef_ptr[pos] = -(*(center_qls + 1)); /* refined codeword for ql +2 */
break;
case 2:
class_coef_ptr[pos] = -(*(center_qls + 3)); /* refined codeword for ql -3 */
break;
case -2:
class_coef_ptr[pos] = -(*center_qls); /* refined codeword for ql +4 */
break;
default: /* ql's -5, +6, -7, +8. -9, +10 ... */
val = step * 2.0F * ((float) code_word);
class_coef_ptr[pos] = (code_word > 0) ? -(val - step) : -val;
break;
}
switch(code_book){
case 1:
state = 1;
break;
case 3:
state = 5;
break;
}
break;
case 3: /* All these states are in odd superset */
if(abs(code_word)>1)
code_word = -code_word;
code_book = 1 + (code_word & 1) * 2;
switch(code_word){
case 0:
class_coef_ptr[pos] = 0;
break;
case 1:
class_coef_ptr[pos] = -(*(center_qls + 2)); /* refined codeword for ql -1 */
break;
case -1:
class_coef_ptr[pos] = -(*(center_qls + 1)); /* refined codeword for ql +2 */
break;
case 2:
class_coef_ptr[pos] = -(*(center_qls + 3)); /* refined codeword for ql -3 */
break;
case -2:
class_coef_ptr[pos] = -(*center_qls); /* refined codeword for ql +4 */
break;
default: /* ql's -5, +6, -7, +8. -9, +10 ... */
val = step * 2.0F * ((float) code_word);
class_coef_ptr[pos] = (code_word > 0) ? -(val - step) : -val;
break;
}
switch(code_book){
case 3:
state = 1;
break;
case 1:
state = 5;
break;
}
break;
case 4:
code_book = (code_word & 1) * 2;
switch(code_word){
case 0:
class_coef_ptr[pos] = 0;
break;
case 1:
class_coef_ptr[pos] = *(center_qls + 2); /* refined codeword for ql +1 */
break;
case -1:
class_coef_ptr[pos] = *(center_qls + 1); /* refined codeword for ql -2 */
break;
case 2:
class_coef_ptr[pos] = *(center_qls + 3); /* refined codeword for ql +3 */
break;
case -2:
class_coef_ptr[pos] = *center_qls; /* refined codeword for ql -4 */
break;
default: /* ql's +5, -6, +7, -8, +9, -10 ... */
val = step * 2.0F * ((float) code_word);
class_coef_ptr[pos] = (code_word > 0) ? (val - step) : val;
break;
}
switch(code_book){
case 2:
state = 2;
break;
case 0:
state = 6;
break;
}
break;
case 5:
code_book = (code_word & 1) * 2;
switch(code_word){
case 0:
class_coef_ptr[pos] = 0;
break;
case 1:
class_coef_ptr[pos] = *(center_qls + 2); /* refined codeword for ql +1 */
break;
case -1:
class_coef_ptr[pos] = *(center_qls + 1); /* refined codeword for ql -2 */
break;
case 2:
class_coef_ptr[pos] = *(center_qls + 3); /* refined codeword for ql +3 */
break;
case -2:
class_coef_ptr[pos] = *center_qls; /* refined codeword for ql -4 */
break;
default: /* ql's +5, -6, +7, -8, +9, -10 ... */
val = step * 2.0F * ((float) code_word);
class_coef_ptr[pos] = (code_word > 0) ? (val - step) : val;
break;
}
switch(code_book){
case 0:
state = 2;
break;
case 2:
state = 6;
break;
}
break;
case 6: /* All these states are in odd superset */
if(abs(code_word)>1)
code_word = -code_word;
code_book = 1 + (code_word & 1) * 2;
switch(code_word){
case 0:
class_coef_ptr[pos] = 0;
break;
case 1:
class_coef_ptr[pos] = -(*(center_qls + 2)); /* refined codeword for ql -1 */
break;
case -1:
class_coef_ptr[pos] = -(*(center_qls + 1)); /* refined codeword for ql +2 */
break;
case 2:
class_coef_ptr[pos] = -(*(center_qls + 3)); /* refined codeword for ql -3 */
break;
case -2:
class_coef_ptr[pos] = -(*center_qls); /* refined codeword for ql +4 */
break;
default: /* ql's -5, +6, -7, +8. -9, +10 ... */
val = step * 2.0F * ((float) code_word);
class_coef_ptr[pos] = (code_word > 0) ? -(val - step) : -val;
break;
}
switch(code_book){
case 3:
state = 3;
break;
case 1:
state = 7;
break;
}
break;
case 7:
if(abs(code_word)>1)
code_word = -code_word;
code_book = 1 + (code_word & 1) * 2;
switch(code_word){
case 0:
class_coef_ptr[pos] = 0;
break;
case 1:
class_coef_ptr[pos] = -(*(center_qls + 2)); /* refined codeword for ql -1 */
break;
case -1:
class_coef_ptr[pos] = -(*(center_qls + 1)); /* refined codeword for ql +2 */
break;
case 2:
class_coef_ptr[pos] = -(*(center_qls + 3)); /* refined codeword for ql -3 */
break;
case -2:
class_coef_ptr[pos] = -(*center_qls); /* refined codeword for ql +4 */
break;
default: /* ql's -5, +6, -7, +8. -9, +10 ... */
val = step * 2.0F * ((float) code_word);
class_coef_ptr[pos] = (code_word > 0) ? -(val - step) : -val;
break;
}
switch(code_book){
case 1:
state = 3;
break;
case 3:
state = 7;
break;
}
break;
}
}
}
free(center_qls);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -