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