Алгоритм цифрового фильтра - PullRequest
0 голосов
/ 02 июня 2011

Я только что нашел алгоритм пихты в Википедии

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 ?! И это кажется мне далеким от логики?!

А также может кто-нибудь объяснить мне первый комментарий о битовой маскировке и по модулю.

спасибо заранее :)

Ответы [ 3 ]

4 голосов
/ 02 июня 2011

Он используется для обеспечения того, чтобы 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;.

2 голосов
/ 02 июня 2011

Проще говоря, x_buffer - это кольцевой буфер; ptr_x_buffer указывает на текущую позицию в буфере:

  • ptr_x_buffer++ шаг ptr_x_buffer;
  • ptr_x_buffer %= NB_COEF сбрасывает ptr_x_buffer в ноль, как только достигает NB_COEF.

Комментарий предлагает модифицировать код для определенных значений NB_COEF. Кто бы ни писал эти комментарии, похоже, считает предложенную модификацию улучшением производительности. Однако весьма сомнительно, что это изменение приведет к повышению производительности, и поэтому это замечание можно игнорировать.

0 голосов
/ 02 июня 2011

Выражение ptr_x_buffer%=NB_COEFF означает, что ptr_x_buffer сбрасывается по модулю NB_COEFF. Следовательно, это не «всегда 0», а модуль относительно деления на 16. Поэтому гарантируется, что доступ к массиву x_buffer[ptr_x_buffer] всегда лежит в пределах 0..NB_COEFF-1.

Для степеней 2 операция по модулю может быть заменена на битовую и с маской 2 ^ n-1 (или N-1), где n - это log2 вашего модуля.

...