我在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秒时它失败了。应用程序记录所有内容,但在播放时崩溃。如果我删除过滤器,应用程序将起作用。
有什么建议吗?
答案 0 :(得分:1)
问题:
您每次i%SAMPLE_RATE == 0
您正在错误地过滤
... a[i]=f(a[i],a[i-1]; i++;
a[i-1]
值进行过滤该怎么做
检查代码放置
Sleep(...);
(或内部计时器)之后的线程中反向过滤方向
这样的事情:
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;