void SpectralNoiseSuppression::process(const MatrixXR& spectrum, MatrixXR* noise, MatrixXR* result){ const int rows = spectrum.rows(); const int cols = spectrum.cols(); (*result).resize(rows, cols); (*result) = spectrum; //DEBUG("SPECTRALNOISESUPPRESSION: Calculate wrapped magnitude."); // Calculate the wrapped magnitude of the spectrum _g = (1.0 / (_k1 - _k0 + 1.0) * spectrum.block(0, _k0, rows, _k1 - _k0).cwise().pow(1.0/3.0).rowwise().sum()).cwise().cube(); //cout << (_g) << endl; for ( int i = 0; i < cols; i++ ) { (*result).col(i) = (((*result).col(i).cwise() * _g.cwise().inverse()).cwise() + 1.0).cwise().log(); } //cout << (*result) << endl; //DEBUG("SPECTRALNOISESUPPRESSION: Estimate spectral noise."); // Estimate spectral noise _bands.process((*result), noise); //DEBUG("SPECTRALNOISESUPPRESSION: Suppress spectral noise."); // Suppress spectral noise (*result) = ((*result) - (*noise)).cwise().clipUnder(); }
void SpectralODFPhase::phaseDeviation(const MatrixXC& spectrum, const MatrixXR& spectrumArg, MatrixXR* odfValue) { const int rows = spectrum.rows(); const int cols = spectrum.cols(); _phaseDiff = spectrumArg.block(1, 0, rows - 1, cols) - spectrumArg.block(0, 0, rows - 1, cols); _instFreq = _phaseDiff.block(1, 0, rows - 2, cols) - _phaseDiff.block(0, 0, rows - 2, cols); if (_weighted) _instFreq.array() *= spectrum.block(2, 0, rows - 2, cols).array().abs(); if (_normalize) { (*odfValue) = _instFreq.rowwise().sum().array() / (cols * spectrum.block(2, 0, rows - 2, cols).array().abs().rowwise().sum()); return; } (*odfValue) = _instFreq.rowwise().sum() / cols; return; }
Real PitchSaliency::saliency(Real period, Real deltaPeriod, Real tLow, Real tUp, const MatrixXR& spectrum){ const int cols = spectrum.cols(); Real sum = 0.0; for ( int m = 1; m < _numHarmonics; m++ ) { int begin = (int)round(m * _fftSize / (period + (deltaPeriod / 2.0))); int end = min((int)round(m * _fftSize / (period - (deltaPeriod / 2.0))), cols - 1); if (begin < end) sum += harmonicWeight(period, tLow, tUp, m) * spectrum.block(0, begin, 1, end - begin).maxCoeff(); } return sum; }