lifting_cdf9_7.c
来自「spiht的压缩解压缩c编写的」· C语言 代码 · 共 964 行 · 第 1/3 页
C
964 行
for (index = 1; index < signal_length; index += 2)
signal[index] /= (-EPSILON);
}
static void QccWAVCDF97AnalysisBoundaryOddOdd(QccVector signal,
int signal_length)
{
int index;
signal[0] +=
ALPHA * (3*signal[1] - signal[3]);
for (index = 2; index < signal_length - 1; index += 2)
signal[index] +=
ALPHA * (signal[index - 1] + signal[index + 1]);
signal[signal_length - 1] +=
ALPHA * (3*signal[signal_length - 2] - signal[signal_length - 4]);
for (index = 1; index < signal_length - 1; index += 2)
signal[index] +=
BETA * (signal[index + 1] + signal[index - 1]);
signal[0] +=
GAMMA * (3*signal[1] - signal[3]);
for (index = 2; index < signal_length - 1; index += 2)
signal[index] +=
GAMMA * (signal[index - 1] + signal[index + 1]);
signal[signal_length - 1] +=
GAMMA * (3*signal[signal_length - 2] - signal[signal_length - 4]);
for (index = 1; index < signal_length - 1; index += 2)
signal[index] =
EPSILON * (signal[index] +
DELTA * (signal[index + 1] + signal[index - 1]));
for (index = 0; index < signal_length; index += 2)
signal[index] /= (-EPSILON);
}
int QccWAVLiftingAnalysisCohenDaubechiesFeauveau9_7(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:
QccWAVCDF97AnalysisSymmetricEvenEven(signal, signal_length);
break;
case QCCWAVWAVELET_BOUNDARY_PERIODIC_EXTENSION:
QccWAVCDF97AnalysisPeriodicEvenEven(signal, signal_length);
break;
case QCCWAVWAVELET_BOUNDARY_BOUNDARY_WAVELET:
QccWAVCDF97AnalysisBoundaryEvenEven(signal, signal_length);
break;
default:
QccErrorAddMessage("(QccWAVLiftingAnalysisCohenDaubechiesFeauveau9_7): Undefined boundary method");
return(1);
}
break;
case 1:
switch (boundary)
{
case QCCWAVWAVELET_BOUNDARY_SYMMETRIC_EXTENSION:
QccWAVCDF97AnalysisSymmetricOddEven(signal, signal_length);
break;
case QCCWAVWAVELET_BOUNDARY_PERIODIC_EXTENSION:
QccErrorAddMessage("(QccWAVLiftingAnalysisCohenDaubechiesFeauveau9_7): Signal length must be even for periodic extension");
return(1);
break;
case QCCWAVWAVELET_BOUNDARY_BOUNDARY_WAVELET:
QccWAVCDF97AnalysisBoundaryOddEven(signal, signal_length);
break;
default:
QccErrorAddMessage("(QccWAVLiftingAnalysisCohenDaubechiesFeauveau9_7): Undefined boundary method");
return(1);
}
break;
}
break;
case QCCWAVWAVELET_PHASE_ODD:
switch (signal_length % 2)
{
case 0:
switch (boundary)
{
case QCCWAVWAVELET_BOUNDARY_SYMMETRIC_EXTENSION:
QccWAVCDF97AnalysisSymmetricEvenOdd(signal, signal_length);
break;
case QCCWAVWAVELET_BOUNDARY_PERIODIC_EXTENSION:
QccWAVCDF97AnalysisPeriodicEvenOdd(signal, signal_length);
break;
case QCCWAVWAVELET_BOUNDARY_BOUNDARY_WAVELET:
QccWAVCDF97AnalysisBoundaryEvenOdd(signal, signal_length);
break;
default:
QccErrorAddMessage("(QccWAVLiftingAnalysisCohenDaubechiesFeauveau9_7): Undefined boundary method");
return(1);
}
break;
case 1:
switch (boundary)
{
case QCCWAVWAVELET_BOUNDARY_SYMMETRIC_EXTENSION:
QccWAVCDF97AnalysisSymmetricOddOdd(signal, signal_length);
break;
case QCCWAVWAVELET_BOUNDARY_PERIODIC_EXTENSION:
QccErrorAddMessage("(QccWAVLiftingAnalysisCohenDaubechiesFeauveau9_7): Signal length must be even for periodic extension");
return(1);
break;
case QCCWAVWAVELET_BOUNDARY_BOUNDARY_WAVELET:
QccWAVCDF97AnalysisBoundaryOddOdd(signal, signal_length);
break;
default:
QccErrorAddMessage("(QccWAVLiftingAnalysisCohenDaubechiesFeauveau9_7): Undefined boundary method");
return(1);
}
break;
}
break;
}
return(0);
}
static void QccWAVCDF97SynthesisSymmetricEvenEven(QccVector signal,
int signal_length)
{
int index;
for (index = 1; index < signal_length; index += 2)
signal[index] *= (-EPSILON);
signal[0] =
signal[0]/EPSILON - 2 * DELTA * signal[1];
for (index = 2; index < signal_length; index += 2)
signal[index] =
signal[index]/EPSILON -
DELTA * (signal[index + 1] + signal[index - 1]);
for (index = 1; index < signal_length - 2; index += 2)
signal[index] -=
GAMMA * (signal[index - 1] + signal[index + 1]);
signal[signal_length - 1] -=
2 * GAMMA * signal[signal_length - 2];
signal[0] -=
2 * BETA * signal[1];
for (index = 2; index < signal_length; index += 2)
signal[index] -=
BETA * (signal[index + 1] + signal[index - 1]);
for (index = 1; index < signal_length - 2; index += 2)
signal[index] -=
ALPHA * (signal[index - 1] + signal[index + 1]);
signal[signal_length - 1] -=
2 * ALPHA * signal[signal_length - 2];
}
static void QccWAVCDF97SynthesisSymmetricEvenOdd(QccVector signal,
int signal_length)
{
int index;
for (index = 0; index < signal_length; index += 2)
signal[index] *= (-EPSILON);
for (index = 1; index < signal_length - 2; index += 2)
signal[index] =
signal[index] / EPSILON -
DELTA * (signal[index + 1] + signal[index - 1]);
signal[signal_length - 1] =
signal[signal_length - 1] / EPSILON -
2 * DELTA * signal[signal_length - 2];
signal[0] -=
2 * GAMMA * signal[1];
for (index = 2; index < signal_length; index += 2)
signal[index] -=
GAMMA * (signal[index - 1] + signal[index + 1]);
for (index = 1; index < signal_length - 2; index += 2)
signal[index] -=
BETA * (signal[index + 1] + signal[index - 1]);
signal[signal_length - 1] -=
2 * BETA * signal[signal_length - 2];
signal[0] -=
2 * ALPHA * signal[1];
for (index = 2; index < signal_length; index += 2)
signal[index] -=
ALPHA * (signal[index - 1] + signal[index + 1]);
}
static void QccWAVCDF97SynthesisSymmetricOddEven(QccVector signal,
int signal_length)
{
int index;
for (index = 1; index < signal_length - 1; index += 2)
signal[index] *= (-EPSILON);
signal[0] =
signal[0] / EPSILON - 2 * DELTA * signal[1];
for (index = 2; index < signal_length - 2; index += 2)
signal[index] =
signal[index] / EPSILON -
DELTA * (signal[index + 1] + signal[index - 1]);
signal[signal_length - 1] =
signal[signal_length - 1] / EPSILON -
2 * DELTA * signal[signal_length - 2];
for (index = 1; index < signal_length - 1; index += 2)
signal[index] -=
GAMMA * (signal[index - 1] + signal[index + 1]);
signal[0] -=
2 * BETA * signal[1];
for (index = 2; index < signal_length - 2; index += 2)
signal[index] -=
BETA * (signal[index + 1] + signal[index - 1]);
signal[signal_length - 1] -=
2 * BETA * signal[signal_length - 2];
for (index = 1; index < signal_length - 1; index += 2)
signal[index] -=
ALPHA * (signal[index - 1] + signal[index + 1]);
}
static void QccWAVCDF97SynthesisSymmetricOddOdd(QccVector signal,
int signal_length)
{
int index;
for (index = 0; index < signal_length; index += 2)
signal[index] *= (-EPSILON);
for (index = 1; index < signal_length; index += 2)
signal[index] =
signal[index] / EPSILON -
DELTA * (signal[index + 1] + signal[index - 1]);
signal[0] -=
2 * GAMMA * signal[1];
for (index = 2; index < signal_length - 2; index += 2)
signal[index] -=
GAMMA * (signal[index - 1] + signal[index + 1]);
signal[signal_length - 1] -=
2 * GAMMA * signal[signal_length - 2];
for (index = 1; index < signal_length; index += 2)
signal[index] -=
BETA * (signal[index + 1] + signal[index - 1]);
signal[0] -=
2 * ALPHA * signal[1];
for (index = 2; index < signal_length - 2; index += 2)
signal[index] -=
ALPHA * (signal[index - 1] + signal[index + 1]);
signal[signal_length - 1] -=
2 * ALPHA * signal[signal_length - 2];
}
static void QccWAVCDF97SynthesisPeriodicEvenEven(QccVector signal,
int signal_length)
{
int index;
for (index = 1; index < signal_length; index += 2)
signal[index] *= (-EPSILON);
signal[0] =
signal[0]/EPSILON - DELTA * (signal[1] + signal[signal_length - 1]);
for (index = 2; index < signal_length; index += 2)
signal[index] =
signal[index]/EPSILON -
DELTA * (signal[index + 1] + signal[index - 1]);
for (index = 1; index < signal_length - 2; index += 2)
signal[index] -=
GAMMA * (signal[index - 1] + signal[index + 1]);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?