我正在用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秒钟时,它就会失败。该应用程序记录了所有内容,但在播放时崩溃。如果删除过滤器,则该应用程序可以正常工作。
有什么建议吗?
问题:
您每次都将截止频率降低了400 Hz 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;
截止后更改本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句