2011-12-18 10 views
0

Мне удалось вычислить dct матрицы 8 * 8, и у меня возникли проблемы с обратным. Может кто-нибудь взглянуть на этот код и рассказать мне, что я делаю сейчас. Я должен получать те же значения, что и раньше, но im получать разные значения. Я читаю входные данные csv-файла и помещаю его в файл пыльника csv. Его программируются сПопытка реализовать Обратное к матрице 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}}; 

ДКП является:

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 рассчитывается должна быть такой же, как оригинал

+3

Пожалуйста, дайте пример ввода, что он не включен, а с ожидаемым выходом и фактическим выходом. Кроме того, что вы узнали, выполнив это в отладчике? –

+2

Кроме того, существует множество определений DCT (http://en.wikipedia.org/wiki/Discrete_cosine_transform#Formal_definition). Какой вы хотите? –

+1

Вы должны получить что-то более глубокое в коде. Мы не будем проходить его шаг за шагом. Правильны ли промежуточные результаты? Являются ли выходные значения приблизительно равными ожидаемым значениям? –

ответ

4

Вы» re пытается вычислить IDCT на месте, используя idctMatrix[][] как входной, так и выходной и, следовательно, В этом процессе изменяется входной сигнал. Это неверно. Для ввода (или вывода) необходимо иметь отдельный двумерный массив.

Похоже, что u- и v-зависимые масштабные коэффициенты Cu и Cv применяются вне u- и v-петель. Это было бы неправильно.

EDIT: Вот код, если вы не можете понять слова:

#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 
+0

извинения alex i пропустил одну строку в моем коде, она принимает inMatrix [8] [8], а выходная матрица - это idctMatrix [ 8] [8], спасибо за помощь в любом случае – user427641

+0

Похоже, что вы полностью проигнорировали мой ответ, по крайней мере, я не вижу никаких изменений в коде для устранения указанных проблем. Хорошая работа, продолжайте. –

+0

Я не пренебрег вашим ответом, он не кажется правильным. Я думал, что это – user427641