gpt4 book ai didi

c - C 低通滤波器

转载 作者:行者123 更新时间:2023-11-30 15:27:15 24 4
gpt4 key购买 nike

我正在使用 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 秒时,它失败了。该应用程序记录了所有内容,但在播放时崩溃。如果我删除过滤器,应用程序就可以运行。

有什么建议吗?

最佳答案

问题:

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

    • 永远不要停下来,这样你就会低于零
    • 这不是每秒执行一次!!!
    • 相反,每次您的 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<1) cutoff=1;截止变化后

关于c - C 低通滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27106205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com