SpectrumAnalyser::SpectrumAnalyser(QObject *parent)
    :   QObject(parent)
    ,   m_thread(new SpectrumAnalyserThread(this))
    ,   m_state(Idle)
#ifdef DUMP_SPECTRUMANALYSER
    ,   m_count(0)
#endif
{
    CHECKED_CONNECT(m_thread, SIGNAL(calculationComplete(FrequencySpectrum)),
                    this, SLOT(calculationComplete(FrequencySpectrum)));
}
Ejemplo n.º 2
0
  bool BasisSet::calculateCubeDensity(Cube *cube)
  {
    // FIXME Still not working, committed so others could see current state.

    // Must be called before calculations begin
    initCalculation();

    // Set up the points we want to calculate the density at
    m_basisShells = new QVector<BasisShell>(cube->data()->size());

    for (int i = 0; i < m_basisShells->size(); ++i) {
      (*m_basisShells)[i].set = this;
      (*m_basisShells)[i].tCube = cube;
      (*m_basisShells)[i].pos = i;
    }

    // Lock the cube until we are done.
    cube->lock()->lockForWrite();

    // Watch for the future
    connect(&m_watcher, SIGNAL(finished()), this, SLOT(calculationComplete()));

    // The main part of the mapped reduced function...
    m_future = QtConcurrent::map(*m_basisShells, BasisSet::processDensity);
    // Connect our watcher to our future
    m_watcher.setFuture(m_future);

    return true;
  }
Ejemplo n.º 3
0
  bool BasisSet::calculateCubeMO(Cube *cube, int state)
  {
    // Set up the calculation and ideally use the new QtConcurrent code to
    // multithread the calculation...
    if (state < 1 || state > m_moMatrix.rows())
      return false;

    // Must be called before calculations begin
    initCalculation();

    // Set up the points we want to calculate the density at
    m_basisShells = new QVector<BasisShell>(cube->data()->size());

    for (int i = 0; i < m_basisShells->size(); ++i) {
      (*m_basisShells)[i].set = this;
      (*m_basisShells)[i].tCube = cube;
      (*m_basisShells)[i].pos = i;
      (*m_basisShells)[i].state = state;
    }

    // Lock the cube until we are done.
    cube->lock()->lockForWrite();

    // Watch for the future
    connect(&m_watcher, SIGNAL(finished()), this, SLOT(calculationComplete()));

    // The main part of the mapped reduced function...
    m_future = QtConcurrent::map(*m_basisShells, BasisSet::processPoint);
    // Connect our watcher to our future
    m_watcher.setFuture(m_future);

    return true;
  }
Ejemplo n.º 4
0
void GaussianSet::calculationComplete()
{
  disconnect(&m_watcher, SIGNAL(finished()), this, SLOT(calculationComplete()));
  (*m_gaussianShells)[0].tCube->lock()->unlock();
  delete m_gaussianShells;
  m_gaussianShells = 0;
  emit finished();
}
void SpectrumAnalyserThread::calculateSpectrum(const QByteArray &buffer,
        int inputFrequency,
        int bytesPerSample, bool isSample,char phoneme)
{
#ifndef DISABLE_FFT
    //Q_ASSERT(buffer.size() == m_numSamples * bytesPerSample);

    // Initialize data array
    const char *ptr = buffer.constData();
    for (int i=0; i<m_numSamples; ++i) {
        const qint16 pcmSample = *reinterpret_cast<const qint16*>(ptr);
        // Scale down to range [-1.0, 1.0]
        const DataType realSample = pcmToReal(pcmSample);
        const DataType windowedSample = realSample * m_window[i];
        m_input[i] = windowedSample;
        ptr += bytesPerSample;
    }

    // Calculate the FFT
    m_fft->calculateFFT(m_output.data(), m_input.data());

    // Analyze output to obtain amplitude and phase for each frequency

    FrequencySpectrum spectrum(SpectrumLengthSamples);
    if (isSample)
    {
        spectrum.setPhoneme(phoneme);
    }
    for (int i=2; i<=m_numSamples/2; ++i) {
        // Calculate frequency of this complex sample
        spectrum[i].frequency = qreal(i * inputFrequency) / (m_numSamples);

        const qreal real = m_output[i];
        qreal imag = 0.0;
        if (i>0 && i<m_numSamples/2)
            imag = m_output[m_numSamples/2 + i];

        const qreal magnitude = sqrt(real*real + imag*imag);
        qreal amplitude = SpectrumAnalyserMultiplier * log(magnitude);

        // Bound amplitude to [0.0, 1.0]
        spectrum[i].clipped = (amplitude > 1.0);
        amplitude = qMax(qreal(0.0), amplitude);
        amplitude = qMin(qreal(1.0), amplitude);
        spectrum[i].amplitude = amplitude;
    }

#endif
    if (!isSample)
    {
        emit calculationComplete(spectrum);
    }
    else
    {
        emit sampleLoaded(spectrum);
    }
}
Ejemplo n.º 6
0
 void BasisSet::calculationComplete()
 {
   disconnect(&m_watcher, SIGNAL(finished()), this, SLOT(calculationComplete()));
   qDebug() << (*m_basisShells)[0].tCube->name()
       << (*m_basisShells)[0].tCube->data()->at(0)
       << (*m_basisShells)[0].tCube->data()->at(1);
   (*m_basisShells)[0].tCube->lock()->unlock();
   delete m_basisShells;
   emit finished();
 }
