C中的低通滤波器

布特曼斯

我正在用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;截止后更改

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

IIR低通滤波器在C ++中的实现

来自分类Dev

OpenCL中的低通滤波器

来自分类Dev

Python中的低通滤波器

来自分类Dev

应用低通滤波器

来自分类Dev

FFT低通滤波器

来自分类Dev

FPGA的低通滤波器

来自分类Dev

FFT低通滤波器

来自分类Dev

应用低通滤波器

来自分类Dev

MATLAB中的低通滤波器返回NaN值

来自分类Dev

在Matlab中设计一个低通滤波器

来自分类Dev

在音频上使用低通滤波器

来自分类Dev

使用fft的Matlab低通滤波器

来自分类Dev

低通滤波器和采样频率

来自分类Dev

低通滤波器不起作用

来自分类Dev

固定点的简单低通滤波器

来自分类Dev

在SciPy中创建低通滤波器-了解方法和单位

来自分类Dev

低通滤波器从熊猫数据框中获取数据的二阶导数

来自分类Dev

如何在scipy.signal中制作一个低通滤波器?

来自分类Dev

如何实现低通滤波器以减少陀螺仪值中的噪声?

来自分类Dev

在C ++中使用3X3低通滤波器对.pgm图像进行卷积

来自分类Dev

C中的FIR滤波器?

来自分类Dev

C中的定点FIR滤波器?

来自分类Dev

C ++中的FIR滤波器

来自分类Dev

识别过滤器的方法。(低通滤波器/高通滤波器?)

来自分类Dev

识别过滤器的方法。(低通滤波器/高通滤波器?)

来自分类Dev

优化低通滤波器平滑代码以进行活动识别

来自分类Dev

Matlab-在系统上使用低通滤波器

来自分类Dev

在Python中表示低通滤波器时的直线

来自分类Dev

将SOX低通滤波器与插孔配合使用