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

📄 lifting_cdf5_3.c

📁 spiht的压缩解压缩c编写的
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "spiht.h"
#include "spihtdecode.h"

static void QccWAVCDF53AnalysisSymmetricEvenEven(QccVector signal,
                                                 int signal_length)
{
  int index;

  for (index = 1; index < signal_length - 2; index += 2)
    signal[index] -= (signal[index - 1] + signal[index + 1]) / 2;
  signal[signal_length - 1] -= signal[signal_length - 2];
  
  signal[0] = M_SQRT2 *
    (signal[0] + signal[1] / 2);
  for (index = 2; index < signal_length; index += 2)
    signal[index] = M_SQRT2 *
      (signal[index] + (signal[index + 1] + signal[index - 1]) / 4);
  
  for (index = 1; index < signal_length; index += 2)
    signal[index] /= -M_SQRT2;
}

static void QccWAVCDF53AnalysisSymmetricEvenOdd(QccVector signal,
                                                int signal_length)
{
  int index;

  signal[0] -= signal[1];
  for (index = 2; index < signal_length; index += 2)
    signal[index] -= (signal[index - 1] + signal[index + 1]) / 2;
  
  for (index = 1; index < signal_length - 2; index += 2)
    signal[index] = M_SQRT2 *
      (signal[index] + (signal[index + 1] + signal[index - 1]) / 4);
  signal[signal_length - 1] = M_SQRT2 *
    (signal[signal_length - 1] + signal[signal_length - 2] / 2);
  
  for (index = 0; index < signal_length; index += 2)
    signal[index] /= -M_SQRT2;
}

static void QccWAVCDF53AnalysisSymmetricOddEven(QccVector signal,
                                                int signal_length)
{
  int index;

  for (index = 1; index < signal_length; index += 2)
    signal[index] -= (signal[index - 1] + signal[index + 1]) / 2;
  
  signal[0] = M_SQRT2 *
    (signal[0] + signal[1] / 2);
  for (index = 2; index < signal_length - 2; index += 2)
    signal[index] = M_SQRT2 *
      (signal[index] + (signal[index + 1] + signal[index - 1]) / 4);
  signal[signal_length - 1] = M_SQRT2 *
    (signal[signal_length - 1] + signal[signal_length - 2] / 2);
  
  for (index = 1; index < signal_length; index += 2)
    signal[index] /= -M_SQRT2;
}

static void QccWAVCDF53AnalysisSymmetricOddOdd(QccVector signal,
                                               int signal_length)
{
  int index;

  signal[0] -= signal[1];
  for (index = 2; index < signal_length - 2; index += 2)
    signal[index] -= (signal[index - 1] + signal[index + 1]) / 2;
  signal[signal_length - 1] -= signal[signal_length - 2];

  for (index = 1; index < signal_length; index += 2)
    signal[index] = M_SQRT2 *
      (signal[index] + (signal[index + 1] + signal[index - 1]) / 4);
  
  for (index = 0; index < signal_length; index += 2)
    signal[index] /= -M_SQRT2;
}

static void QccWAVCDF53AnalysisPeriodicEvenEven(QccVector signal,
                                                int signal_length)
{
  int index;

  for (index = 1; index < signal_length - 2; index += 2)
    signal[index] -= (signal[index - 1] + signal[index + 1]) / 2;
  signal[signal_length - 1] -=
    (signal[signal_length - 2] + signal[0]) / 2;
  
  signal[0] = M_SQRT2 *
    (signal[0] + (signal[1] + signal[signal_length - 1]) / 4);
  for (index = 2; index < signal_length; index += 2)
    signal[index] = M_SQRT2 *
      (signal[index] + (signal[index + 1] + signal[index - 1]) / 4);
  
  for (index = 1; index < signal_length; index += 2)
    signal[index] /= -M_SQRT2;
}

