Changing default 8-tap filter to Langrangian interpolator.
authorDeb Mukherjee <debargha@google.com>
Fri, 24 Feb 2012 17:08:00 +0000 (09:08 -0800)
committerDeb Mukherjee <debargha@google.com>
Fri, 24 Feb 2012 19:13:36 +0000 (11:13 -0800)
The Lagrangian interpolation filter is maximally flat in the
passband. There is non-trivial improvement with the hd set, while
for derf the results are virtually unchanged.
See:
http://www.corp.google.com/~debargha/vp8_results/enhinterpn.html (derf)
http://www.corp.google.com/~debargha/vp8_results/enhinterpn_hd.html (HD)

Patch 2: Updated the results for derf in the html above to use the
new baseline. There is still about 4% improvement. Will update the
hd baseline later (since it takes 9 hours to run on my machine)

Patch 3: By mistake the default filter was left at 60 - should be 0
to use the new interpolation filter.

Change-Id: If5f64444976562415d68a2aeabb94fdfa0d47890

vp8/common/filter.c

index bf5cefc..2e3acc2 100644 (file)
@@ -45,7 +45,7 @@ DECLARE_ALIGNED(16, const short, vp8_bilinear_filters[SUBPEL_SHIFTS][2]) =
 };
 
 #if CONFIG_ENHANCED_INTERP