Ejemplo n.º 7
0
//计算频谱
void SpectrumAnalyserThread::calculateSpectrum(const QByteArray &buffer, int inputFrequency, int bytesPerSample)
{
#ifndef DISABLE_FFT
    Q_ASSERT(buffer.size() == m_numSamples * bytesPerSample);

    // Initialize data array
    const char *ptr = buffer.constData();
    for (int i=0; i<m_numSamples; ++i)
    {
        const qint16 pcmSample = *reinterpret_cast<const qint16*>(ptr);
        // Scale down to range [-1.0, 1.0]
        const DataType realSample = pcmToReal(pcmSample);
        const DataType windowedSample = realSample * m_window[i];
        m_input[i] = windowedSample;
        ptr += bytesPerSample;
    }

    // Calculate the FFT快速傅里叶变换
    m_fft ->calculateFFT(m_output.data(), m_input.data());

    // Analyze output to obtain amplitude and phase for each frequency
    for (int i = 2; i <= m_numSamples / 2; ++i)
    {
        // Calculate frequency of this complex sample
        m_spectrum[i].frequency = double(i * inputFrequency) / (m_numSamples);

        const double real = m_output[i];
        double imag = 0.0;
        if (i > 0 && i < m_numSamples / 2)
        {
            imag = m_output[m_numSamples / 2 + i];
        }

        const double magnitude = sqrt(real * real + imag * imag);
        double amplitude = SpectrumAnalyserMultiplier * log(magnitude);

        // Bound amplitude to [0.0, 1.0]
        m_spectrum[i].clipped = (amplitude > 1.0);
        amplitude = qMax(double(0.0), amplitude);
        amplitude = qMin(double(1.0), amplitude);
        m_spectrum[i].amplitude = amplitude;
    }
#endif

    emit calculationComplete(m_spectrum);	//发射计算完成信号
}
void SpectrumAnalyserThread::calculateSpectrum(const QByteArray &buffer, int inputFrequency, int bytesPerSample) {

    Q_ASSERT(buffer.size() == m_numSamples * bytesPerSample);

    // Initialize data array
    const char *ptr = buffer.constData();
    for (int i = 0; i < m_numSamples; ++i) {
		
		const qint16 pcmSample = *reinterpret_cast<const qint16*>(ptr);
        // Scale down to range [-1.0, 1.0]
        const DataType realSample = pcmToReal(pcmSample);
        const DataType windowedSample = realSample * m_window[i];
        m_input[i] = windowedSample;
		m_cpxInput[i].re = windowedSample;
		m_cpxInput[i].im = 0.0f;
        ptr += bytesPerSample;
    }

    // Calculate the FFT
    m_fft->DoFFTWForward(m_cpxInput, m_cpxOutput, SpectrumLengthSamples);

    // Analyze output to obtain amplitude and phase for each frequency
    for (int i = 2; i <= m_numSamples / 2; ++i) {
        // Calculate frequency of this complex sample
        m_spectrum[i].frequency = qreal(i * inputFrequency) / (m_numSamples);

        //const qreal real = m_output[i];
		const qreal real = m_cpxOutput[i].re;
        qreal imag = 0.0;
        if (i > 0 && i < m_numSamples / 2)
            //imag = m_output[m_numSamples/2 + i];
			imag = m_cpxOutput[m_numSamples/2 + i].re;

        const qreal magnitude = sqrt(real*real + imag*imag);
        qreal amplitude = SpectrumAnalyserMultiplier * log(magnitude);

        // Bound amplitude to [0.0, 1.0]
        m_spectrum[i].clipped = (amplitude > 1.0);
        amplitude = qMax(qreal(0.0), amplitude);
        amplitude = qMin(qreal(1.0), amplitude);
        m_spectrum[i].amplitude = amplitude;
    }

    emit calculationComplete(m_spectrum);
}
Ejemplo n.º 9
0
  void VdWSurface::calculateCube(Cube *cube)
  {
    // Set up the calculation and ideally use the new QtConcurrent code to
    m_VdWvector.resize(cube->data()->size());
    m_cube = cube;

    for (int i = 0; i < m_VdWvector.size(); ++i) {
      m_VdWvector[i].atomPos = &m_atomPos;
      m_VdWvector[i].atomRadius = &m_atomRadius;
      m_VdWvector[i].cube = cube;
      m_VdWvector[i].pos = i;
    }

    // Lock the cube until we are done.
    cube->lock()->lockForWrite();

    // Watch for the future
    connect(&m_watcher, SIGNAL(finished()), this, SLOT(calculationComplete()));

    // The main part of the mapped reduced function...
    m_future = QtConcurrent::map(m_VdWvector, VdWSurface::processPoint);
    // Connect our watcher to our future
    m_watcher.setFuture(m_future);
  }
Ejemplo n.º 10
0
 void VdWSurface::calculationComplete()
 {
   disconnect(&m_watcher, SIGNAL(finished()), this, SLOT(calculationComplete()));
   m_cube->lock()->unlock();
   m_cube->update();
 }