这是一个很难的,虽然我可以想到一些kludge方法,我觉得有一个干净的数学方法,虽然我自己很难发明它。
我有许多控制(软件)双二阶滤波器用于音频的参数。基本上只有3个参数,频率,增益和Q(或带宽)。在音频方面,频率表示滤波器的中心频率。增益表示该频率是增强还是减小(增益为0会导致通过滤波器的音频没有变化)。 Q表示滤波器的宽度 - IE非常宽的滤波器可能会影响远离中心频率的频率,而窄(低Q)滤波器只会影响接近中心频率的频率。滤波器采用钟形曲线的形式,或者至少那是近似值,无论数学上是否准确,我都不确定。
我想以图形方式显示这些滤波器的特性 - 显示增益与频率的关系图。这些滤波器中有几个应用于音频通道,我希望能够添加不同的结果图,以生成整体图(IE是对组合滤波器的所有组件求和的图)。但我也希望能够访问各个过滤器图表。
我可以处理将组件图添加到单个“总”图中,但是如何从过滤器参数生成原始x-y图表让我感到厌烦。我将绘制位图,所以我需要的是能够创建频率为[x] = y的数组。我在C中这样做,所以我没有在matlab等数学工具。所以我可能有一个中心频率为1000(Hz)的过滤器,增益为20(db或线性我明白如何转换那个)和Q表示3. Q因子是相对的,并且如果引起任何并发症,则不必在数学上完全正确。
这似乎是一个非常简单的数学函数,但数学不是我的强项而且我不够了解 - 我一直在用正弦函数等进行处理,但它不起作用,我怀疑可能是因为过度复杂而浪费处理能力数学(虽然我可能在那里错了)。
TIA,Pete
答案 0 :(得分:1)
我怀疑双二阶滤波器,Q值和钟形曲线之间的关系。但我会把它们放在一边,然后告诉你如何绘制钟形曲线,因为那就是你所问的。
从wikipedia article开始,钟形曲线的等式为
您申请的地方
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
答案 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;过滤。使用对数刻度显示频率。
- 汤姆