📄 lifting_cdf5_3.c
字号:
for (index = 1; index < signal_length; index += 2)
signal[index] *= -M_SQRT2;
signal[0] =
signal[0] / M_SQRT2 - signal[1] / 2;
for (index = 2; index < signal_length; index += 2)
signal[index] =
signal[index] / M_SQRT2 -
(signal[index + 1] + signal[index - 1]) / 4;
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];
}
static void QccWAVCDF53SynthesisSymmetricEvenOdd(QccVector signal,
int signal_length)
{
int index;
for (index = 0; index < signal_length; index += 2)
signal[index] *= -M_SQRT2;
for (index = 1; index < signal_length - 2; index += 2)
signal[index] =
signal[index] / M_SQRT2 - (signal[index + 1] + signal[index - 1]) / 4;
signal[signal_length - 1] =
signal[signal_length - 1] / M_SQRT2 - signal[signal_length - 2] / 2;
signal[0] += signal[1];
for (index = 2; index < signal_length; index += 2)
signal[index] += (signal[index - 1] + signal[index + 1]) / 2;
}
static void QccWAVCDF53SynthesisSymmetricOddEven(QccVector signal,
int signal_length)
{
int index;
for (index = 1; index < signal_length; index += 2)
signal[index] *= -M_SQRT2;
signal[0] =
signal[0] / M_SQRT2 - signal[1] / 2;
for (index = 2; index < signal_length - 2; index += 2)
signal[index] =
signal[index] / M_SQRT2 -
(signal[index + 1] + signal[index - 1]) / 4;
signal[signal_length - 1] =
signal[signal_length - 1] / M_SQRT2 - signal[signal_length - 2] / 2;
for (index = 1; index < signal_length; index += 2)
signal[index] += (signal[index - 1] + signal[index + 1]) / 2;
}
static void QccWAVCDF53SynthesisSymmetricOddOdd(QccVector signal,
int signal_length)
{
int index;
for (index = 0; index < signal_length; index += 2)
signal[index] *= -M_SQRT2;
for (index = 1; index < signal_length; index += 2)
signal[index] =
signal[index] / M_SQRT2 - (signal[index + 1] + signal[index - 1]) / 4;
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];
}
static void QccWAVCDF53SynthesisPeriodicEvenEven(QccVector signal,
int signal_length)
{
int index;
for (index = 1; index < signal_length; index += 2)
signal[index] *= -M_SQRT2;
signal[0] =
signal[0] / M_SQRT2 - (signal[1] + signal[signal_length - 1]) / 4;
for (index = 2; index < signal_length; index += 2)
signal[index] =
signal[index] / M_SQRT2 -
(signal[index + 1] + signal[index - 1]) / 4;
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;
}
static void QccWAVCDF53SynthesisPeriodicEvenOdd(QccVector signal,
int signal_length)
{
int index;
for (index = 0; index < signal_length; index += 2)
signal[index] *= -M_SQRT2;
for (index = 1; index < signal_length - 1; index += 2)
signal[index] = signal[index] / M_SQRT2 -
(signal[index + 1] + signal[index - 1]) / 4;
signal[signal_length - 1] = signal[signal_length - 1] / M_SQRT2 -
(signal[0] + signal[signal_length - 2]) / 4;
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;
}
static void QccWAVCDF53SynthesisBoundaryEvenEven(QccVector signal,
int signal_length)
{
int index;
for (index = 1; index < signal_length; index += 2)
signal[index] *= -M_SQRT2;
signal[0] =
signal[0] / M_SQRT2 - (3 * signal[1] - signal[3]) / 4;
for (index = 2; index < signal_length; index += 2)
signal[index] =
signal[index] / M_SQRT2 -
(signal[index + 1] + signal[index - 1]) / 4;
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;
}
static void QccWAVCDF53SynthesisBoundaryEvenOdd(QccVector signal,
int signal_length)
{
int index;
for (index = 0; index < signal_length; index += 2)
signal[index] *= -M_SQRT2;
for (index = 1; index < signal_length - 2; index += 2)
signal[index] =
signal[index] / M_SQRT2 - (signal[index + 1] + signal[index - 1]) / 4;
signal[signal_length - 1] =
signal[signal_length - 1] / M_SQRT2 -
(3 * signal[signal_length - 2] - signal[signal_length - 4]) / 4;
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;
}
static void QccWAVCDF53SynthesisBoundaryOddEven(QccVector signal,
int signal_length)
{
int index;
for (index = 1; index < signal_length; index += 2)
signal[index] *= -M_SQRT2;
signal[0] =
signal[0] / M_SQRT2 - (3 * signal[1] - signal[3]) / 4;
for (index = 2; index < signal_length - 2; index += 2)
signal[index] =
signal[index] / M_SQRT2 -
(signal[index + 1] + signal[index - 1]) / 4;
signal[signal_length - 1] =
signal[signal_length - 1] / M_SQRT2 -
(3 * signal[signal_length - 2] - signal[signal_length - 4]) / 4;
for (index = 1; index < signal_length; index += 2)
signal[index] += (signal[index - 1] + signal[index + 1]) / 2;
}
static void QccWAVCDF53SynthesisBoundaryOddOdd(QccVector signal,
int signal_length)
{
int index;
for (index = 0; index < signal_length; index += 2)
signal[index] *= -M_SQRT2;
for (index = 1; index < signal_length; index += 2)
signal[index] =
signal[index] / M_SQRT2 - (signal[index + 1] + signal[index - 1]) / 4;
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;
}
int QccWAVLiftingSynthesisCohenDaubechiesFeauveau5_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:
QccWAVCDF53SynthesisSymmetricEvenEven(signal, signal_length);
break;
case QCCWAVWAVELET_BOUNDARY_PERIODIC_EXTENSION:
QccWAVCDF53SynthesisPeriodicEvenEven(signal, signal_length);
break;
case QCCWAVWAVELET_BOUNDARY_BOUNDARY_WAVELET:
QccWAVCDF53SynthesisBoundaryEvenEven(signal, signal_length);
break;
default:
QccErrorAddMessage("(QccWAVLiftingSynthesisCohenDaubechiesFeauveau5_3): Undefined boundary method");
return(1);
}
break;
case 1:
switch (boundary)
{
case QCCWAVWAVELET_BOUNDARY_SYMMETRIC_EXTENSION:
QccWAVCDF53SynthesisSymmetricOddEven(signal, signal_length);
break;
case QCCWAVWAVELET_BOUNDARY_PERIODIC_EXTENSION:
QccErrorAddMessage("(QccWAVLiftingSynthesisCohenDaubechiesFeauveau5_3): Signal length must be even for periodic extension");
return(1);
break;
case QCCWAVWAVELET_BOUNDARY_BOUNDARY_WAVELET:
QccWAVCDF53SynthesisBoundaryOddEven(signal, signal_length);
break;
default:
QccErrorAddMessage("(QccWAVLiftingSynthesisCohenDaubechiesFeauveau5_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:
QccWAVCDF53SynthesisSymmetricEvenOdd(signal, signal_length);
break;
case QCCWAVWAVELET_BOUNDARY_PERIODIC_EXTENSION:
QccWAVCDF53SynthesisPeriodicEvenOdd(signal, signal_length);
break;
case QCCWAVWAVELET_BOUNDARY_BOUNDARY_WAVELET:
QccWAVCDF53SynthesisBoundaryEvenOdd(signal, signal_length);
break;
default:
QccErrorAddMessage("(QccWAVLiftingSynthesisCohenDaubechiesFeauveau5_3): Undefined boundary method");
return(1);
}
break;
case 1:
switch (boundary)
{
case QCCWAVWAVELET_BOUNDARY_SYMMETRIC_EXTENSION:
QccWAVCDF53SynthesisSymmetricOddOdd(signal, signal_length);
break;
case QCCWAVWAVELET_BOUNDARY_PERIODIC_EXTENSION:
QccErrorAddMessage("(QccWAVLiftingSynthesisCohenDaubechiesFeauveau5_3): Signal length must be even for periodic extension");
return(1);
break;
case QCCWAVWAVELET_BOUNDARY_BOUNDARY_WAVELET:
QccWAVCDF53SynthesisBoundaryOddOdd(signal, signal_length);
break;
default:
QccErrorAddMessage("(QccWAVLiftingSynthesisCohenDaubechiesFeauveau5_3): Undefined boundary method");
return(1);
}
break;
}
break;
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -