void VoiceAnalyzer::analyzeVoice() { m_fftHelper->calculateFFT(m_samples); int index = m_fftHelper->getMaximumDensityIndex(); if(index == -1) { emit lowVoice(); qDebug() << "low voice"; return; } qreal stepSizeInFrequency = (qreal)m_format.sampleRate() / (m_totalSampleCount * m_stepSize); qreal newFrequency = (qreal)(index) * stepSizeInFrequency; m_currentFrequency = newFrequency; int correctIndex = qRound(m_frequency / stepSizeInFrequency); qreal value = 0; if (m_frequency > newFrequency * TargetFrequencyParameter){ qDebug() << "compare" << "low" << newFrequency << m_frequency - stepSizeInFrequency * correctIndex << (m_frequency - stepSizeInFrequency * correctIndex) / stepSizeInFrequency; value = -m_maximumVoiceDifference; } else if (m_frequency * TargetFrequencyParameter < newFrequency){ qDebug() << "compare" << "high" << newFrequency << m_frequency - stepSizeInFrequency * correctIndex << ( m_frequency - stepSizeInFrequency * correctIndex) / stepSizeInFrequency; value = m_maximumVoiceDifference; } else { value = log(newFrequency / (stepSizeInFrequency * correctIndex)) * 12 / M_LN2; qDebug() << "compare" << value << newFrequency << m_frequency - stepSizeInFrequency * correctIndex << ( m_frequency - stepSizeInFrequency * correctIndex) / stepSizeInFrequency; } QVariant valueVar(value); emit voiceDifference(valueVar); if(correctIndex == index){ emit(correctFrequency()); } }
/** * Analyzes the voice frequency and emits appropriate signals. */ void VoiceAnalyzer::analyzeVoice() { m_fftHelper->calculateFFT(m_samples); int index = m_fftHelper->getMaximumDensityIndex(); // If index == -1 if (index == -1) { // The voice is to be filtered away. // Emit the lowVoice signal and return. emit lowVoice(); qDebug() << "low voice"; return; } // Else, continue // Let the correctIndex to be // the nearest index corresponding to the correct frequency. qreal stepSizeInFrequency = (qreal)m_format.sampleRate() / (m_totalSampleCount * m_stepSize); qreal newFrequency = qreal(index) * stepSizeInFrequency; // Calculate the nearest index corresponding to the correct frequency. int correctIndex = qRound(m_frequency / stepSizeInFrequency); qreal value = 0; // If the obtained frequency is more than // log_2(TargetFrequencyParameter) octaves less than the m_frequency: // Note: // Instead of m_frequency/TargetFrequencyParameter > newFrequency, // the comparison is done without a div instructions by // m_frequency > newFrequency * TargetFrequencyParameter. if (m_frequency > newFrequency * TargetFrequencyParameter) { // Set the difference value to be -m_maximumVoiceDifference. qDebug() << "compare" << "low" << newFrequency << m_frequency - stepSizeInFrequency * correctIndex << (m_frequency - stepSizeInFrequency * correctIndex) / stepSizeInFrequency; value = -m_maximumVoiceDifference; } // Else, if the obtained frequency is more than // log_2(TargetFrequencyParameter) octaves more than the m_frequency: else if (m_frequency*TargetFrequencyParameter < newFrequency) { // Set the difference value to be m_maximumVoiceDifference. qDebug() << "compare" << "high" << newFrequency << m_frequency - stepSizeInFrequency * correctIndex << (m_frequency - stepSizeInFrequency * correctIndex) / stepSizeInFrequency; value = m_maximumVoiceDifference; } // Else: else { // Calculate the difference between the obtained and the correct // frequency in tones. // Use stepSizeInFrequency * correctIndex instead of // m_frequency so that the value is zero when there is correct // voice obtained. Set the difference value to be // log(frequency / target frequency) * 12 / log(2). value = log(newFrequency / (stepSizeInFrequency * correctIndex)) * 12 / M_LN2; qDebug() << "compare" << value << newFrequency << m_frequency - stepSizeInFrequency * correctIndex << (m_frequency - stepSizeInFrequency * correctIndex) / stepSizeInFrequency; } // Emit voiceDifference signal. QVariant valueVar(value); //Has to be QVariant for QML emit voiceDifference(valueVar); // If the correctIndex is index, emit the correctFrequency signal. if (correctIndex == index) { emit(correctFrequency()); } }