Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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_);
}
Ejemplo n.º 3
0
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;
}