【问题标题】:Low Pass filter in CC中的低通滤波器
【发布时间】:2015-01-22 05:54:13
【问题描述】:

我正在使用 PortAudio 库在 C 中实现一个低通滤波器。 我使用 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 秒时它失败了。该应用程序记录所有内容,但在播放时崩溃。如果我删除过滤器,应用程序就会工作。

有什么建议吗?

【问题讨论】:

  • 不要得到你需要的东西:if(i%SAMPLE_RATE == 0)... 你也想在 RT 中进行连续采样或先采样然后过滤?对于第一个选项,您不应过滤所有样本,而应仅过滤新添加的样本...您也正在使用 i-1,i 进行过滤,因此您应该在 for 循环中使用 i-- 而不是相反(您是在使用之前影响i-1 项目...
  • 我正在尝试制作可以实时工作的过滤器,所以我认为我需要连续采样。使用第一个 if 是因为我不想每隔 44100 次而是一次更改截止值。
  • 添加了答案......您的主要问题很可能在 5 秒后是您的可用区域之外的截止值(负)

标签: c filter signal-processing portaudio


【解决方案1】:

问题:

  1. 每次i%SAMPLE_RATE == 0 时,您都会将截止频率降低 400 Hz

    • 永远不要停下来,让你低于零
    • 这不是每秒执行一次!!!
    • 而是每次您的 for 穿过数据中的第二个障碍时
    • 如果您没有在正确的位置拨打电话,这种情况可能会更频繁地发生
    • 在您的代码中没有看到
  2. 您的过滤顺序错误

    • ... a[i]=f(a[i],a[i-1]; i++;
    • 这意味着您正在使用已过滤的a[i-1] 值进行过滤

如何处理它

  1. 检查代码位置

    • 它应该在某些情况下,例如在打包完成时
    • 或在某个Sleep(...);(或内部计时器)之后进入线程
    • 更改截断更改(处理边缘情况)
  2. 方向的反向过滤器

类似这样的:

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&lt;1) cutoff=1;

【讨论】:

  • 所以,如果我的数组充满了音频样本,我应该启动一个计时器,循环遍历数组,一旦发生 timerevent,更改截止值?
  • cutoff-=cutoff-400;cutoff=400; 相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2012-04-08
  • 2013-07-23
  • 1970-01-01
相关资源
最近更新 更多