⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcq_dequantizer.c

📁 JPEG2000实现的源码
💻 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 + -