private void ComputeDo3Band(byte[] pkgData, long lBytesToWrite, WAVEFORMATEXTENSION _waveFormat) { if (GetAudioData(pkgData, lBytesToWrite, _waveFormat)) { EQSTATE eqs = new EQSTATE(); AudioBandsConfig.init_3band_state(eqs, LowFrequence, HighFrequence, (int)_waveFormat.NSamplesPerSec); //for (int i = 0; i < m_nNumSamples; i++) for (int i = 0; i < m_RealIn_RT.Count; i++) { m_Band_arr.Add(AudioBandsConfig.do_3band(eqs, m_RealIn_RT[i])); m_BandLow_arr.Add(AudioBandsConfig.do_3bandLow(eqs, m_RealIn_LT[i])); } double A2, dSum = 0, A2Low, dSumLow = 0; for (int i = 0; i < m_Band_arr.Count; i++) { A2 = m_Band_arr[i] * m_Band_arr[i]; dSum += A2; A2Low = m_BandLow_arr[i] * m_BandLow_arr[i]; dSumLow += A2Low; } double dAvg = dSum / m_nNumSamples; double dAvgLow = dSumLow / m_nNumSamples; double dFinal = Math.Sqrt(dAvg); double dFinalLow = Math.Sqrt(dAvgLow); double dOutput = dFinal * Math.Sqrt(2) / 32768 * 100; double dOutputLow = dFinalLow * Math.Sqrt(2) / 32768 * 100; _audiopluseCallBack(dOutput, dOutputLow); } }
/// <summary> /// Initialize EQ /// /// Recommended frequencies are ... /// lowfreq = 880 Hz /// highfreq = 5000 Hz /// Set mixfreq to whatever rate your system is using (eg 48Khz) /// </summary> public static void init_3band_state(EQSTATE es, int lowfreq, int highfreq, int mixfreq) { // Clear state // Set Low/Mid/High gains to unity es.lg = 5.0; // updated to fine tune es.mg = 1.0; es.hg = 8.0; // updated to fine tune output // Calculate filter cutoff frequencies es.lf = 2 * Math.Sin(Math.PI * ((double)lowfreq / (double)mixfreq)); es.hf = 2 * Math.Sin(Math.PI * ((double)highfreq / (double)mixfreq)); }
const double vsa = (1.0 / 4294967295.0); // Very small amount (Denormal Fix) /// <summary> /// Gets the high value based on a sample and a EQSTATE. /// /// sample can be any range you like :) /// Note that the output will depend on the gain settings for each band /// (especially the bass) so may require clipping before output, but you /// knew that anyway :) /// </summary> public static double do_3band(EQSTATE es, double sample) { // Locals double l, m, h; // Low / Mid / High - Sample Values // Filter #1 (lowpass) es.f1p0 += (es.lf * (sample - es.f1p0)) + vsa; es.f1p1 += (es.lf * (es.f1p0 - es.f1p1)); es.f1p2 += (es.lf * (es.f1p1 - es.f1p2)); es.f1p3 += (es.lf * (es.f1p2 - es.f1p3)); l = es.f1p3; // Filter #2 (highpass) es.f2p0 += (es.hf * (sample - es.f2p0)) + vsa; es.f2p1 += (es.hf * (es.f2p0 - es.f2p1)); es.f2p2 += (es.hf * (es.f2p1 - es.f2p2)); es.f2p3 += (es.hf * (es.f2p2 - es.f2p3)); h = es.sdm3 - es.f2p3; // Calculate midrange (signal - (low + high)) m = es.sdm3 - (h + l); // Scale, Combine and store l *= es.lg; m *= es.mg; h *= es.hg; // Shuffle history buffer es.sdm3 = es.sdm2; es.sdm2 = es.sdm1; es.sdm1 = sample; return(h); }
float do_3band(ref EQSTATE es, float sample) { float l, m, h; es.f1p0 += (es.lf * (sample - es.f1p0)) + vsa; es.f1p1 += (es.lf * (es.f1p0 - es.f1p1)); es.f1p2 += (es.lf * (es.f1p1 - es.f1p2)); es.f1p3 += (es.lf * (es.f1p2 - es.f1p3)); l = es.f1p3; es.f2p0 += (es.hf * (sample - es.f2p0)) + vsa; es.f2p1 += (es.hf * (es.f2p0 - es.f2p1)); es.f2p2 += (es.hf * (es.f2p1 - es.f2p2)); es.f2p3 += (es.hf * (es.f2p2 - es.f2p3)); h = es.sdm3 - es.f2p3; m = es.sdm3 - (h + l); l *= es.lg; m *= es.mg; h *= es.hg; es.sdm3 = es.sdm2; es.sdm2 = es.sdm1; es.sdm1 = sample; return(l + m + h); }
void init_3band_state(ref EQSTATE es, int lowfreq, int highfreq, int mixfreq) { es.lg = 1.0f; es.mg = 1.0f; es.hg = 1.0f; es.lf = 2f * Mathf.Sin(Mathf.PI * ((float)lowfreq / (float)mixfreq)); es.hf = 2f * Mathf.Sin(Mathf.PI * ((float)highfreq / (float)mixfreq)); }