📄 adaptive_filter.c
字号:
/*!
************************************************************************
* \file adaptive_filter.c
*
* \brief
* adaptive filter routines
*
* \author
* Yuri Vatis <vatis@tnt.uni-hannover.de> \n
*
* This software may be used for research purposes only.
* Universitaet Hannover would also appreciate that all those using the
* software or any extension of it in any way comply with the
* following condition:
* Including in any technical report, conference or journal paper
* produced which uses the software or any extension of it in
* any way, at least one of bibliographic references:
* Yuri Vatis, Bernd Edler, Dieu Thanh Nguyen, J鰎n Ostermann,
* "Motion-and Aliasing-compensated Prediction using a two-dimensional non-separable
* Adaptive Wiener Interpolation Filter",
* Proc. ICIP 2005, IEEE International Conference on Image Processing, Genova, Italy, September 2005.
* Yuri Vatis, Bernd Edler, Ingolf Wassermann, Dieu Thanh Nguyen, J鰎n Ostermann,
* "Coding of Coefficients of two-dimensional non-separable Adaptive Wiener Interpolation Filter",
* Proc. VCIP 2005, SPIE Visual Communication & Image Processing, Beijing, China, July 2005.
************************************************************************
*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include "global.h"
#include "adaptive_filter.h"
#include "memalloc.h"
#include "malloc.h"
#include "defines.h"
#include "mbuffer.h"
#include "image.h"
#include "vlc.h"
#ifdef DIRECTIONAL_FILTER
#include <memory.h>
#include "../../lcommon/inc/adaptive_filter_1DAIF.h"
#include "../../lcommon/inc/adaptive_filter_orig.h"
#include "header.h"
#endif
#ifdef ADAPTIVE_FILTER
int TwoDEquationPattern[15][SQR_FILTER] = // get equation number for symmetric filter coefficients
{
{ 0, 1, 2, 3, 4, 5,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, // a_pos
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0 },
{ 0, 1, 2, 2, 1, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, // b_pos
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0 },
{ 5, 4, 3, 2, 1, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, // c_pos
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0 },
{ 0, 1, 2, 3, 4, 5,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, // d_pos
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0 },
{ 0, 1, 2, 3, 4, 5,
1, 6, 7, 8, 9, 10,
2, 7, 11, 12, 13, 14, // e_pos
3, 8, 12, 15, 16, 17,
4, 9, 13, 16, 18, 19,
5, 10, 14, 17, 19, 20 },
{ 0, 1, 2, 2, 1, 0,
3, 4, 5, 5, 4, 3,
6, 7, 8, 8, 7, 6, // f_pos
9, 10, 11, 11, 10, 9,
12, 13, 14, 14, 13, 12,
15, 16, 17, 17, 16, 15 },
{ 5, 4, 3, 2, 1, 0,
10, 9, 8, 7, 6, 1,
14, 13, 12, 11, 7, 2, // g_pos
17, 16, 15, 12, 8, 3,
19, 18, 16, 13, 9, 4,
20, 19, 17, 14, 10, 5 },
{ 0, 1, 2, 2, 1, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, // h_pos
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0 },
{ 0, 3, 6, 9, 12, 15,
1, 4, 7, 10, 13, 16,
2, 5, 8, 11, 14, 17, // i_pos
2, 5, 8, 11, 14, 17,
1, 4, 7, 10, 13, 16,
0, 3, 6, 9, 12, 15 },
{ 0, 1, 2, 2, 1, 0,
1, 3, 4, 4, 3, 1,
2, 4, 5, 5, 4, 2, // j_pos
2, 4, 5, 5, 4, 2,
1, 3, 4, 4, 3, 1,
0, 1, 2, 2, 1, 0 },
{15, 12, 9, 6, 3, 0,
16, 13, 10, 7, 4, 1,
17, 14, 11, 8, 5, 2, // k_pos
17, 14, 11, 8, 5, 2,
16, 13, 10, 7, 4, 1,
15, 12, 9, 6, 3, 0 },
{ 5, 4, 3, 2, 1, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, // l_pos
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0 },
{ 5, 10, 14, 17, 19, 20,
4, 9, 13, 16, 18, 19,
3, 8, 12, 15, 16, 17, // m_pos
2, 7, 11, 12, 13, 14,
1, 6, 7, 8, 9, 10,
0, 1, 2, 3, 4, 5 },
{15, 16, 17, 17, 16, 15,
12, 13, 14, 14, 13, 12,
9, 10, 11, 11, 10, 9, // n_pos
6, 7, 8, 8, 7, 6,
3, 4, 5, 5, 4, 3,
0, 1, 2, 2, 1, 0 },
{20, 19, 17, 14, 10, 5,
19, 18, 16, 13, 9, 4,
17, 16, 15, 12, 8, 3, // o_pos
14, 13, 12, 11, 7, 2,
10, 9, 8, 7, 6, 1,
5, 4, 3, 2, 1, 0 }
};
double STANDARD_2D_FILTER[15][SQR_FILTER] = {
{ 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
1.0/64.0 , -5.0/64.0 , 52.0/64.0 , 20.0/64.0 , -5.0/64.0 , 1.0/64.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0
}, // a_pos
{ 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
1.0/32.0 , -5.0/32.0 , 20.0/32.0 , 20.0/32.0 , -5.0/32.0 , 1.0/32.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0
}, // b_pos
{ 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
1.0/64.0 , -5.0/64.0 , 20.0/64.0 , 52.0/64.0 , -5.0/64.0 , 1.0/64.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0
}, // c_pos
{ 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 52.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 20.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0
}, // d_pos
{ 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
1.0/64.0 , -5.0/64.0 , 40.0/64.0 , 20.0/64.0 , -5.0/64.0 , 1.0/64.0 ,
0.0 , 0.0 , 20.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0
}, // e_pos
{ 1.0/2048.0, -5.0/2048.0, 20.0/2048.0, 20.0/2048.0, -5.0/2048.0, 1.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -100.0/2048.0, -100.0/2048.0, 25.0/2048.0, -5.0/2048.0,
52.0/2048.0, -260.0/2048.0, 1040.0/2048.0, 1040.0/2048.0, -260.0/2048.0, 52.0/2048.0,
20.0/2048.0, -100.0/2048.0, 400.0/2048.0, 400.0/2048.0, -100.0/2048.0, 20.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -100.0/2048.0, -100.0/2048.0, 25.0/2048.0, -5.0/2048.0,
1.0/2048.0, -5.0/2048.0, 20.0/2048.0, 20.0/2048.0, -5.0/2048.0, 1.0/2048.0
}, // f_pos
{ 0.0 , 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 ,
1.0/64.0 , -5.0/64.0 , 20.0/64.0 , 40.0/64.0 , -5.0/64.0 , 1.0/64.0 ,
0.0 , 0.0 , 0.0 , 20.0/64.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0
}, // g_pos
{ 0.0 , 0.0 , 1.0/32.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/32.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 20.0/32.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 20.0/32.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/32.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 1.0/32.0 , 0.0 , 0.0 , 0.0
}, // h_pos
{ 1.0/2048.0, -5.0/2048.0, 52.0/2048.0, 20.0/2048.0, -5.0/2048.0, 1.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -260.0/2048.0, -100.0/2048.0, 25.0/2048.0, -5.0/2048.0,
20.0/2048.0, -100.0/2048.0, 1040.0/2048.0, 400.0/2048.0, -100.0/2048.0, 20.0/2048.0,
20.0/2048.0, -100.0/2048.0, 1040.0/2048.0, 400.0/2048.0, -100.0/2048.0, 20.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -260.0/2048.0, -100.0/2048.0, 25.0/2048.0, -5.0/2048.0,
1.0/2048.0, -5.0/2048.0, 52.0/2048.0, 20.0/2048.0, -5.0/2048.0, 1.0/2048.0
}, // i_pos
{ 1.0/1024.0, -5.0/1024.0, 20.0/1024.0, 20.0/1024.0, -5.0/1024.0, 1.0/1024.0,
-5.0/1024.0, 25.0/1024.0, -100.0/1024.0, -100.0/1024.0, 25.0/1024.0, -5.0/1024.0,
20.0/1024.0, -100.0/1024.0, 400.0/1024.0, 400.0/1024.0, -100.0/1024.0, 20.0/1024.0,
20.0/1024.0, -100.0/1024.0, 400.0/1024.0, 400.0/1024.0, -100.0/1024.0, 20.0/1024.0,
-5.0/1024.0, 25.0/1024.0, -100.0/1024.0, -100.0/1024.0, 25.0/1024.0, -5.0/1024.0,
1.0/1024.0, -5.0/1024.0, 20.0/1024.0, 20.0/1024.0, -5.0/1024.0, 1.0/1024.0
}, // j_pos
{ 1.0/2048.0, -5.0/2048.0, 20.0/2048.0, 52.0/2048.0, -5.0/2048.0, 1.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -100.0/2048.0, -260.0/2048.0, 25.0/2048.0, -5.0/2048.0,
20.0/2048.0, -100.0/2048.0, 400.0/2048.0, 1040.0/2048.0, -100.0/2048.0, 20.0/2048.0,
20.0/2048.0, -100.0/2048.0, 400.0/2048.0, 1040.0/2048.0, -100.0/2048.0, 20.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -100.0/2048.0, -260.0/2048.0, 25.0/2048.0, -5.0/2048.0,
1.0/2048.0, -5.0/2048.0, 20.0/2048.0, 52.0/2048.0, -5.0/2048.0, 1.0/2048.0
}, // i_pos
{ 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 20.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 52.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0
}, // l_pos
{ 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 20.0/64.0 , 0.0 , 0.0 , 0.0 ,
1.0/64.0 , -5.0/64.0 , 40.0/64.0 , 20.0/64.0 , -5.0/64.0 , 1.0/64.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0
}, // m_pos
{ 1.0/2048.0, -5.0/2048.0, 20.0/2048.0, 20.0/2048.0, -5.0/2048.0, 1.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -100.0/2048.0, -100.0/2048.0, 25.0/2048.0, -5.0/2048.0,
20.0/2048.0, -100.0/2048.0, 400.0/2048.0, 400.0/2048.0, -100.0/2048.0, 20.0/2048.0,
52.0/2048.0, -260.0/2048.0, 1040.0/2048.0, 1040.0/2048.0, -260.0/2048.0, 52.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -100.0/2048.0, -100.0/2048.0, 25.0/2048.0, -5.0/2048.0,
1.0/2048.0, -5.0/2048.0, 20.0/2048.0, 20.0/2048.0, -5.0/2048.0, 1.0/2048.0
}, // n_pos
{ 0.0 , 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 20.0/64.0 , 0.0 , 0.0 ,
1.0/64.0 , -5.0/64.0 , 20.0/64.0, 40.0/64.0 , -5.0/64.0 , 1.0/64.0 ,
0.0 , 0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0
} // o_pos
};
// separable aif (BEGIN)
static double STANDARD_2D_FILTER_SEP[15][SQR_FILTER] = {
{1.0 / 64.0, -5.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // a_pos
{1.0 / 32.0, -5.0 / 32.0, 20.0 / 32.0, 20.0 / 32.0, -5.0 / 32.0, 1.0 / 32.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // b_pos
{1.0 / 64.0, -5.0 / 64.0, 20.0 / 64.0, 52.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // c_pos
{1.0 / 64.0, -5.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // d_pos
{1.0 / 64.0, -5.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // e_pos
{1.0 / 64.0, -5.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // f_pos
{1.0 / 64.0, -5.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // g_pos
{1.0 / 32.0, -5.0 / 32.0, 20.0 / 32.0, 20.0 / 32.0, -5.0 / 32.0, 1.0 / 32.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // h_pos
{1.0 / 32.0, -5.0 / 32.0, 20.0 / 32.0, 20.0 / 32.0, -5.0 / 32.0, 1.0 / 32.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // i_pos
{1.0 / 32.0, -5.0 / 32.0, 20.0 / 32.0, 20.0 / 32.0, -5.0 / 32.0, 1.0 / 32.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // j_pos
{1.0 / 32.0, -5.0 / 32.0, 20.0 / 32.0, 20.0 / 32.0, -5.0 / 32.0, 1.0 / 32.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // k_pos
{1.0 / 64.0, -5.0 / 64.0, 20.0 / 64.0, 52.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // l_pos
{1.0 / 64.0, -5.0 / 64.0, 20.0 / 64.0, 52.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // m_pos
{1.0 / 64.0, -5.0 / 64.0, 20.0 / 64.0, 52.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -