频率采样滤波器实现

时间:2012-01-30 14:45:43

标签: c++ signal-processing

首先,我对与DSP有关的任何事情都很陌生,所以我可能会问一些非常奇怪或愚蠢的东西。

注意:系统不允许我将mote发布到链接,因为我太新了。我决定在任何链接前添加一个 - 所以系统不会将它们识别为链接,无论如何我都可以发布它们。不幸的是,这意味着你必须复制/过去关注链接,对此抱歉...

我目前正在编写一个需要控制整个可听声谱的应用程序。我选择了一个频率采样滤波器,因为在读完一些信息之后,我认为它能够给我这种​​控制。我的实现包括一个梳状滤波器,它在0-PI范围内为80个谐振器供电,采样频率为44100Hz。

我正在努力获得以下冲动响应: http://img545.imageshack.us/img545/1979/10269409.png

当前的频率响应如下所示: http://img198.imageshack.us/img198/24/freqj.png

我很抱歉以这种方式链接图像,但系统不允许我发布图像,因为我太新了,我也只允许2个链接所以我会链接到如果我被允许那样做评论中的代码

我的所有滤镜系数在此次运行中均为1

我的结论是,谐振器部分地取消了我希望每个峰值达到相同高度的位置。 我似乎无法找到解决这个问题的方法,是否有人可以帮助我?

编辑1: 我已经把最重要的功能放在这里,我应该早点做到这一点。我很乐意清理任何可能不清楚的事情。

//comb filter function
float filter::comb(buffer* x, float z, float input){
    //store the new input value in the buffer
    x->write(input);
    //calculate the output value according to Y[n] = X[n] - z * X[n-160] 
    return x->read(0)-(z*x->read(160));
}

//resonator function
float filter::resonator(buffer* res, float r, float w, float phi, float amp){
static int odd_even=1;
float result=0;

if(odd_even){
    odd_even=0;
    //if called odd times calculate result according to Y[n] = 2 * r * cos(phi) * y[n-1] - r^2 * y[n-1] + amp * w
    result=(2*r*cos(phi)*res->read(0))-(r*r*res->read(1))+(amp*w);
}
else{
    odd_even=1;
    //if called odd times calculate result according to Y[n] = 2 * r * cos(phi) * y[n-1] - r^2 * y[n-1] - amp * w
    result=(2*r*cos(phi)*res->read(0))-(r*r*res->read(1))-(amp*w);
}

//store result in buffer
res->write(result);

return result/SCALE;
}

//filter execute function
float filter::exec(float value){
    float w;
    float total=0;
    float temp=0;

    cout<<value<<"\t";
    //calculate the comb output
    w=comb(combX,0.886867188,value);
    for(int i=0;i<80;i++){
        temp=(resonator(&res[i],0.999,w,(((1.125+i*2.25)/180.0)*pi),getCoef(i)));
        total+=temp;
    }
    return total;
}

编辑2:

1个谐振器,位于91.125度: -http://img708.imageshack.us/img708/9995/42515591.png

我认为这几乎是理想的结果,是所需频率的强烈反应

68.625和113.625度的2个谐振器: -http://img717.imageshack.us/img717/6840/3050.png

我认为这也接近于期望的响应,在指定的频率上又是强烈的反应。我认为峰值比1谐振器测试更高,这有点奇怪。

8个谐振器从21.375开始,然后以10度的增量开始: -http://img269.imageshack.us/img269/8461/8resonators.png

我不知道该怎么做这个,最后一个谐振器有一个极端的响应,但其他的似乎与应该发生的事情相符合。

编辑3: 我用16个谐振器做了另一个测试: -http://img810.imageshack.us/img810/8418/68001938.png

这给出了与8谐振器测试几乎相同的结果。主要的不同之处在于PI附近发生的相同效应现在也开始在0Hz附近可见。

2 个答案:

答案 0 :(得分:1)

问题是你没有正常化谐振器增益。它们具有不同的非标准化增益,因为当通带移近0或 pi 时,两极移得更近,因此通带中的能量注入开始激发两极。

你需要弄清楚每个滤波器的带通增益(通过z-变换评估其在通带中心的幅度响应),然后将其输出除以。快速回退计算得出乘法归一化因子为(1-r) * sqrt(r^2 - 2.r.cos(2.phi) + 1),但请检查!

如果您需要更多详细信息,请与我们联系。

答案 1 :(得分:0)

如果您使用IIR滤波器作为谐振器,则它们不是线性相位,并且频率响应特性中的任何重叠都可能取消或求和,具体取决于重叠频率点处的相位响应。

然而,正如Paul R建议的那样,您应该单独测试每个滤波器,然后成对测试每个滤波器的增益,然后检查滤波器交叉点处的情况。