首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数字滤波算法

数字滤波算法
EN

Stack Overflow用户
提问于 2011-06-02 22:50:12
回答 3查看 2K关注 0票数 0

我刚在维基百科上找到了一个冷杉算法

http://en.wikipedia.org/wiki/Digital_filter

代码语言:javascript
复制
// 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);
}

-Can,有人告诉我为什么我们需要不断地做这个表达式吗?

代码语言:javascript
复制
ptr_x_buffer%= NB_COEFF.

因为对我来说,这意味着变量ptr_x_buffer的值总是为0 ?!在我看来这完全不符合逻辑?!

也有人能给我解释一下关于位掩码和模数的第一个注释。

提前感谢您:)

EN

回答 3

Stack Overflow用户

发布于 2011-06-02 22:56:40

它用于确保ptr_x_buffer始终是用作循环缓冲区的x_buffer数组中的有效索引。只要ptr_x_buffer会溢出数组大小,它就会被重置为0

x_buffer[ptr_x_buffer++]中,ptr_x_buffer会随着函数的每次调用和循环的每次迭代而递增。

您还可以将行ptr_x_buffer %= NB_COEF;替换为以下内容:

代码语言:javascript
复制
 if( ptr_x_buffer == NB_COEF )
     ptr_x_buffer = 0;

或者,如果您确定NB_COEF是2的幂,则可以使用位掩码对它们进行掩码,前提是注释中已经说明:ptr_x_buffer &= NB_COEF-1;

票数 4
EN

Stack Overflow用户

发布于 2011-06-02 22:56:12

非常简单,x_buffer是一个循环缓冲区;ptr_x_buffer指向缓冲区中的当前位置:

一旦到达NB_COEF.,

  • ptr_x_buffer++就会递增ptr_x_buffer;
  • ptr_x_buffer %= NB_COEFptr_x_buffer重置为零

该注释建议对NB_COEF的某些值的代码进行修改。无论是谁写的评论,似乎都认为建议的修改是一种性能改进。然而,这一变化是否会带来更好的性能是非常值得怀疑的,因此,这句话可以忽略不计。

票数 2
EN

Stack Overflow用户

发布于 2011-06-02 22:56:41

表达式ptr_x_buffer%=NB_COEFF表示ptr_x_buffer是以NB_COEFF为模重置的。因此,它不是“始终为0”,而是除以16的模数。因此,可以保证数组访问x_buffer[ptr_x_buffer]始终在0..NB_COEFF-1的范围内。

对于2的幂,模运算可以被逐位and替换为掩码2^n-1 (或N-1),其中n是模数的log2。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6216166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档