1 #include <math.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 #ifndef DATA_TYPE
6 #define DATA_TYPE double
7 #endif
8
9 typedef DATA_TYPE data_t;
10
main(int argc,const char ** argv)11 int main(int argc, const char **argv)
12 {
13 FILE *ref_file = 0;
14 FILE *dis_file = 0;
15 int w, h;
16 double ref_accum = 0;
17 double dis_accum = 0;
18 double mse_accum = 0;
19 double xsq_accum = 0;
20
21 double abs_err = 0;
22 double rel_err = 0;
23
24 int abs_err_i = 0;
25 int abs_err_j = 0;
26 int rel_err_i = 0;
27 int rel_err_j = 0;
28
29 int i, j;
30 int ret = 1;
31
32 if (argc < 5)
33 {
34 goto fail;
35 }
36
37 ref_file = fopen(argv[1], "rb");
38 dis_file = fopen(argv[2], "rb");
39 w = atoi(argv[3]);
40 h = atoi(argv[4]);
41
42 if (!ref_file || !dis_file || w <= 0 || h <= 0)
43 {
44 goto fail;
45 }
46
47 for (i = 0; i < h; ++i) {
48 data_t x, y;
49 double abs_err_inner;
50 double rel_err_inner;
51 double ref_inner = 0;
52 double dis_inner = 0;
53 double mse_inner = 0;
54 double xsq_inner = 0;
55
56 for (j = 0; j < w; ++j)
57 {
58 if (fread(&x, sizeof(data_t), 1, ref_file) != 1)
59 {
60 goto fail;
61 }
62 if (fread(&y, sizeof(data_t), 1, dis_file) != 1)
63 {
64 goto fail;
65 }
66
67 abs_err_inner = fabs(x - y);
68 rel_err_inner = abs_err_inner / (x == 0 ? nextafter(x, INFINITY) : x);
69
70 ref_inner += x;
71 dis_inner += y;
72 mse_inner += (x - y) * (x - y);
73 xsq_inner += x * x;
74
75 if (abs_err_inner > abs_err) {
76 abs_err = abs_err_inner;
77 abs_err_i = i;
78 abs_err_j = j;
79 }
80 if (rel_err_inner > rel_err) {
81 rel_err = rel_err_inner;
82 rel_err_i = i;
83 rel_err_j = j;
84 }
85 }
86
87 ref_accum += ref_inner;
88 dis_accum += dis_inner;
89 mse_accum += mse_inner;
90 xsq_accum += xsq_inner;
91 }
92
93 ref_accum /= (double)w * h;
94 dis_accum /= (double)w * h;
95
96 printf("ref mean: %f\n", ref_accum);
97 printf("dis mean: %f\n", dis_accum);
98 printf("snr: %f\n", 10 * log10(xsq_accum / mse_accum));
99 printf("max abs err: %e @ (%d, %d)\n", abs_err, abs_err_i, abs_err_j);
100 printf("max rel err: %e @ (%d, %d)\n", rel_err, rel_err_i, rel_err_j);
101
102 fail:
103 if (ref_file)
104 fclose(ref_file);
105 if (dis_file)
106 fclose(dis_file);
107 return ret;
108 }
109