static void QccWAVCDF53AnalysisPeriodicEvenOdd(QccVector signal,
                                               int signal_length)
{
  int index;

  signal[0] -=
    (signal[signal_length - 1] + signal[1]) / 2;
  for (index = 2; index < signal_length; index += 2)
    signal[index] -= (signal[index - 1] + signal[index + 1]) / 2;
  
  for (index = 1; index < signal_length - 1; index += 2)
    signal[index] = M_SQRT2 *
      (signal[index] + (signal[index + 1] + signal[index - 1]) / 4);
  signal[signal_length - 1] = M_SQRT2 *
    (signal[signal_length - 1] + (signal[0] + signal[signal_length - 2]) / 4);
  
  for (index = 0; index < signal_length; index += 2)
    signal[index] /= -M_SQRT2;
}

static void QccWAVCDF53AnalysisBoundaryEvenEven(QccVector signal,
                                                int signal_length)
{
  int index;

  for (index = 1; index < signal_length - 2; index += 2)
    signal[index] -= (signal[index - 1] + signal[index + 1]) / 2;
  signal[signal_length - 1] -=
    (3 * signal[signal_length - 2] - signal[signal_length - 4]) / 2;
  
  signal[0] = M_SQRT2 *
    (signal[0] + (3 * signal[1] - signal[3]) / 4);
  for (index = 2; index < signal_length; index += 2)
    signal[index] = M_SQRT2 *
      (signal[index] + (signal[index + 1] + signal[index - 1]) / 4);
  
  for (index = 1; index < signal_length; index += 2)
    signal[index] /= -M_SQRT2;
}

static void QccWAVCDF53AnalysisBoundaryEvenOdd(QccVector signal,
                                               int signal_length)
{
  int index;

  signal[0] -=
    (3 * signal[1] - signal[3]) / 2;
  for (index = 2; index < signal_length; index += 2)
    signal[index] -= (signal[index - 1] + signal[index + 1]) / 2;
  
  for (index = 1; index < signal_length - 2; index += 2)
    signal[index] = M_SQRT2 *
      (signal[index] + (signal[index + 1] + signal[index - 1]) / 4);
  signal[signal_length - 1] = M_SQRT2 *
    (signal[signal_length - 1] +
     (3 * signal[signal_length - 2] - signal[signal_length - 4]) / 4);
  
  for (index = 0; index < signal_length; index += 2)
    signal[index] /= -M_SQRT2;
}

static void QccWAVCDF53AnalysisBoundaryOddEven(QccVector signal,
                                               int signal_length)
{
  int index;

  for (index = 1; index < signal_length; index += 2)
    signal[index] -= (signal[index - 1] + signal[index + 1]) / 2;
  
  signal[0] = M_SQRT2 *
    (signal[0] + (3 * signal[1] - signal[3]) / 4);
  for (index = 2; index < signal_length - 2; index += 2)
    signal[index] = M_SQRT2 *
      (signal[index] + (signal[index + 1] + signal[index - 1]) / 4);
  signal[signal_length - 1] = M_SQRT2 *
    (signal[signal_length - 1] +
     (3 * signal[signal_length - 2] - signal[signal_length - 4]) / 4);
  
  for (index = 1; index < signal_length; index += 2)
    signal[index] /= -M_SQRT2;
}

static void QccWAVCDF53AnalysisBoundaryOddOdd(QccVector signal,
                                              int signal_length)
{
  int index;

  signal[0] -= (3 * signal[1] - signal[3]) / 2;
  for (index = 2; index < signal_length - 2; index += 2)
    signal[index] -= (signal[index - 1] + signal[index + 1]) / 2;
  signal[signal_length - 1] -= 
    (3 * signal[signal_length - 2] - signal[signal_length - 4]) / 2;
  
  for (index = 1; index < signal_length; index += 2)
    signal[index] = M_SQRT2 *
      (signal[index] + (signal[index + 1] + signal[index - 1]) / 4);
  
  for (index = 0; index < signal_length; index += 2)
    signal[index] /= -M_SQRT2;
}

