Esempio n. 1
0
JNIEXPORT void JNICALL Java_de_jurihock_voicesmith_dsp_KissFFT_ifft
(JNIEnv* env, jobject, jlong handle, jfloatArray _buffer)
{
	KissFFT* fft = (KissFFT*)handle;

	float* buffer = (float*)env->GetPrimitiveArrayCritical(_buffer, 0);

	// buffer => spectrum
	memcpy(fft->spectrum, buffer, sizeof(float)*fft->size);

	// Im(DC) => Re(Nyquist)
	fft->spectrum[fft->size/2].r = fft->spectrum[0].i;
	fft->spectrum[0].i = 0;
	fft->spectrum[fft->size/2].i = 0;

	// ifft(spectrum) => buffer
	kiss_fftri(fft->backward, fft->spectrum, buffer);

	// Normalize buffer values by 1/N
	for (int i = 0; i < fft->size; i++)
	buffer[i] /= fft->size;

	// Circular shift by N/2
	fftshift(fft, buffer);

	env->ReleasePrimitiveArrayCritical(_buffer, buffer, 0);
}
Esempio n. 2
0
void IQSSBDemodulator::circshift(Ipp32f* b, int len, int lo)
{
	fftshift(b, len);
	static Ipp32f* tmp = ippsMalloc_32f(len);
	if(lo>=0)
	{
		ippsCopy_32f(b, tmp, lo);
		ippsMove_32f(b+lo, b, len-lo); 
		ippsCopy_32f(tmp, b+len-lo, lo);
	}
	else
	{
		int abs_lo = -lo;
		ippsCopy_32f(b+len-abs_lo, tmp, abs_lo);
		ippsMove_32f(b, b+abs_lo, len-abs_lo);
		ippsCopy_32f(tmp, b, abs_lo);
	}

	fftshift(b, len);
}
Esempio n. 3
0
Array<T> fbp(const Array<T>& A, const Array<T>& gamma, size_t N)
{
  Array<T> I = zeros(N,N);

  Array<T> x = linspace(-0.5,0.5,N);
  Array<T> y = linspace(-0.5,0.5,N);

  size_t nrDetPix = shape(A,0);
  size_t nrAngles = shape(A,1);

  Array<T> filter = abs( range(-nrDetPix/2, nrDetPix/2) ); //abs(linspace(-nrDetPix/2, nrDetPix/2,nrDetPix))';

  for(size_t t=0; t<size(gamma); t++)
  {
    auto fhat = fftshift(fft(A(full,t)));
    fhat = fhat * filter;
    A(full,t) = real(ifft(fftshift(fhat))); //Todo -> ifftshift
  }

  //gamma = gamma / 360.0 * 2 * pi;

  for(size_t m=0; m<N; m++)
    for(size_t n=0; n<N; n++)
      for(size_t t=0; t<nrAngles; t++)
      {
        T xi = x(m)*cos(gamma(t))+y(n)*sin(gamma(t));
        size_t index = round((xi/sqrt(2.0) + 0.5) * (nrDetPix-1.0));

        I(m,n) += A(index,t);
      }


  //I = real(I/(2*nrAngles)*pi);

  //I = rot90(I); %flipud(fliplr(I));

  return I;
}
Esempio n. 4
0
JNIEXPORT void JNICALL Java_de_jurihock_voicesmith_dsp_KissFFT_fft
(JNIEnv* env, jobject, jlong handle, jfloatArray _buffer)
{
	KissFFT* fft = (KissFFT*)handle;

	float* buffer = (float*)env->GetPrimitiveArrayCritical(_buffer, 0);

	// Circular shift by N/2
	fftshift(fft, buffer);

	// fft(buffer) => spectrum
	kiss_fftr(fft->forward, buffer, fft->spectrum);

	// Re(Nyquist) => Im(DC)
	fft->spectrum[0].i = fft->spectrum[fft->size/2].r;

	// spectrum => buffer
	memcpy(buffer, fft->spectrum, sizeof(float)*fft->size);

//	LOG("FFT DC (%f,%f)", fft->spectrum[0].r, fft->spectrum[0].i);
//	LOG("FFT Nyquist (%f,%f)", fft->spectrum[fft->size/2].r, fft->spectrum[fft->size/2].i);

	env->ReleasePrimitiveArrayCritical(_buffer, buffer, 0);
}
Esempio n. 5
0
cv::Mat HologramDecoder::fresnel( cv::Mat hologramColor, float dx, float dy, float z, float lambda ) {

#ifdef PRINT_FRESNELL
    std::cout << "      **INFORMACOES FRESNEL**\n"
              << "      dx: " << dx << std::endl
              << "      dy: " << dy << std::endl
              << "      z: " << z << std::endl
              << "      lamda " << lambda << std::endl;
#endif

    cv::Mat hologram;



    cv::cvtColor( hologramColor, hologram, CV_BGR2GRAY );
    hologram.convertTo( hologram, CV_32FC1, 1.0 / 255.0 );
    hologram = HologramDecoder::optimizeToFresnel( hologram );
    float k = ( ( 2 * M_PI ) );
    float Nxx = hologram.cols;
    float Nyy = hologram.rows;
    //Cria duas matrizes linha com o tamanho em x e y da imagem
    //x = ones(Nyy,1)*[-Nxx/2:Nxx/2-1]*dx; [MATLAB]
    cv::Mat part1x = cv::Mat::ones( hologram.rows, 1, CV_32FC1 );  //ones(Nyy,1)
    cv::Mat part2x = cv::Mat( 1, hologram.cols, CV_32FC1 );  //[-Nxx/2 : Nxx/2-1]
    //
    float * aux = new float[hologram.cols];
    int index = 0;
    /*Cria um vetor gradiente com o tamanho em x da imagem*/
    for( int i = ( -1 * ( hologram.cols / 2 ) ); i < ( hologram.cols / 2 ); i++ ) {
        aux[index] = ( float ) i;
        index++;
    }
    part2x = cv::Mat( part2x.rows, part2x.cols, CV_32FC1, aux ); //O vetor gradiente
    //
    cv::Mat x = part1x * part2x * dx;
    x.convertTo( x, CV_32FC1 ); // X pronto
    //
    //
    //Reinicia as variaveis auxiliares
    aux = new float[hologram.cols];
    index = 0;
    //Cria outro gradiente, com tamanho em y
    for( int i = ( -1 * ( hologram.rows ) / 2 ); i < ( hologram.rows ) / 2; i++ ) {
        aux[index] = ( float ) i;
        index++;
    }
    cv::Mat part1y = cv::Mat( 1, hologram.rows, CV_32FC1, aux );
    cv::Mat part2y = cv::Mat::ones( 1, hologram.cols, CV_32F );
    cv::Mat part1ytanspost = cv::Mat( part1y.rows, part1y.cols, part1y.type() );
    cv::transpose( part1y, part1ytanspost );
    cv::Mat y = part1ytanspost * part2y * dy;
    y.convertTo( y, CV_32FC1 ); // Y pronto
    //
    //
    float Lx = dx * Nxx;
    float Ly = dy * Nyy;
    float criti = dx * Lx / lambda;
    float dfx = 1 / Lx;
    float dfy = 1 / Ly;
    //
    //u = ones(Nyy,1)*[-Nxx/2:Nxx/2-1]*dfx;
    //v = [-Nyy/2:Nyy/2-1]'*ones(1,Nxx)*dfy;l
    cv::Mat part1u = cv::Mat::ones( hologram.rows, 1, CV_32F );
    cv::Mat part2u = cv::Mat( 1, hologram.cols, CV_32F );
    aux = new float[hologram.cols];
    index = 0;
    for( int i = ( -1 * ( hologram.cols / 2 ) ); i < ( hologram.cols / 2 ); i++ ) {
        aux[index] = ( float ) i;
        index++;
    }
    part2u = cv::Mat( part2x.rows, part2x.cols, CV_32F, aux );
    cv::Mat u = part1u * part2u * dfx; //U pronto
    //

    aux = new float[hologram.rows];
    index = 0;
    for( int i = ( -1 * ( hologram.rows ) / 2 ); i < ( hologram.rows ) / 2; i++ ) {
        aux[index] = ( float ) i;
        index++;
    }
    cv::Mat part1v = cv::Mat( 1, hologram.rows, CV_32FC1, aux );

    cv::Mat part2v = cv::Mat::ones( 1, hologram.cols, CV_32F );
    cv::Mat part1vtanspost = cv::Mat( part1y.rows, part1y.cols, part1v.type() );
    cv::transpose( part1v, part1vtanspost );
    cv::Mat v = part1vtanspost * part2v * dfy;//V pronto
    //
    //
    cv::Mat zero = cv::Mat( hologram.cols, hologram.rows, CV_32FC1 );
    cv::Mat shifted = hologram.clone();
    fftshift( shifted );
    cv::Mat real = cv::Mat( hologram.rows, hologram.cols, CV_32FC1 ), imaginary = cv::Mat( hologram.rows, hologram.cols, CV_32FC1 );
    cv::Mat mats[] = {real, imaginary};
    cv::Mat result;
    cv::merge( mats, 2, result );
    cv::dft( shifted, result, cv::DFT_COMPLEX_OUTPUT );
    zero = result;
    cv::Mat partialFinalResult;

//   if( z > criti ) {
    if( false ) {
        std::cout << " ENTROU NO IF" << std::endl;
        std::complex<float> ifPart1;
        ifPart1.imag( lambda * z );
        cv::Mat sumMats;
        cv::Mat xSquare = squareMatrix( x );
        cv::Mat ySquare = squareMatrix( y );
        sumMats = xSquare + ySquare;

        //	std::cout << "  IF\n  sumMats.channels: " << sumMats.channels() << std::endl;

        std::complex<float> ifPart2_1;
        ifPart2_1.imag( k / 2 * z );

        //	std::cout << " IF[1]" << std::endl;

        cv::Mat hpart2 = ComplexMatrix::mulComplexMat( sumMats, ifPart2_1 );

        //	std::cout << "IF[2]" << std::endl;

        cv::Mat expPart2 = ComplexMatrix::exp( hpart2 );

        //	std::cout << "IF[3]" << std::endl;

        cv::Mat h = ComplexMatrix::mulComplexMat( expPart2, ifPart1 );
        cv::Mat ifShifted = h.clone();
        fftshift( ifShifted );
        cv::Mat outputReal = cv::Mat( ifShifted.rows, ifShifted.cols, CV_32FC1 );
        cv::Mat outputImaginary = cv::Mat( ifShifted.rows, ifShifted.cols, CV_32FC1 );
        cv::Mat transformed;
        cv::Mat matrixes[] = {outputReal, outputImaginary};
        cv::merge( matrixes, 2, transformed );
        cv::dft( ifShifted, transformed, cv::DFT_COMPLEX_OUTPUT );
        std::complex<float> complexAux( dx, 0 );
        complexAux.real( pow( complexAux.real(), 2 ) );
        complexAux.imag( pow( complexAux.imag(), 2 ) );
        partialFinalResult = ComplexMatrix::mulComplexMat( transformed, complexAux );
    } else {
        //std::cout << " ENTROU NO ELSE" << std::endl;
        std::complex<float> part0else( 0, k * z );
        std::complex<float>part1else = std::exp<float> ( part0else );
        std::complex<float> part2else( 0, - ( M_PI * lambda * z ) );
        cv::Mat uSquared = squareMatrix( u );
        cv::Mat vSquared = squareMatrix( v );
        cv::Mat sumMats = vSquared + uSquared;
        cv::Mat part3else = ComplexMatrix::mulComplexRealMat( sumMats, part2else );
        cv::Mat expPart3 = ComplexMatrix::exp( part3else );
        cv::Mat semiFinal = ComplexMatrix::mulComplexMat( expPart3, part1else );
        cv::Mat final = fftshift( semiFinal );
        partialFinalResult = final;
    }
    cv::Mat object = ComplexMatrix::perElementMult( zero, partialFinalResult );
    cv::Mat outputReal = cv::Mat::zeros( object.rows, object.cols, CV_32FC1 );
    cv::Mat outputImaginary = cv::Mat::zeros( object.rows, object.cols, CV_32FC1 );
    cv::Mat outputs[] = {outputReal, outputImaginary};
    cv::Mat output2;
    cv::merge( outputs, 2, output2 );
    cv::dft( object, output2, cv::DFT_INVERSE );
    return cv::abs( output2 );
}
Esempio n. 6
0
/**
 * @brief         Inverse FFT shift
 *
 * @param   m     TO be inversely shifted
 * @return        Inversely shifted
 */
template<class T> inline Matrix<T>
ifftshift (const Matrix<T>& m) {

	return fftshift (m,false);

}
Esempio n. 7
0
static void color_prefilt(color_image_t *src, int fc)
{
    fftw_lock();

    int i, j;

    /* Log */
    for(j = 0; j < src->height; j++)
    {
        for(i = 0; i < src->width; i++)
        {
            src->c1[j*src->width+i] = log(src->c1[j*src->width+i]+1.0f);
            src->c2[j*src->width+i] = log(src->c2[j*src->width+i]+1.0f);
            src->c3[j*src->width+i] = log(src->c3[j*src->width+i]+1.0f);
        }
    }

    color_image_t *img_pad = color_image_add_padding(src, 5);

    /* Get sizes */
    int width = img_pad->width;
    int height = img_pad->height;

    /* Alloc memory */
    float *fx  = (float *) fftwf_malloc(width*height*sizeof(float));
    float *fy  = (float *) fftwf_malloc(width*height*sizeof(float));
    float *gfc = (float *) fftwf_malloc(width*height*sizeof(float));
    fftwf_complex *ina1 = (fftwf_complex *) fftwf_malloc(width*height*sizeof(fftwf_complex));
    fftwf_complex *ina2 = (fftwf_complex *) fftwf_malloc(width*height*sizeof(fftwf_complex));
    fftwf_complex *ina3 = (fftwf_complex *) fftwf_malloc(width*height*sizeof(fftwf_complex));
    fftwf_complex *inb1 = (fftwf_complex *) fftwf_malloc(width*height*sizeof(fftwf_complex));
    fftwf_complex *inb2 = (fftwf_complex *) fftwf_malloc(width*height*sizeof(fftwf_complex));
    fftwf_complex *inb3 = (fftwf_complex *) fftwf_malloc(width*height*sizeof(fftwf_complex));
    fftwf_complex *out1 = (fftwf_complex *) fftwf_malloc(width*height*sizeof(fftwf_complex));
    fftwf_complex *out2 = (fftwf_complex *) fftwf_malloc(width*height*sizeof(fftwf_complex));
    fftwf_complex *out3 = (fftwf_complex *) fftwf_malloc(width*height*sizeof(fftwf_complex));

    /* Build whitening filter */
    float s1 = fc/sqrt(log(2));
    for(j = 0; j < height; j++)
    {
        for(i = 0; i < width; i++)
        {
            ina1[j*width + i][0] = img_pad->c1[j*width+i];
            ina2[j*width + i][0] = img_pad->c2[j*width+i];
            ina3[j*width + i][0] = img_pad->c3[j*width+i];
            ina1[j*width + i][1] = 0.0f;
            ina2[j*width + i][1] = 0.0f;
            ina3[j*width + i][1] = 0.0f;

            fx[j*width + i] = (float) i - width/2.0f;
            fy[j*width + i] = (float) j - height/2.0f;

            gfc[j*width + i] = exp(-(fx[j*width + i]*fx[j*width + i] + fy[j*width + i]*fy[j*width + i]) / (s1*s1));
        }
    }

    fftshift(gfc, width, height);

    /* FFT */
    fftwf_plan fft11 = fftwf_plan_dft_2d(width, height, ina1, out1, FFTW_FORWARD, FFTW_ESTIMATE);
    fftwf_plan fft12 = fftwf_plan_dft_2d(width, height, ina2, out2, FFTW_FORWARD, FFTW_ESTIMATE);
    fftwf_plan fft13 = fftwf_plan_dft_2d(width, height, ina3, out3, FFTW_FORWARD, FFTW_ESTIMATE);
    fftw_unlock();
    fftwf_execute(fft11);
    fftwf_execute(fft12);
    fftwf_execute(fft13);
    fftw_lock();

    /* Apply whitening filter */
    for(j = 0; j < height; j++)
    {
        for(i = 0; i < width; i++)
        {
            out1[j*width+i][0] *= gfc[j*width + i];
            out2[j*width+i][0] *= gfc[j*width + i];
            out3[j*width+i][0] *= gfc[j*width + i];

            out1[j*width+i][1] *= gfc[j*width + i];
            out2[j*width+i][1] *= gfc[j*width + i];
            out3[j*width+i][1] *= gfc[j*width + i];
        }
    }

    /* IFFT */
    fftwf_plan ifft11 = fftwf_plan_dft_2d(width, height, out1, inb1, FFTW_BACKWARD, FFTW_ESTIMATE);
    fftwf_plan ifft12 = fftwf_plan_dft_2d(width, height, out2, inb2, FFTW_BACKWARD, FFTW_ESTIMATE);
    fftwf_plan ifft13 = fftwf_plan_dft_2d(width, height, out3, inb3, FFTW_BACKWARD, FFTW_ESTIMATE);
    fftw_unlock();
    fftwf_execute(ifft11);
    fftwf_execute(ifft12);
    fftwf_execute(ifft13);
    fftw_lock();

    /* Local contrast normalisation */
    for(j = 0; j < height; j++)
    {
        for(i = 0; i < width; i++)
        {
            img_pad->c1[j*width+i] -= inb1[j*width+i][0] / (width*height);
            img_pad->c2[j*width+i] -= inb2[j*width+i][0] / (width*height);
            img_pad->c3[j*width+i] -= inb3[j*width+i][0] / (width*height);

            float mean = (img_pad->c1[j*width+i] + img_pad->c2[j*width+i] + img_pad->c3[j*width+i])/3.0f;

            ina1[j*width+i][0] = mean*mean;
            ina1[j*width+i][1] = 0.0f;
        }
    }

    /* FFT */
    fftwf_plan fft21 = fftwf_plan_dft_2d(width, height, ina1, out1, FFTW_FORWARD, FFTW_ESTIMATE);
    fftw_unlock();
    fftwf_execute(fft21);
    fftw_lock();

    /* Apply contrast normalisation filter */
    for(j = 0; j < height; j++)
    {
        for(i = 0; i < width; i++)
        {
            out1[j*width+i][0] *= gfc[j*width + i];
            out1[j*width+i][1] *= gfc[j*width + i];
        }
    }

    /* IFFT */
    fftwf_plan ifft2 = fftwf_plan_dft_2d(width, height, out1, inb1, FFTW_BACKWARD, FFTW_ESTIMATE);
    fftw_unlock();
    fftwf_execute(ifft2);
    fftw_lock();

    /* Get result from contrast normalisation filter */
    for(j = 0; j < height; j++)
    {
        for(i = 0; i < width; i++)
        {
            float val = sqrt(sqrt(inb1[j*width+i][0]*inb1[j*width+i][0]+inb1[j*width+i][1]*inb1[j*width+i][1]) / (width*height));

            img_pad->c1[j*width+i] /= (0.2f+val);
            img_pad->c2[j*width+i] /= (0.2f+val);
            img_pad->c3[j*width+i] /= (0.2f+val);
        }
    }

    color_image_rem_padding(src, img_pad, 5);

    /* Free */
    fftwf_destroy_plan(fft11);
    fftwf_destroy_plan(fft12);
    fftwf_destroy_plan(fft13);
    fftwf_destroy_plan(ifft11);
    fftwf_destroy_plan(ifft12);
    fftwf_destroy_plan(ifft13);
    fftwf_destroy_plan(fft21);
    fftwf_destroy_plan(ifft2);

    color_image_delete(img_pad);

    fftwf_free(ina1);
    fftwf_free(ina2);
    fftwf_free(ina3);
    fftwf_free(inb1);
    fftwf_free(inb2);
    fftwf_free(inb3);
    fftwf_free(out1);
    fftwf_free(out2);
    fftwf_free(out3);
    fftwf_free(fx);
    fftwf_free(fy);
    fftwf_free(gfc);

    fftw_unlock();
}
Esempio n. 8
0
/*static*/ void prefilt(image_t *src, int fc)
{
    fftw_lock();

    int i, j;

    /* Log */
    for(j = 0; j < src->height; j++)
    {
        for(i = 0; i < src->width; i++) {
            src->data[j*src->stride+i] = log(src->data[j*src->stride+i]+1.0f);
        }
    }

    image_t *img_pad = image_add_padding(src, 5);

    /* Get sizes */
    int width = img_pad->width;
    int height = img_pad->height;
    int stride = img_pad->stride;

    /* Alloc memory */
    float *fx  = (float *) fftwf_malloc(width*height*sizeof(float));
    float *fy  = (float *) fftwf_malloc(width*height*sizeof(float));
    float *gfc = (float *) fftwf_malloc(width*height*sizeof(float));
    fftwf_complex *in1 = (fftwf_complex *) fftwf_malloc(width*height*sizeof(fftwf_complex));
    fftwf_complex *in2 = (fftwf_complex *) fftwf_malloc(width*height*sizeof(fftwf_complex));
    fftwf_complex *out = (fftwf_complex *) fftwf_malloc(width*height*sizeof(fftwf_complex));

    /* Build whitening filter */
    float s1 = fc/sqrt(log(2));
    for(j = 0; j < height; j++)
    {
        for(i = 0; i < width; i++)
        {
            in1[j*width + i][0] = img_pad->data[j*stride+i];
            in1[j*width + i][1] = 0.0f;

            fx[j*width + i] = (float) i - width/2.0f;
            fy[j*width + i] = (float) j - height/2.0f;

            gfc[j*width + i] = exp(-(fx[j*width + i]*fx[j*width + i] + fy[j*width + i]*fy[j*width + i]) / (s1*s1));
        }
    }

    fftshift(gfc, width, height);

    /* FFT */
    fftwf_plan fft1 = fftwf_plan_dft_2d(width, height, in1, out, FFTW_FORWARD, FFTW_ESTIMATE);
    fftw_unlock();
    fftwf_execute(fft1);
    fftw_lock();

    /* Apply whitening filter */
    for(j = 0; j < height; j++)
    {
        for(i = 0; i < width; i++)
        {
            out[j*width+i][0] *= gfc[j*width + i];
            out[j*width+i][1] *= gfc[j*width + i];
        }
    }

    /* IFFT */
    fftwf_plan ifft1 = fftwf_plan_dft_2d(width, height, out, in2, FFTW_BACKWARD, FFTW_ESTIMATE);
    fftw_unlock();
    fftwf_execute(ifft1);
    fftw_lock();

    /* Local contrast normalisation */
    for(j = 0; j < height; j++)
    {
        for(i = 0; i < width; i++)
        {
            img_pad->data[j*stride + i] -= in2[j*width+i][0] / (width*height);

            in1[j*width + i][0] = img_pad->data[j*stride + i] * img_pad->data[j*stride + i];
            in1[j*width + i][1] = 0.0f;
        }
    }

    /* FFT */
    fftwf_plan fft2 = fftwf_plan_dft_2d(width, height, in1, out, FFTW_FORWARD, FFTW_ESTIMATE);
    fftw_unlock();
    fftwf_execute(fft2);
    fftw_lock();

    /* Apply contrast normalisation filter */
    for(j = 0; j < height; j++)
    {
        for(i = 0; i < width; i++)
        {
            out[j*width+i][0] *= gfc[j*width + i];
            out[j*width+i][1] *= gfc[j*width + i];
        }
    }

    /* IFFT */
    fftwf_plan ifft2 = fftwf_plan_dft_2d(width, height, out, in2, FFTW_BACKWARD, FFTW_ESTIMATE);
    fftw_unlock();
    fftwf_execute(ifft2);
    fftw_lock();

    /* Get result from contrast normalisation filter */
    for(j = 0; j < height; j++)
    {
        for(i = 0; i < width; i++) {
            img_pad->data[j*stride+i] = img_pad->data[j*stride + i] / (0.2f+sqrt(sqrt(in2[j*width+i][0]*in2[j*width+i][0]+in2[j*width+i][1]*in2[j*width+i][1]) / (width*height)));
        }
    }

    image_rem_padding(src, img_pad, 5);

    /* Free */
    fftwf_destroy_plan(fft1);
    fftwf_destroy_plan(fft2);
    fftwf_destroy_plan(ifft1);
    fftwf_destroy_plan(ifft2);

    image_delete(img_pad);

    fftwf_free(in1);
    fftwf_free(in2);
    fftwf_free(out);
    fftwf_free(fx);
    fftwf_free(fy);
    fftwf_free(gfc);

    fftw_unlock();
}
Esempio n. 9
0
static image_list_t *create_gabor(int nscales, const int *or, int width, int height)
{
    int i, j, fn;

    image_list_t *G = image_list_new();
    
    int nfilters = 0;
    for(i=0;i<nscales;i++)  nfilters+=or[i];

    float **param = (float **) malloc(nscales * nfilters * sizeof(float *));
    for(i = 0; i < nscales * nfilters; i++) {
        param[i] = (float *) malloc(4*sizeof(float));
    }

    float *fx = (float *) malloc(width*height*sizeof(float));
    float *fy = (float *) malloc(width*height*sizeof(float));
    float *fr = (float *) malloc(width*height*sizeof(float));
    float *f  = (float *) malloc(width*height*sizeof(float));

    int l = 0;
    for(i = 1; i <= nscales; i++)
    {
        for(j = 1; j <= or[i-1]; j++)
        {
            param[l][0] = 0.35f;
            param[l][1] = 0.3/pow(1.85f, i-1);
            param[l][2] = 16*pow(or[i-1], 2)/pow(32, 2);
            param[l][3] = M_PI/(or[i-1])*(j-1);
            l++;
        }
    }

    for(j = 0; j < height; j++)
    {
        for(i = 0; i < width; i++)
        {
            fx[j*width + i] = (float) i - width/2.0f;
            fy[j*width + i] = (float) j - height/2.0f;
            fr[j*width + i] = sqrt(fx[j*width + i]*fx[j*width + i] + fy[j*width + i]*fy[j*width + i]);
            f[j*width + i]  = atan2(fy[j*width + i], fx[j*width + i]);
        }
    }

    fftshift(fr, width, height);
    fftshift(f, width, height);

    for(fn = 0; fn < nfilters; fn++)
    {
        image_t *G0 = image_new(width, height);

        float *f_ptr = f;
        float *fr_ptr = fr;

        for(j = 0; j < height; j++)
        {
            for(i = 0; i < width; i++)
            {
                float tmp = *f_ptr++ + param[fn][3];

                if(tmp < -M_PI) {
                    tmp += 2.0f*M_PI;
                }
                else if (tmp > M_PI) {
                    tmp -= 2.0f*M_PI;
                }

                G0->data[j*G0->stride+i] = exp(-10.0f*param[fn][0]*(*fr_ptr/height/param[fn][1]-1)*(*fr_ptr/width/param[fn][1]-1)-2.0f*param[fn][2]*M_PI*tmp*tmp);
                fr_ptr++;
            }
        }

        image_list_append(G, G0);
    }

    for(i = 0; i < nscales * nfilters; i++) {
        free(param[i]);
    }
    free(param);

    free(fx);
    free(fy);
    free(fr);
    free(f);

    return G;
}
Esempio n. 10
0
void CBlasMath::ifftshift(Matrix *a)
{
    fftshift(a);
}