Chris@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@0: Chris@9: #ifdef VST Chris@9: #include "devuvuzelator-vst.h" Chris@9: #else Chris@9: #ifdef LADSPA Chris@9: #include "devuvuzelator-ladspa.h" Chris@9: #else Chris@9: #error Need to define either VST or LADSPA Chris@9: #endif Chris@9: #endif Chris@9: Chris@0: void Chris@0: Devuvuzelator::processSpectralFrame() Chris@0: { Chris@2: double lowfun = m_fundamental - m_bandwidth/2; Chris@2: double highfun = m_fundamental + m_bandwidth/2; Chris@0: Chris@2: for (int h = 1; h <= m_harmonics; ++h) { Chris@0: Chris@1: double lowfreq = lowfun * h; Chris@1: double highfreq = highfun * h; Chris@0: Chris@11: int lowbin = int(0.5 + (m_fftsize * lowfreq) / m_sampleRate); Chris@11: int highbin = int(0.5 + (m_fftsize * highfreq) / m_sampleRate); Chris@1: Chris@4: for (int i = lowbin; i <= highbin; ++i) { Chris@9: Chris@11: double mag = sqrt(m_real[i] * m_real[i] + m_imag[i] * m_imag[i]); Chris@11: Chris@4: if (!m_medians[i]) { Chris@9: // allocation in RT context, sorry! but this happens only Chris@9: // the first time through Chris@9: int filterlen = (m_filtersecs * m_sampleRate) / m_increment; Chris@4: m_medians[i] = new MedianFilter(filterlen); Chris@4: } Chris@4: Chris@11: m_medians[i]->push(mag); Chris@4: double threshold = m_medians[i]->getAt(m_reduction); Chris@8: Chris@11: if (mag > threshold && mag > 0.0) { Chris@11: double target = mag - threshold; Chris@11: double ratio = (target / mag); Chris@9: m_real[i] *= ratio; Chris@9: m_imag[i] *= ratio; Chris@4: } else { Chris@9: m_real[i] = 0.0; Chris@9: m_imag[i] = 0.0; Chris@0: } Chris@0: } Chris@0: } Chris@0: }