C中的低通滤波器

时间:2014-11-24 13:39:36

标签: c filter signal-processing portaudio

我在C中使用PortAudio库实现了低通滤波器。 我用PortAudio本身的脚本录制我的麦克风输入。在那里我添加了以下代码:

float cutoff = 4000.0;

float filter(float cutofFreq){
    float RC = 1.0/(cutofFreq * 2 * M_PI);
    float dt = 1.0/SAMPLE_RATE;
    float alpha = dt/(RC+dt);

    return alpha;
}

float filteredArray[numSamples];
filteredArray[0] = data.recordedSamples[0];

for(i=1; i<numSamples; i++){
    if(i%SAMPLE_RATE == 0){
        cutoff = cutoff - 400;
    }
    data.recordedSamples[i] = data.recordedSamples[i-1] + (filter(cutoff)*(data.recordedSamples[i] - data.recordedSamples[i-1]));
}

当我运行此脚本5秒钟时,它可以工作。但是当我尝试运行它超过5秒时它失败了。应用程序记录所有内容,但在播放时崩溃。如果我删除过滤器,应用程序将起作用。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

问题:

  1. 您每次i%SAMPLE_RATE == 0

    将截止频率降低400 Hz
    • 从不停止,所以你低于零
    • 这不是每秒进行一次!!!
    • 相反,每当您的数据通过数据中的第二道屏障时
    • 如果您没有在正确的地方拨打电话,
    • 可能会更频繁地发生
    • 在您的代码中没有看到
  2. 您正在错误地过滤

    • ... a[i]=f(a[i],a[i-1]; i++;
    • 表示您使用已过滤的a[i-1]值进行过滤
  3. 该怎么做

    1. 检查代码放置

      • 它应该在某种情况下就像打包完成一样
      • 或在某些Sleep(...);(或内部计时器)之后的线程中
      • 更改切断更改(手柄边缘情况)
    2. 反向过滤方向

    3. 这样的事情:

      int i_done=0;
      
      void on_some_timer()
       {
       cutoff-=400;
       if (cutoff<1) cutoff=1; // here change 1 for limit frequency
      
       if (numSamples!=i_done)
        for (i=numSamples-1,i>=i_done;i--)
         data.recordedSamples[i] = data.recordedSamples[i-1] + (filter(cutoff)*(data.recordedSamples[i] - data.recordedSamples[i-1]));
       i_done=numSamples;
       }
      

      如果您的代码已经正常(您没有发布所有内容,所以我可能会遗漏某些内容)

      • 然后只需在截止更改后添加if (cutoff<1) cutoff=1;