绘制双二阶滤波器的频率响应

时间:2014-09-05 18:41:06

标签: c filter plot response frequency

这是一个很难的,虽然我可以想到一些kludge方法,我觉得有一个干净的数学方法,虽然我自己很难发明它。

我有许多控制(软件)双二阶滤波器用于音频的参数。基本上只有3个参数,频率,增益和Q(或带宽)。在音频方面,频率表示滤波器的中心频率。增益表示该频率是增强还是减小(增益为0会导致通过滤波器的音频没有变化)。 Q表示滤波器的宽度 - IE非常宽的滤波器可能会影响远离中心频率的频率,而窄(低Q)滤波器只会影响接近中心频率的频率。滤波器采用钟形曲线的形式,或者至少那是近似值,无论数学上是否准确,我都不确定。

我想以图形方式显示这些滤波器的特性 - 显示增益与频率的关系图。这些滤波器中有几个应用于音频通道,我希望能够添加不同的结果图,以生成整体图(IE是对组合滤波器的所有组件求和的图)。但我也希望能够访问各个过滤器图表。

我可以处理将组件图添加到单个“总”图中,但是如何从过滤器参数生成原始x-y图表让我感到厌烦。我将绘制位图,所以我需要的是能够创建频率为[x] = y的数组。我在C中这样做,所以我没有在matlab等数学工具。所以我可能有一个中心频率为1000(Hz)的过滤器,增益为20(db或线性我明白如何转换那个)和Q表示3. Q因子是相对的,并且如果引起任何并发症,则不必在数学上完全正确。

这似乎是一个非常简单的数学函数,但数学不是我的强项而且我不够了解 - 我一直在用正弦函数等进行处理,但它不起作用,我怀疑可能是因为过度复杂而浪费处理能力数学(虽然我可能在那里错了)。

TIA,Pete

4 个答案:

答案 0 :(得分:1)

我怀疑双二阶滤波器,Q值和钟形曲线之间的关系。但我会把它们放在一边,然后告诉你如何绘制钟形曲线,因为那就是你所问的。

wikipedia article开始,钟形曲线的等式为

enter image description here

您申请的地方

  • a对应于收益
  • b确定中心频率
  • 2c^2与Q相关(较大的值会使曲线变宽)

下面的C代码计算样本钟形曲线。对于此示例,数字的选择基于绘制到250像素宽,200像素高的窗口,其中原点{0,0}位于左下角的坐标系。

int width  = 250;
int height = 200;

int bellCurve[width];       // the output array that holds the f(x) values

double gain    =  180;      // the 'a' value, determines how high the peak is from the baseline
double offset  =   10;      // the 'd' value, determines the y coordinate of the baseline
double qFactor = 1000;      // the '2c^2' value, determines how fat the curve is
double center  =  100;      // the 'b' value, determines the x coordinate of the peak
double dx;

for ( int x = 0; x < width; x++ )
{
    dx = x - center;
    bellCurve[x] = gain * exp( -( dx * dx ) / qFactor ) + offset;
}

绘制曲线会产生这样的图像,其中峰值位于x=100, y=10+180=190

enter image description here

答案 1 :(得分:0)

你可以输入一个单位脉冲(一个零的数组,除了一个元素= 1.0)到你的数字滤波器中,将它们视为黑盒子。然后FFT脉冲响应输出阵列以获得滤波器的频率响应。绘制复杂频率样本的幅度将为您提供漂亮的图片。 Python + numpy + matplotlib可能是一种更简单的方法。您需要知道采样周期才能获得有意义的图表。

答案 2 :(得分:0)

你真正想要的是过滤器的波特图。这对于自己计算是非常重要的,粗略地搜索一个库,为你在C中做任何事情都没有产生任何结果。如果精度不重要,您可以近似一次形状并根据特定过滤器的参数进行拉伸。例如,您可能有一个标准化的相对值数组,并根据过滤器的参数和您之前生成的基本曲线构建一个新的曲线(数组)。

如果可以,可以从MATLAB生成基本曲线或Wolfram Alpha等。

答案 3 :(得分:0)

这是javascript中的一个。

http://www.earlevel.com/main/2013/10/13/biquad-calculator-v2/

您描述的过滤器是&#39;峰值&#39;过滤。使用对数刻度显示频率。

- 汤姆