【发布时间】: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