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