刚刚在维基百科上找到了一个fir算法
http://en.wikipedia.org/wiki/Digital_filter
// if the size of NB_COEF = 2^n use a bit mask instead of the modulo (%)
// %=NB_COEF => &=(NB_COEF-1)
// pipe is a circular buffer
#define NB_COEF 16 // numbers of coefficients of the filter
double x_buffer[NB_COEF]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
double coef[NB_COEF]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int ptr_x_buffer=0;
double FiltreFIR(double x)
// x: Signal d'entrée
// y: Signal de sortie
{
int n, y=0;
x_buffer[ptr_x_buffer++] = x;
ptr_x_buffer %= NB_COEF;
for( n = (NB_COEF-1) ; n >= 0 ; n-- )
{
y += coef[n] * x_buffer[ptr_x_buffer++];
ptr_x_buffer %= NB_COEF;
}
return(y);
}
-谁能告诉我为什么我们需要不断地做这个表达式
ptr_x_buffer%= NB_COEFF.
因为对我来说这意味着变量 ptr_x_buffer 总是取值 0 ?! 在我看来这与逻辑相去甚远?!
也有人可以向我解释有关位掩码和模数的第一条评论。
提前谢谢你 :)
最佳答案
它用于确保 ptr_x_buffer
始终是用作循环缓冲区的 x_buffer
数组中的有效索引。每当 ptr_x_buffer
溢出数组大小时,它都会重置为 0
。
ptr_x_buffer
会随着函数的每次调用和 x_buffer[ptr_x_buffer++]
中循环的每次迭代而递增。
您还可以将行 ptr_x_buffer %= NB_COEF;
替换为:
if( ptr_x_buffer == NB_COEF )
ptr_x_buffer = 0;
或者如果您确定 NB_COEF
是 2 的幂,您可以使用位掩码来屏蔽它们,如果评论中已经说明:ptr_x_buffer &= NB_COEF-1;
.
关于c - 数字滤波算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6216166/