【发布时间】:2016-08-25 14:15:26
【问题描述】:
我设法计算了一个 8*8 矩阵的 dct,但我在做逆运算时遇到了麻烦。任何人都可以看看这段代码并告诉我我现在在做什么。我应该得到与以前完全相同的值,但我得到不同的值。我正在读取来自 csv 文件的输入并将其放入另一个 csv 文件。它在c中编程
void idct_func(float inMatrix[8][8]){
double idct,
Cu,
sum,
Cv;
int i,
j,
u,
v;
float idctMatrix[8][8],
greyLevel;
FILE * fp = fopen("mydata.csv", "r");
FILE * wp = fopen("idct.csv", "w");
fprintf(fp, "\n Inverse DCT");
for (i = 0; i < 8; ++i) {
for (j = 0; j < 8; ++j) {
sum = 0.0;
for (u = 0; u < 8; u++) {
for (v = 0; v < 8; v++) {
if (u == 0)
Cu = 1.0 / sqrt(2.0);
else
Cu = 1.0;
if (v == 0)
Cv = 1.0 / sqrt(2.0);
else
Cv = (1.0);
// Level around 0
greyLevel = idctMatrix[u][v];
idct = (greyLevel * cos((2 * i + 1) * u * M_PI / 16.0) *
cos((2 * j + 1) * v * M_PI / 16.0));
sum += idct;
}
}
idctMatrix[i][j] = 0.25 * Cu * Cv * sum;
fprintf(wp, "\n %f", idctMatrix[i][j]);
}
fprintf(wp, "\n");
}
原来的矩阵是:
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255}};
dct 是:
2040 0 -0 0 0 0 -0 -0
0 0 0 0 -0 0 -0 0
-0 0 -0 0 0 0 0 0
0 -0 -0 -0 0 -0 -0 0
0 0 -0 0 -0 -0 -0 0
0 -0 -0 -0 -0 0 -0 -0
-0 -0 -0 0 0 0 0 -0
-0 0 0 0 -0 0 -0 0
计算出来的idct应该和原来的一样
【问题讨论】:
-
请给出一个失败的输入示例,以及预期输出和实际输出。另外,通过在调试器中运行它你学到了什么?
-
此外,DCT (en.wikipedia.org/wiki/…) 的定义也很多。你要哪一个?
-
您应该更深入地了解代码。我们不会一步一步来。中间结果正确吗?输出值是否与您期望的值大致相等?
-
我更新了原始矩阵是什么以及我计算的 dct 的样子
-
您的问题标题谈到矩阵逆,但内容似乎是关于 dct 逆。
标签: c trigonometry dct