28#include "hdrl_spectrum_shift.h"
40double calc_gauss(
double mean,
double sigma,
double x){
42 double exponent = - pow((x- mean), 2.0) / (2.0 * sigma * sigma);
43 double v = 1.0/(2.0 * CPL_MATH_PI * sigma * sigma) * exp(exponent);
47hdrl_value gauss_func(hdrl_data_t lambda){
49 hdrl_data_t mean = 1500;
50 hdrl_data_t sigma = 250;
52 double v = calc_gauss(mean, sigma, lambda);
54 return (hdrl_value){v, 0.0};
57hdrl_value absorption1_func(hdrl_data_t lambda){
59 hdrl_data_t mean = 1754;
60 hdrl_data_t sigma = .75;
62 double v = calc_gauss(mean, sigma, lambda);
64 return (hdrl_value){ exp(-v), 0.0};
67hdrl_value absorption2_func(hdrl_data_t lambda){
69 hdrl_data_t mean = 1504;
70 hdrl_data_t sigma = .75;
72 double v = calc_gauss(mean, sigma, lambda);
74 return (hdrl_value){ exp(-v), 0.0};
77cpl_array * get_wlengths(
double start,
double stop,
double step){
79 cpl_size sz = (cpl_size)floor((stop - start) / step);
80 cpl_array * arr = cpl_array_new(sz, HDRL_TYPE_DATA);
82 for(cpl_size i = 0; i < sz; i++){
83 cpl_array_set(arr, i, start);
90void test_on_slope(
void){
91 cpl_array * wlenghts = get_wlengths(1e3, 2e3, 1.0);
93 hdrl_spectrum1D * gaussian =
96 hdrl_spectrum1D * absorption =
100 hdrl_spectrum1D * gaussian_with_abs =
103 hdrl_parameter * par =
108 cpl_test_rel((1.0 + offset) * 1750., 1754., 1e-3);
113 cpl_array_delete(wlenghts);
117void test_on_peak(
void){
119 cpl_array * wlenghts = get_wlengths(1e3, 2e3, 1.0);
121 hdrl_spectrum1D * gaussian =
124 hdrl_spectrum1D * absorption =
128 hdrl_spectrum1D * gaussian_with_abs =
131 hdrl_parameter * par =
136 cpl_test_rel((1.0 + offset) * 1500., 1504., 1e-3);
141 cpl_array_delete(wlenghts);
146void test_compute_shift_xcorrelation(
void)
148 cpl_array * wlenghts = get_wlengths(1e3, 2e3, 1.0);
151 gauss_func, wlenghts, hdrl_spectrum1D_wave_scale_linear);
154 absorption2_func, wlenghts, hdrl_spectrum1D_wave_scale_linear);
156 cpl_size half_win = 1;
161 NULL, NULL, half_win, CPL_FALSE);
162 cpl_test_error(CPL_ERROR_NULL_INPUT);
165 NULL, absorption, half_win, CPL_FALSE);
166 cpl_test_error(CPL_ERROR_NULL_INPUT);
169 gaussian, NULL, half_win, CPL_FALSE);
170 cpl_test_error(CPL_ERROR_NULL_INPUT);
173 gaussian, absorption, half_win, CPL_FALSE);
174 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
179 cpl_array_delete(wlenghts);
189 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
194 test_compute_shift_xcorrelation();
196 return cpl_test_end(0);
void hdrl_parameter_delete(hdrl_parameter *obj)
shallow delete of a parameter
hdrl_parameter * hdrl_spectrum1D_shift_fit_parameter_create(const hdrl_data_t wguess, const hdrl_data_t range_wmin, const hdrl_data_t range_wmax, const hdrl_data_t fit_wmin, const hdrl_data_t fit_wmax, const hdrl_data_t fit_half_win)
The function create a hdrl_spectrum1D_shift_parameter to be used in hdrl_spectrum1D_compute_shift_fit...
hdrl_data_t hdrl_spectrum1D_compute_shift_fit(const hdrl_spectrum1D *obs, const hdrl_parameter *par)
The function compute the shift due to radial velocity. If wguess is the reference line and wfound is ...
hdrl_spectrum1D * hdrl_spectrum1D_mul_spectrum_create(const hdrl_spectrum1D *f1, const hdrl_spectrum1D *f2)
multiply one spectrum by another spectrum
void hdrl_spectrum1D_delete(hdrl_spectrum1D **p_self)
hdrl_spectrum1D destructor
hdrl_xcorrelation_result * hdrl_spectrum1D_compute_shift_xcorrelation(const hdrl_spectrum1D *s1, const hdrl_spectrum1D *s2, cpl_size half_win, const cpl_boolean normalize)
The function computes the shift between the two spectra.
hdrl_spectrum1D * hdrl_spectrum1D_create_analytic(calculate_analytic_spectrum_point func, const cpl_array *wavelength, hdrl_spectrum1D_wave_scale scale)
hdrl_spectrum1D constructor in the case of a spectrum defined by an analytical function