📄 idwt_aux.cpp
字号:
InBuf+(Length>>1)+(start>>1), odd,
SegLength, Filter,ZeroHigh);
#endif
if(ret!=DWT_OK) return(ret);
}
}
return(DWT_OK);
}
/*
Function: SynthesizeSegmentOddSymInt() or SynthesizeSegmentOddSymDbl()
Description: SA-Synthesize a 1D segment based on its InitPos and Length using
Odd-Symmetric Filters
Input:
InL -- Input lowpass data;
InH -- Input highpass data;
PosFlag -- Start position of this segment (ODD or EVEN);
Length -- Length of this Segment;
Filter -- Filter used;
ZeroHigh -- Highpass band is zero or not.
Output:
Out -- Output synthesized data segment;
Return: Return DWT_OK if Successful
*/
#ifdef _DWT_INT_
Int VTCIDWT:: SynthesizeSegmentOddSymInt(DWTDATA *Out, DWTDATA *InL, DWTDATA *InH,
Int PosFlag, Int Length, FILTER *Filter, Int ZeroHigh)
#else
Int VTCIDWT:: SynthesizeSegmentOddSymDbl(DWTDATA *Out, DWTDATA *InL, DWTDATA *InH,
Int PosFlag, Int Length, FILTER *Filter, Int ZeroHigh)
#endif
{
#ifdef _DWT_INT_
Short *LPCoeff = (Short *)Filter->LPCoeff, *HPCoeff = (Short *)Filter->HPCoeff;
Short *fi;
#else
double *LPCoeff =(double *) Filter->LPCoeff, *HPCoeff =(double *) Filter->HPCoeff;
double *fi;
#endif
Int ltaps = Filter->LPLength, htaps = Filter->HPLength; /* filter lengths*/
Int loffset = ltaps/2, hoffset = htaps/2; /* Filter offset */
Int border = (ltaps>htaps)?ltaps:htaps; /*the larger of ltaps and htaps */
Int m, n;
DWTDATA *f,*pixel, *pixel1, val, *buf, *a, *tmp_out;
Int r = Length-1;
if(Length == 1) {
PosFlag = 0;
ZeroHigh = DWT_ZERO_HIGH; // hjlee 0928
}
/* allocate proper buffer */
buf = (DWTDATA *) malloc((Length+2*border)*sizeof(DWTDATA));
if(buf==NULL) return(DWT_MEMORY_FAILED);
for(m=0;m<Length;m++) Out[m]= (DWTDATA) 0;
for(m=0;m<Length+2*border;m++) buf[m]= (DWTDATA) 0;
/* fill in the low pass coefficients by upsampling by 2*/
a = buf+border;
for(m=PosFlag; m< Length; m+=2) {
a[m] = InL[m>>1];
}
/* symmetric extension */
for (m=1 ; m<=border; m++) {
a[-m] = a[m]; /* to allow Shorter seg */
a[r+m] = a[r-m];
}
a = buf + border;
f = buf + border + Length;
tmp_out = Out;
for (; a<f; a ++) {
/* filter the pixel with lowpass filter */
for( fi=LPCoeff, pixel=a-loffset, pixel1=pixel+ltaps-1, val=0, n=0;
n<(ltaps >>1);
n++, fi++, pixel++, pixel1--) {
val += ( *fi * (*pixel + *pixel1));
}
val += ( *fi * *pixel);
*tmp_out++ = val;
}
/* if Highpass are zeros, skip */
if(ZeroHigh== DWT_NONZERO_HIGH) {
for(m=0;m<Length+2*border;m++) buf[m]= (DWTDATA) 0;
a = buf+border;
for(m=1-PosFlag;m< Length; m+=2) {
a[m] = InH[m>>1];
}
/* symmetric extension */
for (m=1 ; m<=border; m++) {
a[-m] = a[m]; /* to allow Shorter seg */
a[r+m] = a[r-m];
}
a = buf + border;
tmp_out = Out;
for (; a<f; a ++){
/* filter the pixel with highpass filter */
for(fi=HPCoeff, pixel=a-hoffset, pixel1=pixel+htaps-1, val=0, n=0;
n<(htaps>>1); n++, fi++, pixel++, pixel1--) {
val += ( *fi * (*pixel + *pixel1));
}
val += ( *fi * *pixel);
*tmp_out++ += val;
}
}
free(buf);
return(DWT_OK);
}
#ifdef _DWT_INT_
Int VTCIDWT:: iSADWT1dEvenSymInt(DWTDATA *InBuf, UChar *InMaskBuf, DWTDATA *OutBuf,
UChar *OutMaskBuf, Int Length, FILTER *Filter,
Int Direction, Int ZeroHigh)
#else
Int VTCIDWT:: iSADWT1dEvenSymDbl(DWTDATA *InBuf, UChar *InMaskBuf, DWTDATA *OutBuf,
UChar *OutMaskBuf, Int Length, FILTER *Filter,
Int Direction, Int ZeroHigh)
#endif
{
Int i;
Int SegLength = 0;
Int odd;
Int start, end;
UChar *a, *b, *c;
Int ret;
/* double check filter class and type */
if(Filter->DWT_Class != DWT_EVEN_SYMMETRIC) return(DWT_INTERNAL_ERROR);
#ifdef _DWT_INT_
if(Filter->DWT_Type != DWT_INT_TYPE) return(DWT_INTERNAL_ERROR);
#else
if(Filter->DWT_Type != DWT_DBL_TYPE) return(DWT_INTERNAL_ERROR);
#endif
/* double check if Length is even */
if(Length & 1) return(DWT_INTERNAL_ERROR);
/* synthesize mask first */
for(a=OutMaskBuf, b = InMaskBuf, c= InMaskBuf+(Length>>1); a<OutMaskBuf+Length;b++,c++) {
if(Direction == DWT_VERTICAL) {
if(*c == DWT_OUT2) {
*a++=DWT_OUT0;
*a++=DWT_IN;
}
else if(*c == DWT_OUT3) {
*a++=DWT_OUT1;
*a++=DWT_IN;
}
else {
*a++=*b;
*a++=*c;
}
}
else {
if(*c == DWT_OUT1) {
*a++=DWT_OUT0;
*a++=DWT_IN;
}
else {
*a++ = *b;
*a++ = *c;
}
}
}
/* initial OutBuf to zeros */
memset(OutBuf, (UChar)0, sizeof(DWTDATA)*Length);
if(ZeroHigh == DWT_ALL_ZERO) return(DWT_OK);
i = 0;
a = OutMaskBuf;
while(i<Length) {
/* search for a segment */
while(i<Length && (a[i])!=DWT_IN) i++;
start = i;
if(i >= Length) break;
while(i<Length && (a[i])==DWT_IN) i++;
end = i;
SegLength = end-start;
odd = start%2;
if(SegLength==1) { /* special case for single poInt */
#ifdef _DWT_INT_
ret=SynthesizeSegmentEvenSymInt(OutBuf+start, InBuf+(start>>1),
InBuf+(Length>>1)+(start>>1), odd,
SegLength, Filter, ZeroHigh);
#else
ret=SynthesizeSegmentEvenSymDbl(OutBuf+start, InBuf+(start>>1),
InBuf+(Length>>1)+(start>>1), odd,
SegLength, Filter,ZeroHigh);
#endif
if(ret!=DWT_OK) return(ret);
}
else {
#ifdef _DWT_INT_
ret=SynthesizeSegmentEvenSymInt(OutBuf+start, InBuf+(start>>1),
InBuf+(Length>>1)+((start+1)>>1), odd,
SegLength, Filter,ZeroHigh);
#else
ret=SynthesizeSegmentEvenSymDbl(OutBuf+start, InBuf+(start>>1),
InBuf+(Length>>1)+((start+1)>>1), odd,
SegLength, Filter,ZeroHigh);
#endif
if(ret!=DWT_OK) return(ret);
}
}
return(DWT_OK);
}
/*
Function: SynthesizeSegmentEvenSymInt() or SynthesizeSegmentEvenSymDbl()
Description: SA-Synthesize a 1D segment based on its InitPos and Length using
Even-Symmetric Filters
Input:
InL -- Input lowpass data;
InH -- Input highpass data;
PosFlag -- Start position of this segment (ODD or EVEN);
Length -- Length of this Segment;
Filter -- Filter used;
ZeroHigh -- Highpass band is zero or not.
Output:
Out -- Output synthesized data segment;
Return: Return DWT_OK if Successful
*/
#ifdef _DWT_INT_
Int VTCIDWT:: SynthesizeSegmentEvenSymInt(DWTDATA *Out, DWTDATA *InL, DWTDATA *InH,
Int PosFlag, Int Length, FILTER *Filter, Int ZeroHigh)
#else
Int VTCIDWT:: SynthesizeSegmentEvenSymDbl(DWTDATA *Out, DWTDATA *InL, DWTDATA *InH,
Int PosFlag, Int Length, FILTER *Filter, Int ZeroHigh)
#endif
{
#ifdef _DWT_INT_
Short *LPCoeff = (Short *)Filter->LPCoeff, *HPCoeff = (Short *)Filter->HPCoeff;
Short *fi;
#else
double *LPCoeff = (double *) Filter->LPCoeff, *HPCoeff = (double *)Filter->HPCoeff;
double *fi;
#endif
Int ltaps = Filter->LPLength, htaps = Filter->HPLength; /* filter lengths*/
Int loffset = ltaps/2, hoffset = htaps/2; /* Filter offset */
Int border = (ltaps>htaps)?ltaps:htaps; /*the larger of ltaps and htaps */
Int m, n;
DWTDATA *f,*pixel, *pixel1, val, *buf, *a, *tmp_out;
Int r = Length-1;
if(Length == 1) {
/* *Out = *InL * Filter->Scale; */
PosFlag = 0;
ZeroHigh = DWT_ZERO_HIGH; // hjlee 0928
/* return(DWT_OK); */
}
/* allocate proper buffer */
buf = (DWTDATA *) malloc((Length+2*border+1)*sizeof(DWTDATA));
if(buf==NULL) return(DWT_MEMORY_FAILED);
for(m=0;m<Length;m++) Out[m]= (DWTDATA) 0;
for(m=0;m<Length+2*border+1;m++) buf[m]= (DWTDATA) 0;
/* fill in the low pass coefficients by upsampling by 2*/
a = buf+border+1;
for(m=-PosFlag; m< Length; m+=2) {
a[m] = InL[(m+1)>>1];
}
/* symmetric extension */
for (m=1 ; m<=border; m++) {
a[-m-1] = a[m-1]; /* to allow Shorter seg */ /*symmetric poInt a[-1] */
a[r+m] = a[r-m]; /*symmetric poInt a[r] */
}
f = buf + border + 1 + Length;
tmp_out = Out;
for (; a<f; a ++) {
/* filter the pixel with lowpass filter */
for( fi=LPCoeff, pixel=a-loffset, pixel1=pixel+ltaps-1, val=0, n=0;
n<(ltaps>>1); n++, fi++, pixel++, pixel1--)
val += ( *fi * (*pixel + *pixel1));
*tmp_out++ = val;
}
/* if Highpass are zeros, skip */
if(ZeroHigh== DWT_NONZERO_HIGH) {
for(m=0;m<Length+2*border+1;m++) buf[m]= (DWTDATA) 0;
a = buf+border+1;
for(m=PosFlag;m< Length; m+=2) {
a[m] = InH[m>>1];
}
/* anti-symmetric extension */
for (m=1 ; m<=border; m++) {
a[-m-1] = -a[m-1]; /* to allow Shorter seg */ /*symmetric poInt a[-1] */
a[r+m] = -a[r-m]; /*symmetric poInt a[r] */
}
tmp_out = Out;
for (; a<f; a ++){
/* filter the pixel with highpass filter */
for(fi=HPCoeff, pixel=a-hoffset, pixel1 = pixel+ htaps-1, val=0, n=0;
n<(htaps>>1); n++, fi++, pixel++, pixel1--) {
val += ( *fi * (*pixel - *pixel1));
}
*tmp_out++ += val;
}
}
free(buf);
return(DWT_OK);
}
#ifdef _DWT_INT_
#undef _DWT_INT_
#define _DWT_DBL_
#include "idwt_aux.cpp"
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -