void Filter::setCoordinates (ComplexVector& zeros, ComplexVector& poles)
{
    this->zeros->clear();
    delete this->zeros;

    this->poles->clear();
    delete this->poles;

    this->zeros = &zeros;
    this->poles = &poles;

    delete[] zeroBuffer.buffer;
    delete[] zeroBuffer.coefficients;

    delete[] poleBuffer.buffer;
    delete[] poleBuffer.coefficients;

    zeroBuffer.position     = 0;
    zeroBuffer.size         = (int)zeros.size() + 1;
    zeroBuffer.buffer       = new float[zeroBuffer.size];
    zeroBuffer.coefficients = getCoefficients(1, zeros);

    poleBuffer.position     = 0;
    poleBuffer.size         = (int)poles.size() + 1;
    poleBuffer.buffer       = new float[poleBuffer.size];
    poleBuffer.coefficients = getCoefficients(1, poles);
}
Exemple #2
0
void ComplexProducer::run() {

  ComplexVector * out = produce(output);	
  
  out->clear_items();

  msg = "producing ";
  for (int k=0; k<16; k++) {
	//std::complex<double> c = exp(i*2*k*M_PI/16.0);
	std::complex<double> c = cos(2*k*M_PI/16)+i*sin(2*k*M_PI/16);
  	out->put_item(c);
	msg += to_string(c.real()) + "," + to_string(c.imag()) + "i  "; 
  }

  log(msg);

  //timer.randSleep(200);

  if(number >= last)
    setEos(output);

  number += step;
  release(output);  

}
Exemple #3
0
void displayData(const ComplexVector<T> &data, ImageSize size, const QString& title)
{
    std::vector<T> dataValue;
    int n0 = size.x;
    int n1 = size.y;
    int n2 = size.z;

    if (n2 < 2) n2 = 2;

    int nImages = 4;

    int start = (n0 * n1) * (n2 / 2 - 3);
    int end = (n0 * n1) * (n2 / 2 - 3 + nImages);

    for (auto it = data.begin() + start; it < data.begin() + end; it++) {
        float value = std::abs(*it);
        dataValue.push_back(value);
    }

    float max = *std::max_element(dataValue.begin(), dataValue.end());
    float min = *std::min_element(dataValue.begin(), dataValue.end());

    QImage dataImage(n1 * nImages, n0, QImage::Format_Indexed8);
    for (int i = 0; i < 256; i++) {
        dataImage.setColor(i, qRgb(i, i, i));
    }

    int i = 0;
    for (int y = 0; y < n0; y++) {
        auto imageLine = dataImage.scanLine(y);
        i = y * n1;
        for (int j = 0; j < nImages; j++)
        {
            for (int x = j * n0; x < j * n0 + n1; x++)
            {
                Q_ASSERT(i < dataValue.size());
                uint idx;
                if (max == min)
                    idx = 127;
                else
                    idx = (dataValue[i] - min) / (max - min) * 255;
                imageLine[x] = idx;
                i++;
            }
            i += n0 * (n1 - 1);
        }
    }

    QPixmap pixmap = QPixmap::fromImage(dataImage);

    QLabel *imgWnd = new QLabel("Image Window");
    imgWnd->setWindowTitle(title);
    imgWnd->setPixmap(pixmap);
    imgWnd->show();
}
Exemple #4
0
void test_scalar_generic(int nfft)
{
    typedef typename FFT<T>::Complex Complex;
    typedef typename FFT<T>::Scalar Scalar;
    typedef typename VectorType<Container, Scalar>::type ScalarVector;
    typedef typename VectorType<Container, Complex>::type ComplexVector;

    FFT<T>        fft;
    ScalarVector  tbuf(nfft);
    ComplexVector freqBuf;

    for (int k = 0; k < nfft; ++k)
        tbuf[k] = (T)(rand() / (double)RAND_MAX - .5);

    // make sure it DOESN'T give the right full spectrum answer
    // if we've asked for half-spectrum
    fft.SetFlag(fft.HalfSpectrum);
    fft.fwd(freqBuf, tbuf);
    VERIFY((size_t)freqBuf.size() == (size_t)((nfft >> 1) + 1));
    VERIFY(fft_rmse(freqBuf, tbuf) < test_precision<T>());  // gross check

    fft.ClearFlag(fft.HalfSpectrum);
    fft.fwd(freqBuf, tbuf);
    VERIFY((size_t)freqBuf.size() == (size_t)nfft);
    VERIFY(fft_rmse(freqBuf, tbuf) < test_precision<T>());  // gross check

    if (nfft & 1)
        return; // odd FFTs get the wrong size inverse FFT

    ScalarVector tbuf2;
    fft.inv(tbuf2, freqBuf);
    VERIFY(dif_rmse(tbuf, tbuf2) < test_precision<T>());  // gross check


    // verify that the Unscaled flag takes effect
    ScalarVector tbuf3;
    fft.SetFlag(fft.Unscaled);

    fft.inv(tbuf3, freqBuf);

    for (int k = 0; k < nfft; ++k)
        tbuf3[k] *= T(1. / nfft);


    // for (size_t i=0;i<(size_t) tbuf.size();++i)
    //    cout << "freqBuf=" << freqBuf[i] << " in2=" << tbuf3[i] << " -  in=" << tbuf[i] << " => " << (tbuf3[i] - tbuf[i] ) <<  endl;

    VERIFY(dif_rmse(tbuf, tbuf3) < test_precision<T>());  // gross check

    // verify that ClearFlag works
    fft.ClearFlag(fft.Unscaled);
    fft.inv(tbuf2, freqBuf);
    VERIFY(dif_rmse(tbuf, tbuf2) < test_precision<T>());  // gross check
}
// [[Rcpp::export]]
ComplexVector complex_CPLXSXP( ComplexVector x ){
    int nn = x.size();
	for( int i=0; i<nn; i++) {
		x[i].r = x[i].r*2 ;
		x[i].i = x[i].i*2 ;
	}
	return x ;
}
Exemple #6
0
void NRLib::WriteComplexVector(const std::string   & header,
                               const ComplexVector & c)
{
  int n = c.length();
  LogKit::LogFormatted(LogKit::Error,"\n"+header+"\n");
  for (int i=0; i < n ; i++) {
    LogKit::LogFormatted(LogKit::Error,"(%12.8f, %12.8f)\n",c(i).real(),c(i).imag());
  }
  LogKit::LogFormatted(LogKit::Error,"\n");
}
// response = X, signal = x
void Filter::inverseFourierTransform (ComplexVector& response, ComplexVector& signal)
{
    float N = response.size();

    for (int n = 0; n < signal.size(); ++n)
    {
        signal[n] = newComplex(0, 0);

        for (int k = 0; k < response.size(); ++k)
        {
            float alpha = 2*M_PI * k / N * n;

            Complex Z = newComplex(cosf(alpha), sinf(alpha));

            signal[n] = signal[n] + (polToCar(response[k]) * Z);
        }

        signal[n] = signal[n] / newComplex(N, 0);
    }
}
//==================================================================
// signal = x, response = X
void Filter::fourierTransform (ComplexVector& signal, ComplexVector& response)
{
    float N = response.size();

    for (int k = 0; k < response.size(); ++k)
    {
        response[k] = newComplex(0, 0);

        for (int n = 0; n < signal.size(); ++n)
        {
            float alpha = 2*M_PI * k / N * -n;

            Complex Z = newComplex(cosf(alpha), sinf(alpha));

            response[k] = response[k] + (signal[n] * Z);
        }

        response[k] = carToPol(response[k]);
    }
}
Exemple #9
0
void run_test(const Matrix &mat, int k, int m)
{
    DenseGenMatProd<double> op(mat);
    GenEigsSolver<double, SelectionRule, DenseGenMatProd<double>> eigs(&op, k, m);
    eigs.init();
    int nconv = eigs.compute();
    int niter = eigs.num_iterations();
    int nops = eigs.num_operations();

    REQUIRE( nconv > 0 );

    ComplexVector evals = eigs.eigenvalues();
    ComplexMatrix evecs = eigs.eigenvectors();

    ComplexMatrix err = mat * evecs - evecs * evals.asDiagonal();

    INFO( "nconv = " << nconv );
    INFO( "niter = " << niter );
    INFO( "nops = " << nops );
    INFO( "||AU - UD||_inf = " << err.array().abs().maxCoeff() );
    REQUIRE( err.array().abs().maxCoeff() == Approx(0.0) );
}
Exemple #10
0
void ImageFilter<T>::crop(const ImageSize &imageSize)
{
    auto size = m_associatedData.imageSize();
    auto x0 = (size.x - imageSize.x) / 2;
    auto y0 = (size.y - imageSize.y) / 2;
    auto z0 = (size.z - imageSize.z) / 2;

    if (x0 < 0 || y0 < 0 || z0 < 0) {
        std::cerr << "Crop size larger than image" << std::endl;
        return;
    }

    ComplexVector<T> out;
    ImageData<T> img(m_associatedData.dim(), imageSize);
    for (int n = 0; n < m_associatedData.channels(); n++)
    {
        out.resize(imageSize.x * imageSize.y * imageSize.z);
        auto itOut = out.begin();
        auto itInput = m_associatedData.getChannelImage(n)->cbegin();

        for (auto z = 0ul; z < imageSize.z; z++)
        {
            auto in1 = (z + z0) * (size.x * size.y) + y0 * size.x;
            for (auto y = 0ul; y < imageSize.y; y++)
            {
                auto in2 = y * size.x + in1 + x0;
                for (auto x = 0ul; x < imageSize.x; x++)
                {
                    auto in3 = x + in2;
                    *(itOut++) = *(itInput + in3);
                }
            }
        }
        img.addChannelImage(std::move(out));
    }
    m_associatedData = std::move(img);
}
Exemple #11
0
void run_test(const MatType& mat, int k, int m, double sigma, bool allow_fail = false)
{
    typename OpTypeTrait<MatType>::OpType op(mat);
    GenEigsRealShiftSolver<double, SelectionRule, typename OpTypeTrait<MatType>::OpType>
        eigs(&op, k, m, sigma);
    eigs.init();
    int nconv = eigs.compute();
    int niter = eigs.num_iterations();
    int nops  = eigs.num_operations();

    if(allow_fail)
    {
        if( eigs.info() != SUCCESSFUL )
        {
            WARN( "FAILED on this test" );
            std::cout << "nconv = " << nconv << std::endl;
            std::cout << "niter = " << niter << std::endl;
            std::cout << "nops  = " << nops  << std::endl;
            return;
        }
    } else {
        INFO( "nconv = " << nconv );
        INFO( "niter = " << niter );
        INFO( "nops  = " << nops );
        REQUIRE( eigs.info() == SUCCESSFUL );
    }

    ComplexVector evals = eigs.eigenvalues();
    ComplexMatrix evecs = eigs.eigenvectors();

    ComplexMatrix resid = mat * evecs - evecs * evals.asDiagonal();
    const double err = resid.array().abs().maxCoeff();

    INFO( "||AU - UD||_inf = " << err );
    REQUIRE( err == Approx(0.0) );
}
Exemple #12
0
void BitReverse::run() {
  ComplexVector * in = consume(input);

  for (int ii = 0, j = 1; j < in->vector_size()-1; j++) {
        for (int k = in->vector_size() >> 1; k > (ii ^= k); k >>= 1);
        if (ii < j) in->swap_item(ii, j);
  }

  msg = "consuming \n";
  for (int k=0; k<in->vector_size(); k++) {
	  item = in->get_item(k);
	  msg += to_string(item.real())+","+to_string(item.imag())+"i  ";
  }
  log(msg);
  
  //timer.randSleep(200);
  
  release(input);
}
Exemple #13
0
/// Copy constructor.
/// @param v :: The other vector
ComplexVector::ComplexVector(const ComplexVector &v) {
  m_vector = gsl_vector_complex_alloc(v.size());
  gsl_vector_complex_memcpy(m_vector, v.gsl());
}