-
Notifications
You must be signed in to change notification settings - Fork 0
/
bjontegaard2.m
84 lines (73 loc) · 2.88 KB
/
bjontegaard2.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
function avg_diff = bjontegaard2(R1,PSNR1,R2,PSNR2,mode,degree)
% Saeed : This is correct -
%bjontegaard2 Bjontegaard metric calculation
% Bjontegaard's metric allows to compute the average gain in PSNR or the
% average per cent saving in bitrate between two rate-distortion
% curves [1].
% Differently from the avsnr software package or VCEG Excel [2] plugin this
% tool enables Bjontegaard's metric computation also with more than 4 RD
% points.
% Fixed integration interval in version 2.
%
% R1,PSNR1 - RD points for curve 1
% R2,PSNR2 - RD points for curve 2
% mode -
% 'dsnr' - average PSNR difference
% 'rate' - percentage of bitrate saving between data set 1 and
% data set 2
%
% avg_diff - the calculated Bjontegaard metric ('dsnr' or 'rate')
%
% (c) 2010 Giuseppe Valenzise
%
%% Bugfix 20130515
% Original script contained error in calculation of integration interval.
% It was fixed according to description and figure 3 in original
% publication [1]. Script was verifyed using data presented in [3].
% Fixed lines labeled as "(fixed 20130515)"
%
% (c) 2013 Serge Matyunin
%%
%
% References:
%
% [1] G. Bjontegaard, Calculation of average PSNR differences between
% RD-curves (VCEG-M33)
% [2] S. Pateux, J. Jung, An excel add-in for computing Bjontegaard metric and
% its evolution
% [3] VCEG-M34. http://wftp3.itu.int/av-arch/video-site/0104_Aus/VCEG-M34.xls
%
% convert rates in logarithmic units
lR1 = log(R1);
lR2 = log(R2);
switch lower(mode)
case 'dsnr'
% PSNR method
p1 = polyfit(lR1,PSNR1,degree); %default : 3rd order polynomial
p2 = polyfit(lR2,PSNR2,degree); %default: 3rd order polynomial
% integration interval (fixed 20130515)
min_int = max([ min(lR1); min(lR2) ]);
max_int = min([ max(lR1); max(lR2) ]);
% find integral
p_int1 = polyint(p1);
p_int2 = polyint(p2);
int1 = polyval(p_int1, max_int) - polyval(p_int1, min_int);
int2 = polyval(p_int2, max_int) - polyval(p_int2, min_int);
% find avg diff
avg_diff = (int2-int1)/(max_int-min_int);
case 'rate'
% rate method
p1 = polyfit(PSNR1,lR1,degree); %default: 3rd order polynomial
p2 = polyfit(PSNR2,lR2,degree); %default: 3rd order polynomial
% integration interval (fixed 20130515)
min_int = max([ min(PSNR1); min(PSNR2) ]);
max_int = min([ max(PSNR1); max(PSNR2) ]);
% find integral
p_int1 = polyint(p1);
p_int2 = polyint(p2);
int1 = polyval(p_int1, max_int) - polyval(p_int1, min_int);
int2 = polyval(p_int2, max_int) - polyval(p_int2, min_int);
% find avg diff
avg_exp_diff = (int2-int1)/(max_int-min_int);
avg_diff = (exp(avg_exp_diff)-1)*100;
end