gpt4 book ai didi

c - 尝试实现 dct 8*8 矩阵的逆

转载 作者:太空宇宙 更新时间:2023-11-04 06:40:44 25 4
gpt4 key购买 nike

我已经设法计算了 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应该和原来的一样

最佳答案

您正在尝试就地计算 IDCT,使用 idctMatrix[][] 作为输入和输出,因此在此过程中输入被修改。那是错误的。您需要有一个单独的二维数组用于输入(或输出)。

还显示,依赖于 u 和 v 的比例因子 CuCv 应用在 u 和 v 循环之外。那也是错误的。

编辑:如果您无法理解这些词,请查看代码:

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

#ifndef M_PI
#define M_PI 3.14159265358979324
#endif

void Compute8x8Dct(const double in[8][8], double out[8][8])
{
int i, j, u, v;
double s;

for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
s = 0;

for (u = 0; u < 8; u++)
for (v = 0; v < 8; v++)
s += in[u][v] * cos((2 * u + 1) * i * M_PI / 16) *
cos((2 * v + 1) * j * M_PI / 16) *
((i == 0) ? 1 / sqrt(2) : 1) *
((j == 0) ? 1 / sqrt(2) : 1);

out[i][j] = s / 4;
}
}

void Compute8x8Idct(const double in[8][8], double out[8][8])
{
int i, j, u, v;
double s;

for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
s = 0;

for (u = 0; u < 8; u++)
for (v = 0; v < 8; v++)
s += in[u][v] * cos((2 * i + 1) * u * M_PI / 16) *
cos((2 * j + 1) * v * M_PI / 16) *
((u == 0) ? 1 / sqrt(2) : 1.) *
((v == 0) ? 1 / sqrt(2) : 1.);

out[i][j] = s / 4;
}
}

void Print8x8(const char* title, const double in[8][8])
{
int i, j;

printf("%s\n", title);

for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
printf("%8.3f ", in[i][j]);
printf("\n");
}
}

int main(void)
{
double pic1[8][8], dct[8][8], pic2[8][8];
int i, j;

for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
#if 01
pic1[i][j] = 255;
#else
pic1[i][j] = (i ^ j) & 1;
#endif
Print8x8("pic1:", pic1);
Compute8x8Dct(pic1, dct);
Print8x8("dct:", dct);
Compute8x8Idct(dct, pic2);
Print8x8("pic2:", pic2);

return 0;
}

这是它的输出:

pic1:
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
dct:
2040.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
pic2:
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000

关于c - 尝试实现 dct 8*8 矩阵的逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8553717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com