Mercurial > hg > wm
comparison Meerwald/dct.c @ 3:acb6967ee76d
update to 0.5
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Tue, 14 Aug 2007 21:11:21 +0200 |
parents | be303a3f5ea8 |
children | f83ef905a63d |
comparison
equal
deleted
inserted
replaced
2:b92f06d9a967 | 3:acb6967ee76d |
---|---|
43 fprintf(stderr, "dct_NxN: %d not a power of 2\n", N); | 43 fprintf(stderr, "dct_NxN: %d not a power of 2\n", N); |
44 exit(1); | 44 exit(1); |
45 } | 45 } |
46 }while((1<<dct_NxN_log2N)<N); | 46 }while((1<<dct_NxN_log2N)<N); |
47 if (dct_NxN_costable) free(dct_NxN_costable); | 47 if (dct_NxN_costable) free(dct_NxN_costable); |
48 dct_NxN_costable = (double*) malloc(N * sizeof(double)); | 48 dct_NxN_costable = malloc(N * sizeof(double)); |
49 #ifdef DEBUG | 49 #ifdef DEBUG |
50 if(!dct_NxN_costable){ | 50 if(!dct_NxN_costable){ |
51 fprintf(stderr, "Unable to allocate C array\n"); | 51 fprintf(stderr, "Unable to allocate C array\n"); |
52 exit(1); | 52 exit(1); |
53 } | 53 } |
76 free(dct_NxN_tmp); | 76 free(dct_NxN_tmp); |
77 | 77 |
78 N = width; | 78 N = width; |
79 M = height; | 79 M = height; |
80 | 80 |
81 dct_NxN_tmp = (double *) malloc(height * sizeof(double)); | 81 dct_NxN_tmp = malloc(height * sizeof(double)); |
82 #ifdef DEBUG | 82 #ifdef DEBUG |
83 if (!dct_NxN_tmp) { | 83 if (!dct_NxN_tmp) { |
84 fprintf(stderr, "init_dct_NxN(): failed to allocate memory\n"); | 84 fprintf(stderr, "init_dct_NxN(): failed to allocate memory\n"); |
85 exit(1); | 85 exit(1); |
86 } | 86 } |
244 int u,v; | 244 int u,v; |
245 double two_over_sqrtncolsnrows = 2.0/sqrt((double) N*M); | 245 double two_over_sqrtncolsnrows = 2.0/sqrt((double) N*M); |
246 | 246 |
247 for (u=0; u < N; u++) | 247 for (u=0; u < N; u++) |
248 for (v=0; v < M; v++) | 248 for (v=0; v < M; v++) |
249 dcts[u][v] = ((int) pixels[u][v]-128); | 249 dcts[u][v] = ((int) pixels[u][v] - 128); |
250 | 250 |
251 for (u=0; u<=M-1; u++){ | 251 for (u=0; u<=M-1; u++){ |
252 fct_noscale(dcts[u]); | 252 fct_noscale(dcts[u]); |
253 } | 253 } |
254 for (v=0; v<=N-1; v++){ | 254 for (v=0; v<=N-1; v++){ |
537 /* MatrixMultiply( temp, input, Ct ); */ | 537 /* MatrixMultiply( temp, input, Ct ); */ |
538 for ( i = 0 ; i < NJPEG ; i++ ) { | 538 for ( i = 0 ; i < NJPEG ; i++ ) { |
539 for ( j = 0 ; j < NJPEG ; j++ ) { | 539 for ( j = 0 ; j < NJPEG ; j++ ) { |
540 temp[ i ][ j ] = 0.0; | 540 temp[ i ][ j ] = 0.0; |
541 for ( k = 0 ; k < NJPEG ; k++ ) | 541 for ( k = 0 ; k < NJPEG ; k++ ) |
542 temp[ i ][ j ] += ( (int) input[ i ][ k ]) * | 542 temp[ i ][ j ] += ( (int) input[ i ][ k ] - 128 ) * |
543 Ct[ k ][ j ]; | 543 Ct[ k ][ j ]; |
544 } | 544 } |
545 } | 545 } |
546 | 546 |
547 /* MatrixMultiply( output, C, temp ); */ | 547 /* MatrixMultiply( output, C, temp ); */ |
591 for ( i = 0 ; i < NJPEG ; i++ ) { | 591 for ( i = 0 ; i < NJPEG ; i++ ) { |
592 for ( j = 0 ; j < NJPEG ; j++ ) { | 592 for ( j = 0 ; j < NJPEG ; j++ ) { |
593 temp1 = 0.0; | 593 temp1 = 0.0; |
594 for ( k = 0 ; k < NJPEG ; k++ ) | 594 for ( k = 0 ; k < NJPEG ; k++ ) |
595 temp1 += Ct[ i ][ k ] * temp[ k ][ j ]; | 595 temp1 += Ct[ i ][ k ] * temp[ k ][ j ]; |
596 temp1 += 128.0; | |
596 output[i][j] = PIXELRANGE(ROUND(temp1)); | 597 output[i][j] = PIXELRANGE(ROUND(temp1)); |
597 } | 598 } |
598 } | 599 } |
599 } | 600 } |
600 | 601 |