1、lowpass换算公式,如下图,缺少括号
2、Bessel HP如下图,第一个红框应该写成sqrt(3),第2,3红框符号位取反改正。
3、Bessel LP的如下图红框应该改为Sqrt(3)
举例:附上源码
///
/// 获取BesselLP的系数
///
///
///
private filterAlgoParm write_filter_BesselLP_control(int freq, float dBGain,bool bypass)
{
filterAlgoParm algparm;
//限定频点范围
if (bypass)
{
algparm.a0 = SIGMA_READ_REGISTER_FLOAT2INT(0);
algparm.a1 = SIGMA_READ_REGISTER_FLOAT2INT(1) << 8;
//temp = Convert.ToSingle(-2 * Math.Cos(w0));
algparm.a2 = SIGMA_READ_REGISTER_FLOAT2INT(1) << 8;
// temp = 1 - alpha / A;
algparm.b0 = SIGMA_READ_REGISTER_FLOAT2INT(1);
// temp = (1 + alpha * A) * gainLinear;
algparm.b1 = SIGMA_READ_REGISTER_FLOAT2INT(1);
// temp = Convert.ToSingle((-2 * Math.Cos(w0)) * gainLinear);
algparm.b2 = SIGMA_READ_REGISTER_FLOAT2INT(0);
}
else
{
double w0 = getW0(freq);
double alpha = Math.Sin(w0) / 2 * Math.Sqrt(3);
double gainLinear = getGainLinear(dBGain);
double a0 = 1 + alpha;
double a1 = (2 * Math.Cos(w0) / a0);
double a2 = Convert.ToSingle((alpha - 1) / a0);
double b0 = ((1 - Math.Cos(w0)) * gainLinear / (2 * a0));
float b1 = Convert.ToSingle(((1 - Math.Cos(w0)) * gainLinear) / a0);
float b2 = Convert.ToSingle(b0);
//获取滤波系数
Console.WriteLine(“b0:{0},b1:{1},b2:{2},a1:{3},a2:{4}\n”, b0, b1, b2, a1, a2);
algparm.a0 = SIGMA_READ_REGISTER_FLOAT2INT(Convert.ToSingle(a0));
algparm.a1 = SIGMA_READ_REGISTER_FLOAT2INT(Convert.ToSingle(a1));
algparm.a2 = SIGMA_READ_REGISTER_FLOAT2INT(Convert.ToSingle(a2));
algparm.b0 = SIGMA_READ_REGISTER_FLOAT2INT(Convert.ToSingle(b0));
algparm.b1 = SIGMA_READ_REGISTER_FLOAT2INT(b1);
algparm.b2 = algparm.b0; //SIGMA_READ_REGISTER_FLOAT2INT(Convert.ToSingle((1 - Math.Cos(w0)) * gainLinear / (2* a0)));
}
return algparm;
}
/// <summary>
/// 获取BesselLP的Freq和Gain
/// </summary>
/// <param name="a0"></param>
/// <param name="a1"></param>
/// <param name="a2"></param>
/// <param name="b0"></param>
/// <param name="b1"></param>
/// <param name="b2"></param>
private filterAppParm read_filter_BesselLP_control(int B2, int B1, int B0, int A2, int A1)
{
filterAppParm appParm;
float b2 = SIGMA_READ_REGISTER_INT2FLOAT(B2);
float b1 = SIGMA_READ_REGISTER_INT2FLOAT(B1);
float b0 = SIGMA_READ_REGISTER_INT2FLOAT(B0);
float a2 = SIGMA_READ_REGISTER_INT2FLOAT(A2);
float a1 = SIGMA_READ_REGISTER_INT2FLOAT(A1);
appParm.boost = 0;
if (1==b0 && 0==b1 && 0==b2 && 0==a1 && 0==a2)
{
appParm.freQ = 20;
appParm.dbGain =0;//获取增益
appParm.Q = 0;
appParm.bypass = true;
}
else
{
float alpha = (1 + a2) / (1 - a2);
float a0 = 1 + alpha;
float cosw0 = a1 * a0 / 2;
float w0 = Convert.ToSingle(Math.Acos(cosw0));
appParm.freQ = getFreQ(w0);//获取频点
float gainLinear = b1 * a0 / (1-cosw0);
appParm.dbGain = Convert.ToInt32(100*getdBGainLinear(gainLinear));//获取增益
appParm.Q = 0;
appParm.bypass = false;
}
return appParm;
}
4、Butterworth HP,第一个红框应该写成sqrt(2),第2,3红框符号位取反改正。
官方换算公式网址:
http://wiki.analog.com/resources/tools-software/sigmastudio/toolbox/Filters/General2ndorder
以上问题,是我对比sigma visial 4.6验证控件参数生成相应系数而得来。
如下修改freq及gain,根据butterworth HP公式换算得来。
PI = 3.141592653589793d
FS = 48000