-#define FILTER_ALPHA 60
+#define FILTER_ALPHA 0
 DECLARE_ALIGNED(16, const short, vp8_sub_pel_filters[SUBPEL_SHIFTS][2*INTERP_EXTEND]) =
 {
     /* Generated using MATLAB:
@@ -56,25 +56,7 @@ DECLARE_ALIGNED(16, const short, vp8_sub_pel_filters[SUBPEL_SHIFTS][2*INTERP_EXT
      * disp(num2str(ba, '%d,'))
      */
 #if SUBPEL_SHIFTS==16
-#if FILTER_ALPHA == 75
-    /* alpha = 0.75 */
-    { 0,   0,   0, 128,   0,   0,   0,  0},
-    {-1,   2,  -6, 126,   9,  -3,   2, -1},
-    {-1,   4, -11, 123,  18,  -7,   3, -1},
-    {-2,   6, -16, 119,  28, -10,   5, -2},
-    {-2,   7, -19, 113,  38, -13,   6, -2},
-    {-3,   8, -21, 106,  49, -16,   7, -2},
-    {-3,   9, -22,  99,  59, -19,   8, -3},
-    {-3,   9, -23,  90,  70, -21,   9, -3},
-    {-3,   9, -22,  80,  80, -22,   9, -3},
-    {-3,   9, -21,  70,  90, -23,   9, -3},
-    {-3,   8, -19,  59,  99, -22,   9, -3},
-    {-2,   7, -16,  49, 106, -21,   8, -3},
-    {-2,   6, -13,  38, 113, -19,   7, -2},
-    {-2,   5, -10,  28, 119, -16,   6, -2},
-    {-1,   3,  -7,  18, 123, -11,   4, -1},
-    {-1,   2,  -3,   9, 126,  -6,   2, -1}
-#elif FILTER_ALPHA == 70
+#if FILTER_ALPHA == 70
     /* alpha = 0.70 */
     { 0,   0,   0, 128,   0,   0,   0,  0},
     { 0,   2,  -6, 126,   8,  -3,   1,  0},
@@ -109,7 +91,7 @@ DECLARE_ALIGNED(16, const short, vp8_sub_pel_filters[SUBPEL_SHIFTS][2*INTERP_EXT
     {-1,   5, -13,  38, 112, -17,   5, -1},
     {-1,   4, -10,  27, 118, -14,   5, -1},
     {-1,   2,  -6,  18, 123, -10,   3, -1},
-    {0,   1,  -3,   8, 126,  -6,   2, 0}
+    { 0,   1,  -3,   8, 126,  -6,   2,  0}
 #elif FILTER_ALPHA == 60
     /* alpha = 0.60 */
     { 0,   0,   0, 128,   0,   0,   0,  0},
@@ -127,11 +109,11 @@ DECLARE_ALIGNED(16, const short, vp8_sub_pel_filters[SUBPEL_SHIFTS][2*INTERP_EXT
     {-1,   4, -12,  38, 112, -17,   5, -1},
     {-1,   3,  -9,  28, 118, -14,   4, -1},
     {-1,   2,  -6,  18, 123, -10,   3, -1},
-    {0,   1,  -3,   8, 126,  -6,   2,   0}
+    { 0,   1,  -3,   8, 126,  -6,   2,  0}
 #elif FILTER_ALPHA == 55
     /* alpha = 0.55 */
-    {0,   0,   0, 128,   0,   0,    0,  0},
-    {0,   1,  -5, 126,   8,  -3,    1,  0},
+    { 0,   0,   0, 128,   0,   0,   0,  0},
+    { 0,   1,  -5, 126,   8,  -3,   1,  0},
     {-1,   2, -10, 123,  18,  -6,   2,  0},
     {-1,   4, -13, 118,  27,  -9,   3, -1},
     {-1,   5, -16, 112,  37, -12,   4, -1},
@@ -144,21 +126,47 @@ DECLARE_ALIGNED(16, const short, vp8_sub_pel_filters[SUBPEL_SHIFTS][2*INTERP_EXT
     {-1,   4, -14,  48, 105, -18,   5, -1},
     {-1,   4, -12,  37, 112, -16,   5, -1},
     {-1,   3,  -9,  27, 118, -13,   4, -1},
-    {0,   2,  -6,  18, 123, -10,   2,  -1},
-    {0,   1,  -3,   8, 126,  -5,   1,   0}
+    { 0,   2,  -6,  18, 123, -10,   2, -1},
+    { 0,   1,  -3,   8, 126,  -5,   1,  0}
+#elif FILTER_ALPHA == 50
+    /* alpha = 0.50 */
+    { 0,   0,   0, 128,   0,   0,   0,  0},
+    { 0,   1,  -5, 126,   8,  -3,   1,  0},
+    { 0,   2, -10, 122,  18,  -6,   2,  0},
+    {-1,   3, -13, 118,  27,  -9,   3,  0},
+    {-1,   4, -16, 112,  37, -11,   3,  0},
+    {-1,   5, -17, 104,  48, -14,   4, -1},
+    {-1,   5, -18,  96,  58, -16,   5, -1},
+    {-1,   5, -19,  88,  68, -17,   5, -1},
+    {-1,   5, -18,  78,  78, -18,   5, -1},
+    {-1,   5, -17,  68,  88, -19,   5, -1},
+    {-1,   5, -16,  58,  96, -18,   5, -1},
+    {-1,   4, -14,  48, 104, -17,   5, -1},
+    { 0,   3, -11,  37, 112, -16,   4, -1},
+    { 0,   3,  -9,  27, 118, -13,   3, -1},
+    { 0,   2,  -6,  18, 122, -10,   2,  0},
+    { 0,   1,  -3,   8, 126,  -5,   1,  0}
+#elif FILTER_ALPHA == 0
+    /* Lagrangian interpolation filter */
+    { 0,   0,   0, 128,   0,   0,   0,   0},
+    { 0,   1,  -5, 126,   8,  -3,   1,   0},
+    {-1,   3, -10, 122,  18,  -6,   2,   0},
+    {-1,   4, -13, 118,  27,  -9,   3,  -1},
+    {-1,   4, -16, 112,  37, -11,   4,  -1},
+    {-1,   5, -18, 105,  48, -14,   4,  -1},
+    {-1,   5, -19,  97,  58, -16,   5,  -1},
+    {-1,   6, -19,  88,  68, -18,   5,  -1},
+    {-1,   6, -19,  78,  78, -19,   6,  -1},
+    {-1,   5, -18,  68,  88, -19,   6,  -1},
+    {-1,   5, -16,  58,  97, -19,   5,  -1},
+    {-1,   4, -14,  48, 105, -18,   5,  -1},
+    {-1,   4, -11,  37, 112, -16,   4,  -1},
+    {-1,   3,  -9,  27, 118, -13,   4,  -1},
+    { 0,   2,  -6,  18, 122, -10,   3,  -1},
+    { 0,   1,  -3,   8, 126,  -5,   1,   0}
 #endif  /* FILTER_ALPHA */
 #else   /* SUBPEL_SHIFTS==16 */
-#if FILTER_ALPHA == 75
-    /* alpha = 0.75 */
-    { 0,   0,   0, 128,   0,   0,   0,  0},
-    {-1,   4, -11, 123,  18,  -7,   3, -1},
-    {-2,   7, -19, 113,  38, -13,   6, -2},
-    {-3,   9, -22,  99,  59, -19,   8, -3},
-    {-3,   9, -22,  80,  80, -22,   9, -3},
-    {-3,   8, -19,  59,  99, -22,   9, -3},
-    {-2,   6, -13,  38, 113, -19,   7, -2},
-    {-1,   3,  -7,  18, 123, -11,   4, -1}
-#elif FILTER_ALPHA == 70
+#if FILTER_ALPHA == 70
     /* alpha = 0.70 */
     { 0,   0,   0, 128,   0,   0,   0,  0},
     {-1,   4, -11, 123,  18,  -7,   3, -1},
@@ -198,6 +206,26 @@ DECLARE_ALIGNED(16, const short, vp8_sub_pel_filters[SUBPEL_SHIFTS][2*INTERP_EXT
     {-1,   5, -16,  58,  97, -19,   5, -1},
     {-1,   4, -12,  37, 112, -16,   5, -1},
     { 0,   2,  -6,  18, 123, -10,   2, -1}
+#elif FILTER_ALPHA == 50
+    /* alpha = 0.50 */
+    { 0,   0,   0, 128,   0,   0,   0,  0},
+    { 0,   2, -10, 122,  18,  -6,   2,  0},
+    {-1,   4, -16, 112,  37, -11,   3,  0},
+    {-1,   5, -18,  96,  58, -16,   5, -1},
+    {-1,   5, -18,  78,  78, -18,   5, -1},
+    {-1,   5, -16,  58,  96, -18,   5, -1},
+    { 0,   3, -11,  37, 112, -16,   4, -1},
+    { 0,   2,  -6,  18, 122, -10,   2,  0}
+#elif FILTER_ALPHA == 0
+    /* Lagrangian interpolation filter */
+    { 0,   0,   0, 128,   0,   0,   0,   0},
+    {-1,   3, -10, 122,  18,  -6,   2,   0},
+    {-1,   4, -16, 112,  37, -11,   4,  -1},
+    {-1,   5, -19,  97,  58, -16,   5,  -1},
+    {-1,   6, -19,  78,  78, -19,   6,  -1},
+    {-1,   5, -16,  58,  97, -19,   5,  -1},
+    {-1,   4, -11,  37, 112, -16,   4,  -1},
+    { 0,   2,  -6,  18, 122, -10,   3,  -1},
 #endif  /* FILTER_ALPHA */
 #endif  /* SUBPEL_SHIFTS==16 */
 };