📄 lifting.c
字号:
#include "spiht.h"
#include "spihtdecode.h"
int QccWAVLiftingSchemeInitialize(QccWAVLiftingScheme *lifting_scheme)
{
if (lifting_scheme == NULL)
return(0);
QccStringMakeNull(lifting_scheme->filename);
QccStringCopy(lifting_scheme->magic_num, QCCWAVLIFTINGSCHEME_MAGICNUM);
QccGetQccPackVersion(&lifting_scheme->major_version,
&lifting_scheme->minor_version,
NULL);
lifting_scheme->scheme = -1;
return(0);
}
static int QccWAVLiftingSchemeReadHeader(FILE *infile,
QccWAVLiftingScheme *lifting_scheme)
{
if ((infile == NULL) || (lifting_scheme == NULL))
return(0);
if (QccFileReadMagicNumber(infile,
lifting_scheme->magic_num,
&lifting_scheme->major_version,
&lifting_scheme->minor_version))
{
QccErrorAddMessage("(QccWAVLiftingSchemeReadHeader): Error reading magic number in lifting scheme %s",
lifting_scheme->filename);
return(1);
}
if (strcmp(lifting_scheme->magic_num, QCCWAVLIFTINGSCHEME_MAGICNUM))
{
QccErrorAddMessage("(QccWAVLiftingSchemeReadHeader): %s is not of filter-bank (%s) type",
lifting_scheme->filename,
QCCWAVLIFTINGSCHEME_MAGICNUM);
return(1);
}
fscanf(infile, "%d", &(lifting_scheme->scheme));
if (ferror(infile) || feof(infile))
{
QccErrorAddMessage("(QccWAVLiftingSchemeReadHeader): Error reading scheme in lifting scheme %s",
lifting_scheme->filename);
return(1);
}
if (QccFileSkipWhiteSpace(infile, 0))
{
QccErrorAddMessage("(QccWAVLiftingSchemeReadHeader): Error reading in lifting scheme %s",
lifting_scheme->filename);
return(1);
}
return(0);
}
int QccWAVLiftingSchemeRead(QccWAVLiftingScheme *lifting_scheme)
{
FILE *infile = NULL;
if (lifting_scheme == NULL)
return(0);
if ((infile =
QccFileOpen(lifting_scheme->filename, "r")) == NULL)
{
QccErrorAddMessage("(QccWAVLiftingSchemeRead): Error calling QccFileOpen()");
return(1);
}
if (QccWAVLiftingSchemeReadHeader(infile, lifting_scheme))
{
QccErrorAddMessage("(QccWAVLiftingSchemeRead): Error calling QccWAVLiftingSchemeReadHeader()");
return(1);
}
/*
if (QccWAVLiftingSchemeReadData(infile, lifting_scheme))
{
QccErrorAddMessage("(QccWAVLiftingSchemeRead): Error calling QccWAVLiftingSchemeReadData()");
return(1);
}
*/
QccFileClose(infile);
return(0);
}
int QccWAVLiftingAnalysis(const QccVector input_signal,
QccVector output_signal,
int signal_length,
int phase,
const QccWAVLiftingScheme *lifting_scheme,
int boundary)
{
int return_value;
QccVector input_signal2 = NULL;
if (input_signal == NULL)
return(0);
if (output_signal == NULL)
return(0);
if (lifting_scheme == NULL)
return(0);
if (!signal_length)
return(0);
if ((input_signal2 = QccVectorAlloc(signal_length)) == NULL)
{
QccErrorAddMessage("(QccWAVLiftingAnalysis): Error calling QccVectorAlloc()");
goto QccError;
}
if (QccVectorCopy(input_signal2, input_signal, signal_length))
{
QccErrorAddMessage("(QccWAVLiftingAnalysis): Error calling QccVectorCopy()");
goto QccError;
}
switch (lifting_scheme->scheme)
{
case QCCWAVLIFTINGSCHEME_LWT:
break;
case QCCWAVLIFTINGSCHEME_Daubechies4:
if (QccWAVLiftingAnalysisDaubechies4(input_signal2,
signal_length,
phase,
boundary))
{
QccErrorAddMessage("(QccWAVLiftingAnalysis): Error calling QccWAVLiftingAnalysisDaubechies4()");
goto QccError;
}
break;
case QCCWAVLIFTINGSCHEME_CohenDaubechiesFeauveau9_7:
if (QccWAVLiftingAnalysisCohenDaubechiesFeauveau9_7(input_signal2,
signal_length,
phase,
boundary))
{
QccErrorAddMessage("(QccWAVLiftingAnalysis): Error calling QccWAVLiftingAnalysisCohenDaubechiesFeauveau9_7()");
goto QccError;
}
break;
case QCCWAVLIFTINGSCHEME_CohenDaubechiesFeauveau5_3:
if (QccWAVLiftingAnalysisCohenDaubechiesFeauveau5_3(input_signal2,
signal_length,
phase,
boundary))
{
QccErrorAddMessage("(QccWAVLiftingAnalysis): Error calling QccWAVLiftingAnalysisCohenDaubechiesFeauveau5_3()");
goto QccError;
}
break;
default:
QccErrorAddMessage("(QccWAVLiftingAnalysis): Undefined lifting scheme");
goto QccError;
}
if (QccWAVWaveletLWT(input_signal2, output_signal, signal_length, 0, phase))
{
QccErrorAddMessage("(QccWAVLiftingAnalysis): Error calling QccWAVWaveletLWT()");
goto QccError;
}
return_value = 0;
goto QccReturn;
QccError:
return_value = 1;
QccReturn:
QccVectorFree(input_signal2);
return(return_value);
}
int QccWAVLiftingSynthesis(const QccVector input_signal,
QccVector output_signal,
int signal_length,
int phase,
const QccWAVLiftingScheme *lifting_scheme,
int boundary)
{
int return_value;
if (input_signal == NULL)
return(0);
if (output_signal == NULL)
return(0);
if (lifting_scheme == NULL)
return(0);
if (!signal_length)
return(0);
if (QccWAVWaveletInverseLWT(input_signal, output_signal,
signal_length, 0, phase))
{
QccErrorAddMessage("(QccWAVLiftingSynthesis): Error calling QccWAVWaveletInverseLWT()");
goto QccError;
}
switch (lifting_scheme->scheme)
{
case QCCWAVLIFTINGSCHEME_LWT:
break;
case QCCWAVLIFTINGSCHEME_Daubechies4:
if (QccWAVLiftingSynthesisDaubechies4(output_signal,
signal_length,
phase,
boundary))
{
QccErrorAddMessage("(QccWAVLiftingSynthesis): Error calling QccWAVLiftingSynthesisDaubechies4()");
goto QccError;
}
break;
case QCCWAVLIFTINGSCHEME_CohenDaubechiesFeauveau9_7:
if (QccWAVLiftingSynthesisCohenDaubechiesFeauveau9_7(output_signal,
signal_length,
phase,
boundary))
{
QccErrorAddMessage("(QccWAVLiftingSynthesis): Error calling QccWAVLiftingSynthesisCohenDaubechiesFeauveau9_7()");
goto QccError;
}
break;
case QCCWAVLIFTINGSCHEME_CohenDaubechiesFeauveau5_3:
if (QccWAVLiftingSynthesisCohenDaubechiesFeauveau5_3(output_signal,
signal_length,
phase,
boundary))
{
QccErrorAddMessage("(QccWAVLiftingSynthesis): Error calling QccWAVLiftingSynthesisCohenDaubechiesFeauveau5_3()");
goto QccError;
}
break;
default:
QccErrorAddMessage("(QccWAVLiftingSynthesis): Undefined lifting scheme");
goto QccError;
}
return_value = 0;
goto QccReturn;
QccError:
return_value = 1;
QccReturn:
return(return_value);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -