void copy_data(sockaddr_in const& from, sockaddr_in& to) { to.sin_family = from.sin_family; to.sin_port = from.sin_port; to.sin_addr.s_addr = from.sin_addr.s_addr; zero_pad_data(to); }
address::address(unsigned short int port, char const* ip) : data_(new sockaddr_in) { data_->sin_family = AF_INET; data_->sin_port = htons(port); data_->sin_addr.s_addr = inet_addr(ip); zero_pad_data(*data_); }
address::address(unsigned short int port) : data_(new sockaddr_in) { data_->sin_family = AF_INET; data_->sin_port = htons(port); data_->sin_addr.s_addr = INADDR_ANY; zero_pad_data(*data_); }
void CCorrelationFilters::fft_data(struct CDataStruct *img) { // Need to make this work with fftw threads, there seem to be some compiling and linking errors. int num_dim = img->size_data.size(); int rank = num_dim; int *n = new int(num_dim); int *m = new int(num_dim); for (int i=0; i<num_dim; i++) { n[i] = img->size_data[i]; m[i] = img->size_data_freq[i]; } //int numCPU = 2; Is there is a way to automatically figure out the number of CPUs? //fftw_init_threads(); //fftw_plan_with_nthreads(numCPU); fftw_plan plan; fftw_complex *out; int val = memcmp(n, m, num_dim*sizeof(int)); img->num_elements_freq = (img->size_data_freq.prod()/img->size_data_freq(num_dim-1))*(img->size_data_freq(num_dim-1)/2+1); double scale_factor = sqrt(img->size_data_freq.prod()); int istride = 1; int ostride = 1; int idist = img->size_data_freq.prod(); int odist = (img->size_data_freq.prod()/img->size_data_freq(num_dim-1))*(img->size_data_freq(num_dim-1)/2+1); if (val != 0){ // If the FFT size is NOT the same as the size of the data, zero pad the data. int num_channels = img->num_channels; double *data; data = new double[num_channels*img->size_data_freq.prod()]; int howmany = num_channels; delete[] img->data_freq; img->data_freq = new complex<double>[odist*num_channels*img->num_data]; out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*odist*num_channels); plan = fftw_plan_many_dft_r2c(rank, m, howmany, data, NULL, istride, idist, out, NULL, ostride, odist, FFTW_ESTIMATE); CDataStruct img1; img1.size_data = img->size_data; img1.size_data_freq = img->size_data_freq; img1.num_data = 1; img1.num_channels = img->num_channels; img1.data = new double[num_channels*img->size_data.prod()]; for (int i=0; i<img->num_data; i++) { memcpy(img1.data,img->data+i*num_channels*img->size_data.prod(),sizeof(double)*num_channels*img->size_data.prod()); zero_pad_data(data, &img1); fftw_execute(plan); memcpy(img->data_freq+i*odist*num_channels,reinterpret_cast<complex <double>*>(out),sizeof(complex<double>)*odist*num_channels); } for (int i=0; i<img->num_data; i++) { img->ptr_data_freq.push_back((img->data_freq+i*odist*num_channels)); } fftw_destroy_plan(plan); fftw_free(out); delete[] data; } else{ int howmany = img->num_data*img->num_channels; double *in = img->data; out = (fftw_complex*) fftwf_malloc(sizeof(fftw_complex)*odist*img->num_channels*img->num_data); plan = fftw_plan_many_dft_r2c(rank, n, howmany, in, NULL, istride, idist, out, NULL, ostride, odist, FFTW_ESTIMATE); fftw_execute(plan); img->data_freq = reinterpret_cast<complex <double>*>(out); for (int i=0; i<img->num_data; i++) { img->ptr_data_freq.push_back((img->data_freq+i*odist*img->num_channels)); } fftw_destroy_plan(plan); } for (int i=0; i<img->num_data*img->num_channels*odist; i++){ img->data_freq[i] = img->data_freq[i]/scale_factor; } //fftw_cleanup_threads(); delete[] n; delete[] m; }