⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 create_spectrum.c

📁 最大似然估计算法
💻 C
字号:
#include "timeseries.h"int create_spectrum(double *P, double *f, time_series ts, data_kernel dk, options op) {  	int j, k, l, idt;	int nfft, len, jmax, nout;	int n_segments;	int *ind;	double mle, prob;	double *data, *fit, *cov_fit, *data_hat, *dy, *t;	data_hat = (double *) calloc((size_t) dk.n_data,          sizeof(double));	if (op.speed < 3) {		dy       = (double *) calloc((size_t) dk.n_data,          sizeof(double));		for (j = 0; j < dk.n_data; j++) dy[j] = 1.0;		fit      = (double *) calloc((size_t) dk.n_par,           sizeof(double));		cov_fit  = (double *) calloc((size_t)(dk.n_par*dk.n_par), sizeof(double));        	linefit_fast(dk.A, dk.d, dy, dk.n_data, dk.n_par, fit, cov_fit, data_hat);		free(fit);		free(cov_fit);		free(dy);	} else {		for (j = 0; j < dk.n_data; j++) data_hat[j] = 0.0;	}	/*********************************************************/	/* Find if there is a segment in the time series that is */	/* continuous and long enough to be used in the fft psd  */	/*********************************************************/	nfft = (int)pow(2.0,floor( log((double)ts.n_data) / log(2.0) ));	ind = (int *) calloc((size_t) (ts.n_full-ts.n_data), sizeof(int));	ind[0] = 0;	for (k = 1, j = 1; j < ts.n_data; j++) {		idt = ts.index[j]-ts.index[j-1];		if (idt > 1) ind[k++] = j; 	}	ind[k++] = ts.n_data;	n_segments = k;	l = -1;	for (j = 0; j < n_segments-1; j++) {		len = ind[j+1]-ind[j];		if (len >= nfft) { 			l = j;			fprintf(op.fpout, "%d to %d a continuous sequence (%.8f to %.8f)\n", ind[j], ind[j+1]-1, ts.t[ind[j]], ts.t[ind[j+1]-1]);		}	}	/***********************************/	/* Now estimate the power spectrum */	/***********************************/	if (l > 0) {		data = (double *) calloc((size_t) nfft, sizeof(double));		for (j = 0; j < nfft; j++) data[j] = dk.d[ind[l]+j] - data_hat[ind[l]+j];		psd(P,f,data,nfft,ts.fs);		for (j = 0; j < nfft/2; j++) P[j] *= (2.0 / ts.fs);		free(data);		free(data_hat);		nout = nfft/2;	} else {		t = (double *) calloc((size_t) dk.n_data,     sizeof(double));		for (j = 0; j < dk.n_data; j++) {			t[j] = ts.t[j] - ts.t[0];			t[j] *= sec_per_year;			data_hat[j] = dk.d[j] - data_hat[j];		}		scargle(t,data_hat,dk.n_data,1.0,1.0,f,P,dk.n_data,&nout,&jmax,&prob);		for (j = 0; j < nout; j++) P[j] *= (2.0 / ts.fs);		free(t);		free(data_hat);	}	free(ind);	return(nout);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -