主要是先用三次样条插值对齐两个数据坐标,然后将模型数据进行三阶多项式乘积尽量拟合观测数据,最后求拟合的数据和观测数据之间的内积。
内积最大者相关性最大。当然,也可以不通过拟合后内积,直接内积后除以两个向量的模。下面是MATLAB伪代码和源代码。
% input:
% Mx, My: Model spectrum
% Sx, Sy: Observed spectrum
% RV_range: Radial Velocity range, such as -500 Km/s ~ 500 Km/s
%
% best_value = -1
% best_rv = -999
% for rv in RV_range:
% z = rv / 300000.0
% Sx_restframe = Sx/(1+z)
%
% # compute Model flux on Sx_restframe
% Mx_new, My_new = change_X_axis_of_spectrum(Sx_rest, Mx, My)
%
% # least square get min(|My_new*p3 - Sy|)
% My_new = polyfit(My_new * P3 <-fit-> Sy)
%
% correlation_value = sum (My_new * Sy)/(|My_new|*|Sy|)
%
% if correlation_value > best_value:
% best_value = correlation_value
% best_rv = rv
% return best_value, best_rv
% Author:shizhixin % Email:szhixin@gmail.com % Blog:http://blog.csdn.net/shizhixin % Date:2012-06-06
clear, clc, close allload test_data; %load test data%the input parameterobserved = [lamda1, flux1];model = [lamda2, flux2];rv = [100, 200, 300]';%the result of function best_value = -1;best_rv = -1000;size_rv = size(rv, 1);for i = 1:size_rv z = rv(i) / 300000; observed_rest_lamda = observed(:,1)./(1+z); model_new = spline(model(:,1), model(:,2), observed_rest_lamda); % figure% plot(observed_rest_lamda, model_new, 'r');% figure% plot(observed_rest_lamda, observed(:,2), 'b'); diff_spectrum = observed(:,2) ./ model_new; N=3; P = polyfit(observed_rest_lamda, diff_spectrum, N); for j=1:size(diff_spectrum, 1) model_new(j) = model_new(j) * get_poly_value(P,N,observed_rest_lamda(j)); end figure plot(observed_rest_lamda, model_new, 'r'); hold on plot(observed_rest_lamda, observed(:,2), 'b'); titlename = strcat('rv=', num2str(rv(i))); title(titlename); correlation_value = sum (model_new .* observed(:,2)); if correlation_value > best_value best_value = correlation_value; best_rv = rv(i); endendbest_valuebest_rv%end%function [best value best_rv] = coss_correlation(model, observed, rv)
function Y = get_poly_value(P,N,X) Y = 0; for i = 1:N+1 Y = Y + P(i)*X^(N-i+1); end end