我需要在C中实现这个(IIR滤波器)差分方程。
int a[3]={ 1 , -1 , 2 };
int b[3]={1,2,3}
int in[100]=some numbers;
for(i=0;i<100;i++)
y[i]=(b[0]*in1[i])+(b[1]*in[i-1])+(b[2]*in[i-2])-(a[1]*y[i-1])-(a[2]*y[i-2]); `
我需要制作in[-ve index]=0
。如何处理这个差分方程?
我不能使用if
语句,因为它是在DSP中实现的。
也有人可以建议使用c中的指针来实现循环缓冲区,这将有助于我的原因。
答案 0 :(得分:2)
首先计算in
数组中前两个条目的计算,其中用零代表负索引的条目,然后从2循环。
y[0]=(b[0]*in1[0])+(b[1]*0) +(b[2]*0)-(a[1]*0) -(a[2]*0);
y[1]=(b[0]*in1[1])+(b[1]*in[0])+(b[2]*0)-(a[1]*y[0])-(a[2]*0);
for (int i = 2; i < 100; ++i)
...
由于您正在进行一些零乘法运算,因此这些计算当然可以缩短。
对于循环缓冲区,只需创建一个固定大小的数组,然后不断增加索引,然后使用模运算来限制。
所以
int *circular[10]; /* A ten-entry circular buffer for integer pointers */
int circularIndex = 0;
/* Adding a new entry */
circular[circularIndex] = somePointer;
circularIndex = (circularIndex + 1) % 10; /* Make sure the index goes from 0 to 9 */