int QccWAVLiftingAnalysisCohenDaubechiesFeauveau5_3(QccVector signal,
                                                    int signal_length,
                                                    int phase,
                                                    int boundary)
{
  if (signal == NULL)
    return(0);
  
  if (!signal_length)
    return(0);
  
  if (signal_length == 1)
    {
      if (phase == QCCWAVWAVELET_PHASE_EVEN)
        signal[0] *= M_SQRT2;
      else
        signal[0] /= M_SQRT2;
      return(0);
    }
  
  if ((boundary == QCCWAVWAVELET_BOUNDARY_BOUNDARY_WAVELET) &&
      ((signal_length == 2) || (signal_length == 3)))
    boundary = QCCWAVWAVELET_BOUNDARY_SYMMETRIC_EXTENSION;
  
  
  switch (phase)
    {
    case QCCWAVWAVELET_PHASE_EVEN:
      switch (signal_length % 2)
        {
        case 0:
          switch (boundary)
            {
            case QCCWAVWAVELET_BOUNDARY_SYMMETRIC_EXTENSION:
              QccWAVCDF53AnalysisSymmetricEvenEven(signal, signal_length);
              break;
              
            case QCCWAVWAVELET_BOUNDARY_PERIODIC_EXTENSION:
              QccWAVCDF53AnalysisPeriodicEvenEven(signal, signal_length);
              break;
              
            case QCCWAVWAVELET_BOUNDARY_BOUNDARY_WAVELET:
              QccWAVCDF53AnalysisBoundaryEvenEven(signal, signal_length);
              break;
              
            default:
              QccErrorAddMessage("(QccWAVLiftingAnalysisCohenDaubechiesFeauveau5_3): Undefined boundary method");
              return(1);
            }
          break;
          
        case 1:
          switch (boundary)
            {
            case QCCWAVWAVELET_BOUNDARY_SYMMETRIC_EXTENSION:
              QccWAVCDF53AnalysisSymmetricOddEven(signal, signal_length);
              break;
              
            case QCCWAVWAVELET_BOUNDARY_PERIODIC_EXTENSION:
              QccErrorAddMessage("(QccWAVLiftingAnalysisCohenDaubechiesFeauveau5_3): Signal length must be even for periodic extension");
              return(1);
              break;
              
            case QCCWAVWAVELET_BOUNDARY_BOUNDARY_WAVELET:
              QccWAVCDF53AnalysisBoundaryOddEven(signal, signal_length);
              break;
              
            default:
              QccErrorAddMessage("(QccWAVLiftingAnalysisCohenDaubechiesFeauveau5_3): Undefined boundary method");
              return(1);
            }
          break;
        }
      break;

    case QCCWAVWAVELET_PHASE_ODD:
      switch (signal_length % 2)
        {
        case 0:
          switch (boundary)
            {
            case QCCWAVWAVELET_BOUNDARY_SYMMETRIC_EXTENSION:
              QccWAVCDF53AnalysisSymmetricEvenOdd(signal, signal_length);
              break;
              
            case QCCWAVWAVELET_BOUNDARY_PERIODIC_EXTENSION:
              QccWAVCDF53AnalysisPeriodicEvenOdd(signal, signal_length);
              break;
              
            case QCCWAVWAVELET_BOUNDARY_BOUNDARY_WAVELET:
              QccWAVCDF53AnalysisBoundaryEvenOdd(signal, signal_length);
              break;
              
            default:
              QccErrorAddMessage("(QccWAVLiftingAnalysisCohenDaubechiesFeauveau5_3): Undefined boundary method");
              return(1);
            }
          break;
          
        case 1:
          switch (boundary)
            {
            case QCCWAVWAVELET_BOUNDARY_SYMMETRIC_EXTENSION:
              QccWAVCDF53AnalysisSymmetricOddOdd(signal, signal_length);
              break;
              
            case QCCWAVWAVELET_BOUNDARY_PERIODIC_EXTENSION:
              QccErrorAddMessage("(QccWAVLiftingAnalysisCohenDaubechiesFeauveau5_3): Signal length must be even for periodic extension");
              return(1);
              break;
              
            case QCCWAVWAVELET_BOUNDARY_BOUNDARY_WAVELET:
              QccWAVCDF53AnalysisBoundaryOddOdd(signal, signal_length);
              break;
              
            default:
              QccErrorAddMessage("(QccWAVLiftingAnalysisCohenDaubechiesFeauveau5_3): Undefined boundary method");
              return(1);
            }
          break;
        }
      break;
    }
  
  return(0);
}

static void QccWAVCDF53SynthesisSymmetricEvenEven(QccVector signal,
                                                  int signal_length)
{
  int index;

⌨️ 快捷键说明

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