void Biquad::process(const float* sourceP, float* destP, size_t framesToProcess) { #if OS(DARWIN) // Use vecLib if available processFast(sourceP, destP, framesToProcess); #elif USE(WEBAUDIO_IPP) ippsIIR64f_32f(sourceP, destP, static_cast<int>(framesToProcess), m_biquadState); #else // USE(WEBAUDIO_IPP) int n = framesToProcess; // Create local copies of member variables double x1 = m_x1; double x2 = m_x2; double y1 = m_y1; double y2 = m_y2; double b0 = m_b0; double b1 = m_b1; double b2 = m_b2; double a1 = m_a1; double a2 = m_a2; while (n--) { // FIXME: this can be optimized by pipelining the multiply adds... float x = *sourceP++; float y = b0*x + b1*x1 + b2*x2 - a1*y1 - a2*y2; *destP++ = y; // Update state variables x2 = x1; x1 = x; y2 = y1; y1 = y; } // Local variables back to member. Flush denormals here so we // don't slow down the inner loop above. m_x1 = DenormalDisabler::flushDenormalFloatToZero(x1); m_x2 = DenormalDisabler::flushDenormalFloatToZero(x2); m_y1 = DenormalDisabler::flushDenormalFloatToZero(y1); m_y2 = DenormalDisabler::flushDenormalFloatToZero(y2); m_b0 = b0; m_b1 = b1; m_b2 = b2; m_a1 = a1; m_a2 = a2; #endif }
void Biquad::process(const float* sourceP, float* destP, size_t framesToProcess) { #if OS(DARWIN) // Use vecLib if available processFast(sourceP, destP, framesToProcess); #else int n = framesToProcess; // Create local copies of member variables double x1 = m_x1; double x2 = m_x2; double y1 = m_y1; double y2 = m_y2; double a0 = m_a0; double a1 = m_a1; double a2 = m_a2; double b1 = m_b1; double b2 = m_b2; while (n--) { // FIXME: this can be optimized by pipelining the multiply adds... float x = *sourceP++; float y = a0*x + a1*x1 + a2*x2 - b1*y1 - b2*y2; y *= m_g; *destP++ = y; // Update state variables x2 = x1; x1 = x; y2 = y1; y1 = y; } // Local variables back to member m_x1 = x1; m_x2 = x2; m_y1 = y1; m_y2 = y2; m_a0 = a0; m_a1 = a1; m_a2 = a2; m_b1 = b1; m_b2 = b2; #endif }