c - IIR滤波器差分方程中负指标的处理

标签 c signal-processing

我需要在 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 中实现的。

也有人可以建议 hold 在 c 中使用指针实现循环缓冲区,这将有助于我的事业。

最佳答案

首先对 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 */

关于c - IIR滤波器差分方程中负指标的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21085664/

相关文章:

c - 如何从 20 个样本中找到正弦波的幅度和频率?

ios - 在 iOS 中使用立体声源进行混响

language-agnostic - 我可以通过立体声信号在频域中获得更高的分辨率吗?

javascript - WebAudio - 振荡器 setPeridiocWave

c++ - 如何在 C/C++ 程序中执行 sudo 命令?

c - 内核 block 设备

c - 从文件中读取文本但显示不正确

c - C中的结构和结构数组

c++ - 如何使随机损失位服从高斯分布

c++ - 在 C++ 类中实现 TPCircularBuffer