2014-05-24 167 views
1

如何扩大并通过因子来缩放dctmtx从浮动系数得到下列整数值:转换浮点整数

浮动dctmtx:

((0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 0.3536), 
    (0.4904 0.4157 0.2778 0.0975 -0.0975 -0.2778 -0.4157 -0.4904), 
    (0.4619 0.1913 -0.1913 -0.4619 -0.4619 -0.1913 0.1913 0.4619), 
    (0.4157 -0.0975 -0.4904 -0.2778 0.2778 0.4904 0.0975 -0.4157), 
    (0.3536 -0.3536 -0.3536 0.3536 0.3536 -0.3536 -0.3536 0.3536), 
    (0.2778 -0.4904 0.0975 0.4157 -0.4157 -0.0975 0.4904 -0.2778), 
    (0.1913 -0.4619 0.4619 -0.1913 -0.1913 0.4619 -0.4619 0.1913), 
    (0.0975 -0.2778 0.4157 -0.4904 0.4904 -0.4157 0.2778 -0.0975) 
) 

整数dctmtx:

((125, 122, 115, 103, 88,  69,  47,  24 ), 
     (125, 103, 47, -24, -88, -122, -115,  -69 ), 
     (125, 69, -47, -122, -88,  24, 115,  103 ), 
     (125, 24, -115, -69, 88, 103, -47, -122 ), 
     (125, -24, -115,  69, 88, -103, -47,  122 ), 
     (125, -69, -47, 122, -88, -24, 115, -103 ), 
     (125, -103, 47,  24, -88, 122, -115,  69 ), 
     (125, -122, 115, -103, 88, -69,  47,  -24 ) 
    ); 
+0

之前,这似乎是不可能的回答,因为这两个-0.0975和-0.4619被映射到-88。请提供有关两个阵列的出处和连接的更多信息。 – LutzL

+0

但是,如果您要转置第二个矩阵,并独立重新调整行的大小,那么至少可以进行匹配。但是,仍然0.3536一次映射到125,第五行映射到88。 – LutzL

回答

0

如果离散余弦读向上变换,你会发现,基本系数是

cos(pi*i*(2*j+1)/16), i,j=0..7 

然后,第一表包括这些值由0.5缩放的,除了第一行/列,其按照0.25 * sqrt(2)= 1/sqrt(8)进行缩放。这是获得正交矩阵的正确方法。第一列的平方和为8,其余为4.

第二个表格是将余弦值与125相乘时的舍入结果。在使用转置矩阵计算逆变换时,必须注意适当重新调整矢量。


第一个表复制,除了第一列:

> [[ Cos(pi*i*(2*j+1)/16)/2 : i in [0..7] ]: j in [0..7] ];   
[ 
    [ 0.5, 0.49039264, 0.46193977, 0.41573481, 0.35355339, 0.27778512, 0.19134172, 0.09754516 ], 
    [ 0.5, 0.41573481, 0.19134172, -0.09754516, -0.35355339, -0.49039264, -0.46193977, -0.27778512 ], 
    [ 0.5, 0.27778512, -0.19134172, -0.49039264, -0.35355339, 0.09754516, 0.46193977, 0.41573481 ], 
    [ 0.5, 0.09754516, -0.46193977, -0.27778512, 0.35355339, 0.41573481, -0.19134172, -0.49039264 ], 
    [ 0.5, -0.09754516, -0.46193977, 0.27778512, 0.35355339, -0.41573481, -0.19134172, 0.49039264 ], 
    [ 0.5, -0.27778512, -0.19134172, 0.49039264, -0.35355339, -0.09754516, 0.46193977, -0.41573481 ], 
    [ 0.5, -0.41573481, 0.19134172, 0.09754516, -0.35355339, 0.49039264, -0.46193977, 0.27778512 ], 
    [ 0.5, -0.49039264, 0.46193977, -0.41573481, 0.35355339, -0.27778512, 0.19134172, -0.09754516 ] 
] 

二表,整数四舍五入

> [[ Cos(pi*i*(2*j+1)/16) *125 : i in [0..7] ]: j in [0..7] ];  
[ 
    [ 125, 122.5982, 115.4849, 103.9337, 88.3883, 69.4463, 47.8354, 24.3863 ], 
    [ 125, 103.9337, 47.8354, -24.3863, -88.3883, -122.5982, -115.4849, -69.4463 ], 
    [ 125, 69.4463, -47.8354, -122.5982, -88.3883, 24.3863, 115.4849, 103.9337 ], 
    [ 125, 24.3863, -115.4849, -69.4463, 88.3883, 103.9337, -47.8354, -122.5982 ], 
    [ 125, -24.3863, -115.4849, 69.4463, 88.3883, -103.9337, -47.8354, 122.5982 ], 
    [ 125, -69.4463, -47.8354, 122.5982, -88.3883, -24.3863, 115.4849, -103.9337 ], 
    [ 125, -103.9337, 47.8354, 24.3863, -88.3883, 122.5982, -115.4849, 69.4463 ], 
    [ 125, -122.5982, 115.4849, -103.9337, 88.3883, -69.4463, 47.8354, -24.3863 ] 
] 
1

