📄 equalization.cpp
字号:
/* * MoreAmp * Copyright (C) 2004-2006 pmisteli * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */// this code contains extracts fromeq-xmms plugin/* * PCM time-domain equalizer * Copyright (C) 2002 Felipe Rivera <liebremx at users sourceforge net> * $Id: iir.c,v 1.5 2003/09/10 21:53:08 liebremx Exp $ */#include "stdafx.h"#ifdef __cplusplusextern "C"{#endif#include <stdio.h>#include <string.h>#include <limits.h> // for SHRT_MAX#include <math.h>#include "Equalization.h"int eq31EqualizeBlock(void* pcmblock, unsigned long pcmblocksize);int eq31EqualizerSetLevel(int band, double factor);int eq31Init(int bands, int bits16, int extra);typedef short gint16;typedef void* gpointer;/* Floating point */typedef struct { float beta; float alpha; float gamma;}sIIRCoefficients;/* Coefficient history for the IIR filter */typedef struct{ float x[3]; /* x[n], x[n-1], x[n-2] */ float y[3]; /* y[n], y[n-1], y[n-2] */}sXYData;int iir(gpointer * d, magint length);static sIIRCoefficients iir_cf2[]= { { (float)(6.6857185264e-01), (float)(1.6571407368e-01), (float)(1.4048592171e+00) }, // 4000.0 Hz { (float)(4.4861333678e-01), (float)(2.7569333161e-01), (float)(6.0518718075e-01) }, // 8000.0 Hz};static sIIRCoefficients iir_cf3[]= { { (float)(8.1778971701e-01), (float)(9.1105141497e-02), (float)(1.7444877599e+00) }, // 2000.0 Hz { (float)(6.6857185264e-01), (float)(1.6571407368e-01), (float)(1.4048592171e+00) }, // 4000.0 Hz { (float)(4.4861333678e-01), (float)(2.7569333161e-01), (float)(6.0518718075e-01) }, // 8000.0 Hz};static sIIRCoefficients iir_cf5[]= { { (float)(9.5105628526e-01), (float)(2.4471857368e-02), (float)(1.9461077269e+00) }, // 500.0 Hz { (float)(9.0450844499e-01), (float)(4.7745777504e-02), (float)(1.8852109613e+00) }, // 1000.0 Hz { (float)(8.1778971701e-01), (float)(9.1105141497e-02), (float)(1.7444877599e+00) }, // 2000.0 Hz { (float)(6.6857185264e-01), (float)(1.6571407368e-01), (float)(1.4048592171e+00) }, // 4000.0 Hz { (float)(4.4861333678e-01), (float)(2.7569333161e-01), (float)(6.0518718075e-01) }, // 8000.0 Hz};static sIIRCoefficients iir_cf10[]= { { (float)(9.9723137967e-01), (float)(1.3843101653e-03), (float)(1.9972115835e+00) }, // 31.2 Hz { (float)(9.9406142155e-01), (float)(2.9692892229e-03), (float)(1.9939823631e+00) }, // 62.5 Hz { (float)(9.8774277725e-01), (float)(6.1286113769e-03), (float)(1.9874275518e+00) }, // 125.0 Hz { (float)(9.7522112569e-01), (float)(1.2389437156e-02), (float)(1.9739682661e+00) }, // 250.0 Hz { (float)(9.5105628526e-01), (float)(2.4471857368e-02), (float)(1.9461077269e+00) }, // 500.0 Hz { (float)(9.0450844499e-01), (float)(4.7745777504e-02), (float)(1.8852109613e+00) }, // 1000.0 Hz { (float)(8.1778971701e-01), (float)(9.1105141497e-02), (float)(1.7444877599e+00) }, // 2000.0 Hz { (float)(6.6857185264e-01), (float)(1.6571407368e-01), (float)(1.4048592171e+00) }, // 4000.0 Hz { (float)(4.4861333678e-01), (float)(2.7569333161e-01), (float)(6.0518718075e-01) }, // 8000.0 Hz { (float)(2.4201241845e-01), (float)(3.7899379077e-01), (float)(-8.0847117831e-01) }, // 16000.0 Hz};static sIIRCoefficients iir_cf31[]= { { (float)(9.9939854113e-01), (float)(3.0072943419e-04), (float)(1.9993904238e+00) }, // 20.0 Hz { (float)(9.9940551149e-01), (float)(2.9724425274e-04), (float)(1.9993928282e+00) }, // 25.0 Hz { (float)(9.9925718616e-01), (float)(3.7140692231e-04), (float)(1.9992370516e+00) }, // 31.5 Hz { (float)(9.9879758671e-01), (float)(6.0120664727e-04), (float)(1.9987651273e+00) }, // 40.0 Hz { (float)(9.9849722245e-01), (float)(7.5138877401e-04), (float)(1.9984465124e+00) }, // 50.0 Hz { (float)(9.9820192714e-01), (float)(8.9903643123e-04), (float)(1.9981214319e+00) }, // 63.0 Hz { (float)(9.9759663784e-01), (float)(1.2016810790e-03), (float)(1.9974668794e+00) }, // 80.0 Hz { (float)(9.9699670283e-01), (float)(1.5016485839e-03), (float)(1.9967940174e+00) }, // 100.0 Hz { (float)(9.9608832771e-01), (float)(1.9558361473e-03), (float)(1.9957717788e+00) }, // 125.0 Hz { (float)(9.9488106021e-01), (float)(2.5594698955e-03), (float)(1.9943627488e+00) }, // 160.0 Hz { (float)(9.9368508558e-01), (float)(3.1574572116e-03), (float)(1.9928757293e+00) }, // 200.0 Hz { (float)(9.9187386982e-01), (float)(4.0630650882e-03), (float)(1.9906104476e+00) }, // 250.0 Hz { (float)(9.8977837468e-01), (float)(5.1108126620e-03), (float)(1.9877748003e+00) }, // 315.0 Hz { (float)(9.8709369779e-01), (float)(6.4531511061e-03), (float)(1.9838676311e+00) }, // 400.0 Hz { (float)(9.8381454728e-01), (float)(8.0927263624e-03), (float)(1.9787829025e+00) }, // 500.0 Hz { (float)(9.7966277109e-01), (float)(1.0168614455e-02), (float)(1.9716932308e+00) }, // 630.0 Hz { (float)(9.7404386878e-01), (float)(1.2978065611e-02), (float)(1.9612347544e+00) }, // 800.0 Hz { (float)(9.6758591875e-01), (float)(1.6207040627e-02), (float)(1.9476493009e+00) }, // 1000.0 Hz { (float)(9.5973086514e-01), (float)(2.0134567431e-02), (float)(1.9287337831e+00) }, // 1250.0 Hz { (float)(9.4878629133e-01), (float)(2.5606854334e-02), (float)(1.8983695001e+00) }, // 1600.0 Hz { (float)(9.3627068388e-01), (float)(3.1864658062e-02), (float)(1.8581910087e+00) }, // 2000.0 Hz { (float)(9.2117604381e-01), (float)(3.9411978094e-02), (float)(1.8005882747e+00) }, // 2500.0 Hz { (float)(9.0172987031e-01), (float)(4.9135064847e-02), (float)(1.7133994083e+00) }, // 3150.0 Hz { (float)(8.7697241507e-01), (float)(6.1513792463e-02), (float)(1.5803227133e+00) }, // 4000.0 Hz { (float)(8.4900435915e-01), (float)(7.5497820425e-02), (float)(1.3993428287e+00) }, // 5000.0 Hz { (float)(8.1426291228e-01), (float)(9.2868543858e-02), (float)(1.1311744237e+00) }, // 6300.0 Hz { (float)(7.7194867684e-01), (float)(1.1402566158e-01), (float)(7.4026698287e-01) }, // 8000.0 Hz { (float)(7.2627335006e-01), (float)(1.3686332497e-01), (float)(2.5120594308e-01) }, // 10000.0 Hz { (float)(6.7690084582e-01), (float)(1.6154957709e-01), (float)(-3.4981568641e-01) }, // 12500.0 Hz { (float)(6.2492532874e-01), (float)(1.8753733563e-01), (float)(-1.0577231561e+00) }, // 16000.0 Hz { (float)(6.1776462189e-01), (float)(1.9111768906e-01), (float)(-1.5492495659e+00) }, // 20000.0 Hz};maEqualizerSettings g_EqualizerSettings;void maEqualizerReset(int bands, int bits16, int extra){ eq31Init(bands, bits16, extra);} // maEqualizerResetint nEQNum = 0;int EQ2[2] = { 64, 64 };int EQ3[3] = { 0, 64, 0 };int EQ5[5] = { 0, 0, 64, 64, 0 };int EQ10Up[10] = { 4, 10, 17, 23, 29, 36, 42, 49, 55, 61 };int EQ10Down[10] = { 59, 53, 46, 40, 34, 27, 21, 14, 8, 2 };double slidertodb[65] = {-16.0, -15.5, -15.0, -14.5, -14.0, -13.5, -13.0, -12.5, -12.0, -11.5, -11.0, -10.5, -10.0, -9.5, -9.0, -8.5, -8.0, -7.5, -7.0, -6.5, -6.0, -5.5, -5.0, -4.5, -4.0, -3.5, -3.0, -2.5, -2.0, -1.5, -1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0};double DBfromScaleGain(int value);double DBfromScaleGain(int value){/* if(value >= EQSLIDERMIN && value <= EQSLIDERMAX) return slidertodb[64]; return 0.0;*/// return slidertodb[EQ2[nEQNum]];// return slidertodb[EQ3[nEQNum]];// return slidertodb[EQ5[nEQNum]]; return slidertodb[EQ10Up[nEQNum]];// return slidertodb[EQ10Down[nEQNum]];}void maEqualizerSetLevels(int bands31, int dboffset){ int band; int numbands = bands31 ? EQBANDS31 : EQBANDS10; int slider0 = bands31 ? 0 : 2; int slider; int sliderincr = bands31 ? 1 : 3; int slideroffset; g_state.insamplerate = 44100; if(g_state.insamplerate > 39289) // || !(g_sets.eqflags & MAEQADAPTRATE)) { for(band = 0; band < numbands; band++) // 44100, 48000 { // slider value 0...64 -> range -16...+16 dB eq31EqualizerSetLevel(band, pow(10,(dboffset + DBfromScaleGain(g_EqualizerSettings.Levels[slider0])) / 20.0)); slider0 += sliderincr; nEQNum++; } nEQNum = 0; } else { // adapt for samplerates < 44100 by 1 slider (1/3 octave) shifts // 8000 nominal sample rate if(g_state.insamplerate <= 9822) slideroffset = -7; // 11025, 12000 else if(g_state.insamplerate <= 12375) slideroffset = -6; else if(g_state.insamplerate <= 15592) slideroffset = -5; // 16000 else if(g_state.insamplerate <= 19644) slideroffset = -4; // 22050, 24000 else if(g_state.insamplerate <= 24750) slideroffset = -3; else if(g_state.insamplerate <= 31183) slideroffset = -2; // 32000 else slideroffset = -1; // <= 39289 if((slider = slider0 + slideroffset) < slider0) slider = slider0; for(band = 0; band < numbands; band++) { eq31EqualizerSetLevel(band, pow(10,(dboffset + DBfromScaleGain(g_EqualizerSettings.Levels[slider])) / 20.0)); slideroffset += sliderincr; if((slider = slider0 + slideroffset) < slider0) slider = slider0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -