Данные с цифровой фильтрацией в Arduino обрезают диапазон значений на выходе - PullRequest
0 голосов
/ 16 июня 2020

У меня есть реализация цифрового КИХ-фильтра 3-го порядка для проекта детектора вибрации. Я использовал окно Хэмминга, фильтр низких частот. Я хотел попробовать более низкий порядок, прежде чем реализовывать фильтр более высокого порядка. Это моя функция для реализации передаточной функции фильтра (код показан ниже)

float filter[] = {0.02421845531650103, 0.59999999999999998, 0.02421845531650103};
float fir(float input[] , int n ){
  int k=3;
  float output=0;

    output = filter[0] * input[k-2]+ filter[1] * input[k-1] + filter[2]*input[k]; 

//  Serial.println(output);
  return output;

}

Мои входы (значения потенциометра) отображаются от 0 до 1023. Однако после фильтрации диапазон выходов теперь равен 0- 663 (приблизительно). Я не это имел в виду. Я ожидал, что на выходе будет 1023, если все входы - 1023 и диапазон значений не изменится. Я собирался использовать функцию карты для сопоставления значений с 0 до 1023, но я не уверен, что это правильный способ go об этом. Что-то не так с тем, как я использую фильтрацию? Это нормальное поведение при усечении выходных данных?

Любая доступная помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 17 июня 2020

Как предлагается в комментариях, выход установившегося режима КИХ-фильтра будет постоянным входом, равным 1, равным сумме коэффициентов фильтра. Итак, чтобы получить выходное значение в установившемся режиме, равное входному, сумма коэффициентов фильтра должна быть равна 1.

Чтобы получить коэффициенты фильтра, суммирующие до 1, вы должны разделить все коэффициенты на их сумму. 0.64843691063300202, чтобы получить:

float filter[] = {0.03734897708530974, 0.92530204582938058, 0.03734897708530974};

С этими нормализованными коэффициентами фильтра вы должны теперь получить выходные данные в диапазоне 0-1023 для входов в том же диапазоне 0-1023.

Также обратите внимание, что операция фильтрации обычно требует, чтобы функция использовала индекс входной выборки (аргумент n функции fir), а не жестко запрограммированное значение k=3.

...