除了正在旋转的两个矩阵中的一个之外,两个矩阵似乎没有直接的线性关系:

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
int main (int argc, char *argv[]) 
{ 
    float dctmtx[8][8] = 
    { 0.3536, 0.3536, 0.3536, 0.3536, 0.3536, 0.3536, 0.3536, 0.3536, 
    0.4904, 0.4157, 0.2778, 0.0975, -0.0975, -0.2778, -0.4157, -0.4904, 
    0.4619, 0.1913, -0.1913, -0.4619, -0.4619, -0.1913, 0.1913, 0.4619, 
    0.4157, -0.0975, -0.4904, -0.2778, 0.2778, 0.4904, 0.0975, -0.4157, 
    0.3536, -0.3536, -0.3536, 0.3536, 0.3536, -0.3536, -0.3536, 0.3536, 
    0.2778, -0.4904, 0.0975, 0.4157, -0.4157, -0.0975, 0.4904, -0.2778, 
    0.1913, -0.4619, 0.4619, -0.1913, -0.1913, 0.4619, -0.4619, 0.1913, 
    0.0975, -0.2778, 0.4157, -0.4904, 0.4904, -0.4157, 0.2778, -0.0975 
    }; 

    int j,k, i; 
    float m; 
    for (j = 0; j < 8; j++) { 
     for (k = 0; k < 8; k++) { 
      if (k == 0) 
       m = (dctmtx[k][j] * 354) ; 
      else 
       m = (dctmtx[k][j] * 248) ; 
      i = lroundf(m); 
      printf("%4d ",i); 
     } 
     printf("\n"); 
    } 
} 

每一行中的第一个系数似乎是一个不同的精度高于其余:

%% convftoi 
125 122 115 103 88 69 47 24 
125 103 47 -24 -88 -122 -115 -69 
125 69 -47 -122 -88 24 115 103 
125 24 -115 -69 88 103 -47 -122 
125 -24 -115 69 88 -103 -47 122 
125 -69 -47 122 -88 -24 115 -103 
125 -103 47 24 -88 122 -115 69 
125 -122 115 -103 88 -69 47 -24 

一点小手段后找到缩放因素并给予匹配。

LutzL的回答后,我得到的算法浮动系数矩阵:

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 

#define PI 3.14159265359 

int main (int argc, char *argv[]) 
{ 
    float calcmtx[8][8]; 

    int j,k, i; 
    float m; 
    printf("float coefficients calculated\n"); 
    for (j = 0; j < 8; j++) { 
     for (k = 0; k < 8; k++) { 
      if (j == 0) 
       m = cos(PI*j*(2*k+1)/16)/(sqrt(2)*2) ; 
      else 
       m = cos(PI*j*(2*k+1)/16)/2 ; 
      calcmtx[k][j] = floorf(m*10000 + 0.5)/10000; 
     } 
    } 

    for (j = 0; j < 8; j++) { 
     for (k = 0; k < 8; k++) { 
      printf("% 2.4f ", calcmtx[k][j]); 
     } 
     printf("\n"); 
    } 
    printf("\n") ; 

    printf("integer coefficients derived\n"); 
    for (j = 0; j < 8; j++) { 
     for (k = 0; k < 8; k++) { 
      if (k == 0) 
       m = sqrt(2); 
      else 
       m = 1; 
      i = (int) (calcmtx[j][k] * 250 * m); 
      printf("%4d ", i); 
     } 
     printf("\n"); 
    } 
    printf("\n") ; 

    printf("approximated integer coefficients\n"); 
    for (j = 0; j < 8; j++) { 
     for (k = 0; k < 8; k++) { 
      if (k == 0) 
       m = calcmtx[j][k] * 354 ; 
      else 
       m = calcmtx[j][k] * 248 ; 
      i = lroundf(m); 
      printf("%4d ", i); 
     } 
     printf("\n"); 
    } 
} 

而且我们看到,整矩阵第一系数由平方根的二乘:

%% gencoeffi 
float coefficients calculated 
0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 
0.4904 0.4157 0.2778 0.0975 -0.0975 -0.2778 -0.4157 -0.4904 
0.4619 0.1913 -0.1913 -0.4619 -0.4619 -0.1913 0.1913 0.4619 
0.4157 -0.0975 -0.4904 -0.2778 0.2778 0.4904 0.0975 -0.4157 
0.3536 -0.3536 -0.3536 0.3536 0.3536 -0.3536 -0.3536 0.3536 
0.2778 -0.4904 0.0975 0.4157 -0.4157 -0.0975 0.4904 -0.2778 
0.1913 -0.4619 0.4619 -0.1913 -0.1913 0.4619 -0.4619 0.1913 
0.0975 -0.2778 0.4157 -0.4904 0.4904 -0.4157 0.2778 -0.0975 

integer coefficients derived 
125 122 115 103 88 69 47 24 
125 103 47 -24 -88 -122 -115 -69 
125 69 -47 -122 -88 24 115 103 
125 24 -115 -69 88 103 -47 -122 
125 -24 -115 69 88 -103 -47 122 
125 -69 -47 122 -88 -24 115 -103 
125 -103 47 24 -88 122 -115 69 
125 -122 115 -103 88 -69 47 -24 

approximated integer coefficients 
125 122 115 103 88 69 47 24 
125 103 47 -24 -88 -122 -115 -69 
125 69 -47 -122 -88 24 115 103 
125 24 -115 -69 88 103 -47 -122 
125 -24 -115 69 88 -103 -47 122 
125 -69 -47 122 -88 -24 115 -103 
125 -103 47 24 -88 122 -115 69 
125 -122 115 -103 88 -69 47 -24 

这与浮点精度受限时的近似值相符。