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))); }
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; }
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; }
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); } }
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(); }
//计算频谱 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); }
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); }
void VdWSurface::calculationComplete() { disconnect(&m_watcher, SIGNAL(finished()), this, SLOT(calculationComplete())); m_cube->lock()->unlock(); m_cube->update(); }