c - 数字滤波算法

标签 c algorithm audio signal-processing wikipedia

刚刚在维基百科上找到了一个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/

相关文章:

c - 如何让一个线程停止另一个线程?

c - sleep 与 SIG_ALARM 使用率和 CPU 性能

c# - 如何找出最快的算法

c# - 如何转换字符串数据:audio/ogg;base64 to file wav in C#

c# - Silverlight3:播放.m3u播放列表中的文件

c - 如何在 C 中按值对数组中的每个元素进行 "delete"

编译带有依赖项、h 和 h0 文件的 c 程序

algorithm - 如何计算这个算法的Big O?

python - 如何从位于数组顶部的多边形内的 NumPy 二维数组中提取值?

audio - 无法在文章中使用图库和声音插件