8 * 8 행렬의 dct를 계산할 수 있었고 역 분개를 수행하는 데 문제가 있습니다. 누구든지이 코드를보고 내가 지금하고있는 일을 말해 줄 수 있습니까? 이전과 완전히 똑같은 값을 가져야하지만 다른 값을 얻고 있어야합니다. 나는 csv 파일에서 입력을 읽고 다른 하나의 csv 파일에 저장하고있다. 그것의 C 프로그래밍dct 8 * 8 행렬의 역함을 구현하려고 시도했습니다.
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
원래
는 입력의 예를 줘 함께, 당신은 단어를 이해 할 수없는 경우 여기에 코드입니다 예상 출력과 실제 출력을 비교합니다. 또한, 디버거에서 이것을 실행하여 무엇을 배웠습니까? –
또한 DCT에 대한 많은 정의가 있습니다 (http://en.wikipedia.org/wiki/Discrete_cosine_transform#Formal_definition). 어느 쪽이 원하는거야? –
코드에 좀 더 깊이 들어가야합니다. 단계별로 진행하지 않을 것입니다. 중간 결과가 정확합니까? 출력 값이 예상 한 값과 대략 동일합니까? –