首先,我对与DSP有关的任何事物都是新手,所以我可能会问一些真正奇怪或愚蠢的问题。

注意:由于我太新,系统不允许我将微粒发布到链接上。我决定在任何链接之前添加-,这样系统就不会将它们识别为链接,无论如何我都可以发布它们。不幸的是,这意味着您必须复制/粘贴才能链接,很抱歉。

我目前正在编写一个需要控制整个声音频谱的应用程序。我选择了一个频率采样滤波器,因为在阅读了一些信息之后,我认为它可以为我提供这种控制。我的实现包括一个梳状滤波器,该滤波器为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

我认为这几乎是期望的结果,在期望的频率下有很强的响应

2个68.625和113.625度的谐振器:
-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附近可见。

最佳答案

问题是您没有对谐振器增益进行归一化。它们具有不同的非归一化增益,因为当通带移近0或pi时,两个极点移得更近,因此通带中的能量注入开始激发两个极点。

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

让我知道您是否需要更多详细信息。

08-06 13:40