cv_a.c

来自「LastWave」· C语言 代码 · 共 949 行 · 第 1/2 页

C
949
字号
/* * cv_a.c -- * *   Copyright 1997 Centre de Recherche Paul Pascal, Bordeaux, France *  Written by Nicolas Decoster. * *  The author may be reached (Email) at the address *      decoster@crpp.u-bordeaux.fr * *  $Id: cv_a.c,v 1.6 1998/09/09 16:40:26 decoster Exp $ */#include "lastwave.h"#include <string.h>#include "cv_int.h"#include "cv_limits.h"#ifndef M_PI #define M_PI 3.14159265358979323846#endif/* * Array to store all the basic analytical convolution fonctions. Stored by * method. */void * (* cv_a_fct_ptr_array[2][3])() = {  {    cv_a_real_d,    cv_a_real_mp,    cv_a_real_ft  }, {    cv_a_cplx_d,    cv_a_cplx_mp,    cv_a_cplx_ft  }};/* * cv_a_real -- */void *cv_a_real (int  border_effect,	   void *res_data,	   int  *first_exact_ptr,	   int  *last_exact_ptr){  int method;  real * ret_value = 0;  void * (*the_cv_fct_ptr)();  LogMessage("a r ");  if (cv_method == CV_UNDEFINED) {    method =      cv_convolution_method_ (sig_n, flt_d_n, lim_array[ANALYTICAL][border_effect]);  } else {    method = cv_method;  }  if ((method == FOURIER_TRANSFORM_CONVOLUTION)      && !cv_is_power_of_2_ (sig_n)) {    method = MULTI_PART_CONVOLUTION;  }#ifdef LOG_MESSAGES    LogMessage2("%s ", method_str[method]);    LogMessage2("%d ", sig_n);    LogMessage2("%d ", flt_d_n);#endif  the_cv_fct_ptr = cv_a_fct_ptr_array[REAL][method];  SetLogTimeBegin();  ret_value =     the_cv_fct_ptr (border_effect, res_data, first_exact_ptr, last_exact_ptr);  LogTime();  return ret_value;}/* * cv_a_real_d -- */void *cv_a_real_d (int  border_effect,	     void *res_data,	     int  *first_exact_ptr,	     int  *last_exact_ptr){  real   *signal_data;  real   *result_data;  int  i;  real *filter_data = 0;  int  filter_begin_index;  int  filter_end_index;  int  old_flt_def;  int  old_flt_d_begin;  int  old_flt_d_end;  void * old_flt_d_data;  assert (flt_def == ANALYTICAL);  assert (flt_form != CV_UNDEFINED);  assert (sig_form != CV_UNDEFINED);  assert (sig_n >= flt_d_n);  assert ((border_effect == CV_PERIODIC)	  || (border_effect == CV_MIRROR)	  || (border_effect == CV_PADDING)	  || (border_effect == CV_0_PADDING));  assert (res_data != 0);  assert (first_exact_ptr != 0);  assert (last_exact_ptr != 0);  signal_data = (real *) sig_d_data;  result_data = (real *) res_data;  if (flt_scale == CV_NO_SCALE) {    filter_begin_index = (int) floor (flt_d_begin) ;    filter_end_index = (int) ceil (flt_d_end) ;  } else {    filter_begin_index = (int) floor (flt_d_begin*flt_scale) ;    filter_end_index = (int) ceil (flt_d_end*flt_scale) ;  }  filter_data = (real *) malloc (sizeof(real)*flt_d_n);  if (!filter_data) {    EX_RAISE(mem_alloc_error);  }  if (flt_scale == CV_NO_SCALE) {    for (i = filter_begin_index; i <= filter_end_index; i++) {      filter_data[i - filter_begin_index] =	(* flt_d_real_ptr)((double)(i));    }  } else {    for (i = filter_begin_index; i <= filter_end_index; i++) {      filter_data[i - filter_begin_index] =	(* flt_d_real_ptr)((double)(i), flt_scale);    }  }  old_flt_def = flt_def;  old_flt_d_begin = (int) flt_d_begin;  old_flt_d_end = (int) flt_d_end;  old_flt_d_data = flt_d_data;  flt_def = NUMERICAL;  flt_d_begin = (real) filter_begin_index;  flt_d_end = (real) filter_end_index;  flt_d_data = (void *) filter_data;  result_data = cv_n_real_d (border_effect, result_data,			     first_exact_ptr, last_exact_ptr);  free (filter_data);  flt_def = old_flt_def;  flt_d_begin = old_flt_d_begin;  flt_d_end = old_flt_d_end;  flt_d_data = old_flt_d_data;  set_f_l_exact (first_exact_ptr, last_exact_ptr);  return result_data;mem_alloc_error:  free (filter_data);  return 0;}/* * cv_a_real_mp -- */void *cv_a_real_mp (int  border_effect,	      void *res_data,	      int  *first_exact_ptr,	      int  *last_exact_ptr){  real   *signal_data;  real   *result_data;  real    *signal_part = 0;  complex *signal_part_ft = 0;  complex *filter_ft = 0;  int     nb_of_parts, part_nb, part_n;  int     size_of_exact_data;  int     i;  int     flt_f_begin_index;  int     flt_f_end_index;  int     flt_d_end_index;  real    f_step;  assert (flt_def == ANALYTICAL);  assert (flt_form != CV_UNDEFINED);  assert (sig_form != CV_UNDEFINED);  assert (sig_n >= flt_d_n);  assert ((border_effect == CV_PERIODIC)	  || (border_effect == CV_MIRROR)	  || (border_effect == CV_PADDING)	  || (border_effect == CV_0_PADDING));  assert (res_data != 0);  assert (first_exact_ptr != 0);  assert (last_exact_ptr != 0);  signal_data = (real *) sig_d_data;  result_data = (real *) res_data;  part_n = cv_next_power_of_2_ (2*flt_d_n);  size_of_exact_data = part_n - flt_d_n + 1;  f_step = 2*M_PI/(part_n);  nb_of_parts = (int) ceil (((double) sig_n)/size_of_exact_data);  assert (nb_of_parts >= 1);  if (flt_scale == CV_NO_SCALE) {    flt_f_begin_index = (int) floor (flt_d_begin/f_step) ;    flt_f_end_index = (int) ceil (flt_d_end/f_step) ;    flt_d_end_index = (int) ceil (flt_d_end) ;  } else {    flt_f_begin_index = (int) floor (flt_f_begin/flt_scale/f_step);    flt_f_end_index   = (int) ceil  (flt_f_end/flt_scale/f_step);    flt_d_end_index = (int) ceil (flt_d_end*flt_scale) ;  }  signal_part = (real *) malloc (sizeof (real)*part_n);  if (!signal_part) {    EX_RAISE(mem_alloc_error);  }  signal_part_ft = (complex *) malloc (sizeof (complex)*part_n/2);  if (!signal_part_ft) {    EX_RAISE(mem_alloc_error);  }  filter_ft = (complex *) malloc (sizeof (complex)*part_n/2);  if (!filter_ft) {    EX_RAISE(mem_alloc_error);  }  filter_ft[0].real = (* flt_f_real_ptr)(0.0, flt_scale);  filter_ft[0].imag =    (* flt_f_real_ptr)((double)(part_n*f_step/2), flt_scale);  if (flt_scale == CV_NO_SCALE) {    if (flt_f_imag_ptr) {      for (i = 1; i < part_n/2; i++) {	filter_ft[i].real =	  (* flt_f_real_ptr)((double)(i*f_step));	filter_ft[i].imag =	  (* flt_f_imag_ptr)((double)(i*f_step));      }    } else {      for (i = 1; i < part_n/2; i++) {	filter_ft[i].real =	  (* flt_f_real_ptr)((double)(i*f_step));	filter_ft[i].imag = 0.0;      }        }  } else { /* flt_scale != CV_NO_SCALE */    if (flt_f_imag_ptr) {      for (i = 1; i < part_n/2; i++) {	filter_ft[i].real =	  (* flt_f_real_ptr)((double)(i*f_step), flt_scale);	filter_ft[i].imag =	  (* flt_f_imag_ptr)((double)(i*f_step), flt_scale);      }    } else {      for (i = 1; i < part_n/2; i++) {	filter_ft[i].real =	  (* flt_f_real_ptr)((double)(i*f_step), flt_scale);	filter_ft[i].imag = 0.0;      }        }  }  for (part_nb = 0; part_nb < nb_of_parts; part_nb++) {    int part_begin_in_signal;    part_begin_in_signal = part_nb*size_of_exact_data - flt_d_end_index;    cv_get_part_r_ (signal_part, part_n,		    signal_data, sig_n,		    part_begin_in_signal,		    border_effect);    cv_fft_r (signal_part, signal_part_ft, part_n);    signal_part_ft[0].real *= filter_ft[0].real;    signal_part_ft[0].imag *= filter_ft[0].imag;    cv_cplx_mult_ (signal_part_ft, filter_ft,		   1, part_n/2 - 1);    cv_fft_r_i (signal_part_ft, signal_part, part_n);    if (part_nb < (nb_of_parts - 1)) {      memcpy (result_data + part_nb*size_of_exact_data,	      signal_part + flt_d_end_index,	      size_of_exact_data*sizeof (real));    } else {      memcpy (result_data + part_nb*size_of_exact_data,	      signal_part + flt_d_end_index,	      (sig_n - part_nb*(size_of_exact_data))*sizeof (real));    }  }  free (signal_part);  free (signal_part_ft);  free (filter_ft);    set_f_l_exact (first_exact_ptr, last_exact_ptr);  return res_data;mem_alloc_error:  free (signal_part);  free (signal_part_ft);  free (filter_ft);  return 0;}/* * cv_a_real_ft -- */void *cv_a_real_ft (int  border_effect,	      void *res_data,	      int  *first_exact_ptr,	      int  *last_exact_ptr){  real   *signal_data;  real   *result_data;  real    *new_signal = 0;  complex *new_signal_ft = 0;  int     new_size;  int     flt_f_begin_index;  int     flt_f_end_index;  int     flt_d_begin_index;  int     flt_d_end_index;  real    f_step;    assert (flt_def == ANALYTICAL);  assert (flt_form != CV_UNDEFINED);  assert (sig_form != CV_UNDEFINED);  assert (sig_n >= flt_d_n);  assert ((border_effect == CV_PERIODIC)	  || (border_effect == CV_MIRROR)	  || (border_effect == CV_PADDING)	  || (border_effect == CV_0_PADDING));  assert (res_data != 0);  assert (first_exact_ptr != 0);  assert (last_exact_ptr != 0);  assert (cv_is_power_of_2_ (sig_n));  signal_data = (real *) sig_d_data;  result_data = (real *) res_data;  switch (border_effect)    {    case CV_0_PADDING:      new_size = sig_n*2;      break;    case CV_PADDING:      new_size = sig_n*2;      break;    case CV_MIRROR:      new_size = sig_n*2;      break;    case CV_PERIODIC:      new_size = sig_n;      break;    }  f_step = 2*M_PI/(new_size);  if (flt_scale == CV_NO_SCALE) {    flt_f_begin_index = (int) floor (flt_f_begin) ;    flt_f_end_index = (int) ceil (flt_f_end) ;    flt_d_begin_index = (int) floor (flt_d_begin) ;    flt_d_end_index = (int) ceil (flt_d_end) ;  } else {    flt_f_begin_index = (int) floor (flt_f_begin/flt_scale/f_step);    flt_f_end_index   = (int) ceil  (flt_f_end/flt_scale/f_step);    flt_d_begin_index = (int) floor (flt_d_begin*flt_scale);    flt_d_end_index   = (int) ceil  (flt_d_end*flt_scale);  }  assert (new_size >= (flt_f_end_index - flt_f_begin_index +1));  switch (border_effect)    {    case CV_0_PADDING:      new_size = sig_n*2;      new_signal = cv_0_padding_transform_ (signal_data,					    sig_n,					    flt_d_end_index);      break;    case CV_PADDING:      new_size = sig_n*2;      new_signal = cv_padding_transform_ (signal_data,					  sig_n,					  flt_d_end_index);      break;    case CV_MIRROR:      new_size = sig_n*2;      new_signal = cv_mirror_transform_ (signal_data,					 sig_n,					 flt_d_end_index);      break;    case CV_PERIODIC:      new_size = sig_n;      new_signal = signal_data;      break;    }  if (!new_signal) {    EX_RAISE(mem_alloc_error);  }  new_signal_ft = (complex *) malloc (sizeof (complex)*new_size/2);  if (!new_signal_ft) {    EX_RAISE(mem_alloc_error);  }  cv_fft_r (new_signal, new_signal_ft, new_size);  if (flt_scale == CV_NO_SCALE) {    new_signal_ft[0].real *= (* flt_f_real_ptr) (0.0);    new_signal_ft[0].imag *= (* flt_f_real_ptr) ((double)new_size/2*f_step);    cv_cplx_mult_num_ana_ (new_signal_ft, flt_f_real_ptr, flt_f_imag_ptr,			 1, new_size/2 - 1, f_step, 0.0);  } else {    new_signal_ft[0].real *= (* flt_f_real_ptr) (0.0, flt_scale);    new_signal_ft[0].imag *=      (* flt_f_real_ptr) ((double)new_size/2*f_step, flt_scale);    cv_cplx_mult_num_ana_1p_ (new_signal_ft, flt_f_real_ptr, flt_f_imag_ptr,			    flt_scale, 1, new_size/2 - 1, f_step, 0.0);  }    if (border_effect == CV_PERIODIC) {      cv_fft_r_i (new_signal_ft, result_data, new_size);    }  else {      cv_fft_r_i (new_signal_ft, new_signal, new_size);      memcpy (result_data, new_signal, sig_n*sizeof (real));      free (new_signal);    }  free (new_signal_ft);    set_f_l_exact (first_exact_ptr, last_exact_ptr);  return res_data;mem_alloc_error:  free (new_signal_ft);  free (new_signal);  return 0;}/* * cv_a_cplx --

⌨️ 快捷键说明

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