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

📄 quantizer.cc

📁 小波变换
💻 CC
📖 第 1 页 / 共 2 页
字号:
  context = new int [nData];  residual = new Real [nData];  resetLayer ();  initialDist = 0;  for (int i = 0; i < nData; i++)    initialDist += (*err)(residual[i]);  entropy->reset ();}/*---------------------------------------------------------------------------*/void LayerQuant::setDataDecode  (Real *newData, int newNData, int imax, 				 int imin, int imean){  data = newData;  nData = newNData;  if (imin < imax) {    qmax = intToReal (imin, paramPrecision);    qmean = intToReal (imean, paramPrecision);        if (signedSym) {      qmin = -qmax;      threshold = qmax/2.0;    } else {      qmin = intToReal (imin, paramPrecision);      threshold = (qmax - qmin)/2.0;    }      }  currentLayer = -1;  if (context != NULL)    delete [] context;  context = new int [nData];  if (signedSym) {    for (int i = 0; i < nData; i++) {      data[i] = 0;      context[i] = 0;    }  } else {    for (int i = 0; i < nData; i++) {      data[i] = qmean;      context[i] = 0;    }  }  resetLayer ();  entropy->reset ();}/*---------------------------------------------------------------------------*/void LayerQuant::getRateDist (int precision, Real minStepSize, 			      Real &rate, Real &dist){  assert (precision <= nLayers);  Real currentRate = 0;  Real currentDist = initialDist;    for (int i = 0; i < precision; i++) {    // rates & distortions have been computed for layers up to currentLayer    if (i <= currentLayer) {      currentRate += layerRate[i];      currentDist += layerDist[i];    } else {      if (threshold > minStepSize) {	quantizeLayer (NULL);	currentRate += layerRate[i];	currentDist += layerDist[i];      } else {	layerRate[i] = MaxReal;	layerDist[i] = -MaxReal;	currentRate = MaxReal;	currentDist = MaxReal;      }    }  }  rate = currentRate;  dist = currentDist;}/*---------------------------------------------------------------------------*/void LayerQuant::quantize (Encoder *encoder, int precision){  resetLayer ();  entropy->reset ();  for (int i = 0; i < precision; i++) {    quantizeLayer (encoder);  }}/*---------------------------------------------------------------------------*/void LayerQuant::resetLayer (){  if (residual != NULL) {    if (signedSym) {      for (int i = 0 ;i < nData; i++) {	residual[i] = data[i];	context[i] = 0;      }    } else {      // on the first layer we remove the mean      for (int i = 0 ;i < nData; i++) {	residual[i] = data[i] - 0.5*(qmax+qmin);	context[i] = 0;      }    }  } else {    if (signedSym) {      for (int i = 0 ;i < nData; i++) {	context[i] = 0;      }    } else {      // on the first layer we remove the mean      for (int i = 0 ;i < nData; i++) {	context[i] = 0;      }    }  }  currentLayer = -1;  if (signedSym)    threshold = qmax/2.0;  else    threshold = (qmax - qmin)/2.0;}/*---------------------------------------------------------------------------*/// deltaRate = bits required to code current layer// deltaDist = reduction in distortion from current layervoid LayerQuant::quantizeLayer (Encoder *encoder){  const Real halfThreshold = 0.5 * threshold;  const Real threeHalvesThreshold = 1.5 * threshold;  Real deltaRate = 0, deltaDist = 0;  int symbol;  currentLayer++;  //  printf ("current layer = %d, threshold = %g\n", currentLayer, threshold);  if (signedSym) {    for (int i = 0; i < nData; i++) {      deltaDist -= (*err)(residual[i]);  // subtract off old error      //      Real oldResid = residual[i];      if (context[i] == 0) {	if (residual[i] > threshold) {	  symbol = 1;	  residual[i] -= threeHalvesThreshold;	} else if (residual[i] < -threshold) {	  symbol = -1;	  residual[i] += threeHalvesThreshold;	} else {	  symbol = 0;	}      } else {	if (residual[i] > 0) {	  symbol = 1;	  residual[i] -= halfThreshold;	} else {	  symbol = 0;	  residual[i] += halfThreshold;	}      }      //      printf ("%d (%d): %g -> %g\n", symbol, context[i], oldResid,      //	      residual[i]);      deltaDist += (*err)(residual[i]);  // add in new error      deltaRate += entropy->write (encoder, symbol, TRUE, currentLayer,				   context[i]);      context[i] = 2*context[i] + symbol;    }  } else {    for (int i = 0; i < nData; i++) {      deltaDist -= (*err)(residual[i]);  // subtract off old error      if (residual[i] > 0) {	symbol = 1;	residual[i] -= halfThreshold;      } else {	symbol = 0;	residual[i] += halfThreshold;      }      deltaDist += (*err)(residual[i]);  // add in new error      deltaRate += entropy->write (encoder, symbol, TRUE, currentLayer,				   context[i]);      context[i] = 2*context[i] + symbol;       }  }  //  printf ("layer= %d  cost = %g\n", currentLayer, deltaRate);  threshold *= 0.5;  layerRate[currentLayer] = deltaRate;  layerDist[currentLayer] = deltaDist;}/*---------------------------------------------------------------------------*/void LayerQuant::dequantize   (Decoder *decoder, int precision){  resetLayer ();  for (int i = 0; i < precision; i++) {    dequantizeLayer (decoder);  }}/*---------------------------------------------------------------------------*/void LayerQuant::dequantizeLayer (Decoder *decoder){  int symbol;  currentLayer++;  //  printf ("current layer = %d, threshold = %g\n", currentLayer, threshold);  if (signedSym) {    for (int i = 0; i < nData; i++) {      symbol = entropy->read (decoder, TRUE, currentLayer,			      context[i]);      //      int oldData = data[i];      if (context[i] == 0)	data[i] += 1.5*threshold * symbol;      else 	data[i] += (symbol - 0.5) * threshold;      //      printf ("%d (%d):  %g -> %g  (%g)\n", symbol, context[i],      //	      oldData, data[i], threshold);	        context[i] = 2*context[i] + symbol;    }  } else {    for (int i = 0; i < nData; i++) {      symbol = entropy->read (decoder, TRUE, currentLayer, context[i]);      data[i] += (symbol - 0.5) * threshold;      context[i] = 2*context[i] + symbol;    }  }  threshold *= 0.5;}/*---------------------------------------------------------------------------*/void LayerQuant::writeHeader (Encoder *encoder, int precision){  encoder->writeNonneg (precision);  if (precision > 0) {    encoder->writeInt (imax);    if (!signedSym)      encoder->writeInt (imin);  } else {    if (!signedSym)      encoder->writeInt (imean);  }  //  printf ("precision = %d\n", precision);  //  printf ("qmax = %g  qmin = %g  qmean = %g\n", qmax, qmin, qmean);}/*---------------------------------------------------------------------------*/void LayerQuant::readHeader  (Decoder *decoder, int &precision){  precision = decoder->readNonneg ();  //  printf ("precision = %d\n", precision);  if (precision > 0) {    imax = decoder->readInt ();    qmax = intToReal (imax, paramPrecision);        if (signedSym) {      qmin = -qmax;      qmean = 0;    } else {      imin = decoder->readInt ();      qmin = intToReal (imin, paramPrecision);      qmean = 0.5 * (qmax + qmin);    }  } else {    if (!signedSym) {      imean = decoder->readInt ();      qmean = intToReal (imean, paramPrecision);    } else {      qmean = 0;      imean = realToInt (qmean, paramPrecision);    }    qmax = qmin = qmean;  }  //  printf ("qmax = %g  qmin = %g  qmean = %g\n", qmax, qmin, qmean);}/*---------------------------------------------------------------------------*/void LayerQuant::setParams (int newParamPrecision, Real newMax, 			    Real newMin, Real newMean){  paramPrecision = newParamPrecision;  qmax = newMax;  qmin = newMin;  qmean = newMean;}/*---------------------------------------------------------------------------*//*---------------------------------------------------------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -