diff options
Diffstat (limited to 'filters.c')
-rw-r--r-- | filters.c | 137 |
1 files changed, 0 insertions, 137 deletions
@@ -273,143 +273,6 @@ int flam3_create_spatial_filter(flam3_frame *spec, int field, double **filter) { return (fwidth); } -flam3_de_helper flam3_create_de_filters(double max_rad, double min_rad, double curve, int ss) { - - flam3_de_helper de; - double comp_max_radius, comp_min_radius; - double num_de_filters_d; - int num_de_filters,de_max_ind; - int de_row_size, de_half_size; - int filtloop; - int keep_thresh=100; - - de.kernel_size=-1; - - if (curve <= 0.0) { - fprintf(stderr,"estimator curve must be > 0\n"); - return(de); - } - - if (max_rad < min_rad) { - fprintf(stderr,"estimator must be larger than estimator_minimum.\n"); - fprintf(stderr,"(%f > %f) ? \n",max_rad,min_rad); - return(de); - } - - /* We should scale the filter width by the oversample */ - /* The '+1' comes from the assumed distance to the first pixel */ - comp_max_radius = max_rad*ss + 1; - comp_min_radius = min_rad*ss + 1; - - /* Calculate how many filter kernels we need based on the decay function */ - /* */ - /* num filters = (de_max_width / de_min_width)^(1/estimator_curve) */ - /* */ - num_de_filters_d = pow( comp_max_radius/comp_min_radius, 1.0/curve ); - if (num_de_filters_d>1e7) { - fprintf(stderr,"too many filters required in this configuration (%g)\n",num_de_filters_d); - return(de); - } - num_de_filters = (int)ceil(num_de_filters_d); - - /* Condense the smaller kernels to save space */ - if (num_de_filters>keep_thresh) { - de_max_ind = (int)ceil(DE_THRESH + pow(num_de_filters-DE_THRESH,curve))+1; - de.max_filtered_counts = (int)pow( (double)(de_max_ind-DE_THRESH), 1.0/curve) + DE_THRESH; - } else { - de_max_ind = num_de_filters; - de.max_filtered_counts = de_max_ind; - } - - /* Allocate the memory for these filters */ - /* and the hit/width lookup vector */ - de_row_size = (int)(2*ceil(comp_max_radius)-1); - de_half_size = (de_row_size-1)/2; - de.kernel_size = (de_half_size+1)*(2+de_half_size)/2; - - de.filter_coefs = (double *) calloc (de_max_ind * de.kernel_size,sizeof(double)); - de.filter_widths = (double *) calloc (de_max_ind,sizeof(double)); - - /* Generate the filter coefficients */ - de.max_filter_index = 0; - for (filtloop=0;filtloop<de_max_ind;filtloop++) { - - double de_filt_sum=0.0, de_filt_d; - double de_filt_h; - int dej,dek; - double adjloop; - int filter_coef_idx; - - /* Calculate the filter width for this number of hits in a bin */ - if (filtloop<keep_thresh) - de_filt_h = (comp_max_radius / pow(filtloop+1,curve)); - else { - adjloop = pow(filtloop-keep_thresh,(1.0/curve)) + keep_thresh; - de_filt_h = (comp_max_radius / pow(adjloop+1,curve)); - } - - /* Once we've reached the min radius, don't populate any more */ - if (de_filt_h <= comp_min_radius) { - de_filt_h = comp_min_radius; - de.max_filter_index = filtloop; - } - - de.filter_widths[filtloop] = de_filt_h; - - /* Calculate norm of kernel separately (easier) */ - for (dej=-de_half_size; dej<=de_half_size; dej++) { - for (dek=-de_half_size; dek<=de_half_size; dek++) { - - de_filt_d = sqrt( (double)(dej*dej+dek*dek) ) / de_filt_h; - - /* Only populate the coefs within this radius */ - if (de_filt_d <= 1.0) { - - /* Gaussian */ - de_filt_sum += flam3_spatial_filter(flam3_gaussian_kernel, - flam3_spatial_support[flam3_gaussian_kernel]*de_filt_d); - - /* Epanichnikov */ -// de_filt_sum += (1.0 - (de_filt_d * de_filt_d)); - } - } - } - - filter_coef_idx = filtloop*de.kernel_size; - - /* Calculate the unique entries of the kernel */ - for (dej=0; dej<=de_half_size; dej++) { - for (dek=0; dek<=dej; dek++) { - de_filt_d = sqrt( (double)(dej*dej+dek*dek) ) / de_filt_h; - - /* Only populate the coefs within this radius */ - if (de_filt_d>1.0) - de.filter_coefs[filter_coef_idx] = 0.0; - else { - - /* Gaussian */ - de.filter_coefs[filter_coef_idx] = flam3_spatial_filter(flam3_gaussian_kernel, - flam3_spatial_support[flam3_gaussian_kernel]*de_filt_d)/de_filt_sum; - - /* Epanichnikov */ -// de_filter_coefs[filter_coef_idx] = (1.0 - (de_filt_d * de_filt_d))/de_filt_sum; - } - - filter_coef_idx ++; - } - } - - if (de.max_filter_index>0) - break; - } - - if (de.max_filter_index==0) - de.max_filter_index = de_max_ind-1; - - - return(de); -} - double flam3_create_temporal_filter(int numsteps, int filter_type, double filter_exp, double filter_width, double **temporal_filter, double **temporal_deltas) { |