用Matlab計算BD-PSNR
%%
% 這是Matlab版的BD-PSNR計算程式碼
% 與C版本的計算器avsnr4, 存在0.0x的誤差
%%
clc;clear;close all; % 關閉視窗與清除先前資料
%定義區間,給空陣列 [ ] 會自動取值
range = [442.36 66612];
range = log(range); % for BD-PSNR => bitrate
%我的方法
A = ...
[66612 74.59
29822 46.08
6239 32.65
442 23.72];
% 比較方法A
B = ...
[68774 56.65
31866 41.97
7083 29.43
416 21.58];
% 比較方法B
B = ...
[71331 44.86
21995 38.70
3593 29.31
148 13.28];
%比較方法C
B = ...
[69671 45.43
23729 40.03
4384 31.59
413 24.78];
%%
Ax = A(:,1);
Ay = A(:,2);
Axl = log(Ax);
Bx = B(:,1);
By = B(:, 2);
Bxl = log(Bx);
figure;plot(Axl,Ay,Bxl,By);title('PSNR-BR');
figure;plot(Ax,Ay,Bx,By);title('PSNR-log(BR)');
% 多項式fitting
rdcA = polyfit(Axl,Ay,3);
rdcB = polyfit(Bxl,By,3);
%自動取值或是在限定範圍內取值
if isempty(range)
maxX = min(Axl(1), Bxl(1));
minX = max(Axl(end), Bxl(end));
else
maxX = range(2);
minX = range(1);
end
x = minX:0.001:maxX;
figure;plot(x,polyval(rdcA,x), x,polyval(rdcB,x));
title('Estimated curve in PSNR-log(BR)');
% 積分,計算BD
funA = @(x) polyval(rdcA,x);
funB = @(x) polyval(rdcB,x);
sumA = quad(funA,minX,maxX);
sumB = quad(funB,minX,maxX);
BdPsnr = (sumA-sumB)/(maxX-minX)
留言