"Фільтр низьких частот" в контекстах програмного забезпечення, що не належать до ЕЕ, програмного забезпечення


12

Я досвідчений програмний інженер і працюю над датчиками смартфонів. Я брав фундаментальні заняття з ЗНО в DSP і намагаюся застосувати свої знання. Я вважаю, що я розумію згортання, функції передачі, z-перетворення тощо. Я знаю трохи про фільтри FIR та IIR.

Тепер, читаючи API програмного забезпечення та документацію, я бачу, що люди застосовують LPF до датчикових даних у часовій області. Я знаю, що ви робите це за допомогою різницевих рівнянь (наприклад, y [i] = y [i-1] + 2 * x [i]), але в моєму класі EE я дізнався, що LPF зазвичай застосовується за допомогою операції згортання де ви з'єднуєте часовий сигнал з коефіцієнтами синхронної хвилі (наприклад) і з певною частотою відсічення. Тож розмовне використання «низькочастотного фільтра» для мене недостатньо точно.

Наприклад, API Google Android має цю документацію: http://developer.android.com/reference/android/hardware/SensorEvent.html#values

 public void onSensorChanged(SensorEvent event)
 {
      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
 }

Як я інтерпретую цей фільтр низьких частот? Яка частота відключення? Що таке смуга переходу? Вони використовують цей LPF виключно для проведення усереднення?


добре, це мене також турбує
Сіббс Азартні ігри

Відповіді:


11

Фільтр у вашому прикладі - це фільтр нескінченного імпульсного відгуку першого порядку (IIR) . Його функцією передачі є:

H(z)=1α1αz1

що відповідає рівнянню різниці:

y[n]=αy[n1]+(1α)x[n]

де - вхід фільтра, а - вихід фільтра.x[n]y[n]

Цей тип фільтрів часто використовується як фільтр низьких частот низької частоти і його часто називають герметичним інтегратором . Її віддають перевагу через його просте реалізація, невисока складність обчислювальної техніки та її налаштованість: її частота відсічення залежить від значення . може приймати значення на інтервалі . не дає фільтрації взагалі (вихід дорівнює входу); а зростає, частота зрізу фільтра зменшується. Ви можете вважати як граничний випадок, коли частота обрізання нескінченно низька (вихід фільтра дорівнює нулю за весь час).αα[0,1)α=0αα=1

Ви можете зрозуміти це інтуїтивно, помітивши, що вхід фільтра зважується на , тому при збільшенні параметра кількість зменшується, тому кожен вхідний зразок має менший пропорційний вплив на значення будь-якого конкретного вихідного зразка. Це призводить до розмивання імпульсної реакції фільтра протягом більш тривалого періоду часу. Підбиття підсумків протягом більш тривалого періоду часу схоже на обчислення довгого ковзного середнього. Зі збільшенням довжини ковзної середньої частоти скорочення середнього зменшується.α1α

Для вашого прикладу, де , частотна характеристика фільтра така: α=0.8введіть тут опис зображення

З прикладу, я б припустив, що цей фільтр використовується для згладжування високочастотного шуму за часовим рядом вимірювань від датчика, намагаючись дражнити порівняно низькочастотний сигнал, що цікавить. Це було б дуже типовим додатком для такого роду фільтрів.

В іншому підзапиті ви впевнені, що фільтрація часто здійснюється за допомогою згортки вхідного сигналу з імпульсною відповіддю фільтра. У більшості випадків це робиться лише за допомогою фільтрів з кінцевою імпульсною характеристикою (FIR) . Фільтри IIR, такі як цей, зазвичай реалізуються з використанням рівняння різниці фільтра; оскільки імпульсна реакція системи IIR нескінченно довга, ви повинні усікати її до деякої кінцевої довжини, щоб зробити згортання з нею простежуваним, і в цей момент фільтр вже не є IIR. Формат різницького рівняння майже завжди дешевший для обчислювальної реалізації, хоча зворотний зв'язок, притаманний цій структурі, може призвести до числових питань, які необхідно вирішити (наприклад, внутрішнього переповнення та накопичення помилок округлості).


Дякую! Деякі подальші запитання: (1) Ви сказали, що ваше рівняння H (z) = ... - це різницеве ​​рівняння; це дійсно функція передачі, правда? Я подумав, що різниця рівняння суворо для часової області. (2) У вашому випромінюваному інтеграторі, чи відповідає 1.0 відповідність_frequency / 2 (як у Matlab)? (3) Що стосується FIR проти IIR, чи правильно я розумію, що рівняння різниці IIR можна застосовувати в O (N), але згортання O (N ^ 2) або O (N lgN) з згорткою на основі FFT? (4) Чи можете ви порекомендувати книгу програмістам для реалізації цих ідей DSP? Як і те, що робить приклад коду Android.
stackoverflowuser2010

(1) Ти маєш рацію, я неправильно вказав. Я виправлю відповідь. (2) Так; вісь X знаходиться в нормованій частоті, поділеній на , тому 1 відповідає , що становить половину частоти вибірки. (3) Обчислення виводу для певного зразка, використовуючи будь-який метод, є , де - порядок фільтра. IIR фільтри просто , як правило , мають набагато менший . (4) я б рекомендував розуміти DSP від Lyons; це чудова вступна книга. π+πO(N)NN
Джейсон R

Я знаю, що (i) застосування рівняння різниці - O (N). Але я подумав, що (ii) операція згортання з використанням підсумовування над множенням і додаванням (songho.ca/dsp/convolution/convolution.html) є O (N ^ 2) або O (N lgN) з реалізацією на основі FFT . У всіх випадках N - це порядок фільтру - там, де я припускаю, що порядок фільтра та довжина сигналу часу однакові порядок (наприклад, обидва 256). Чи не відрізняються (i) та (ii)? Крім того, я бачив, що книга Lyons на Amazon.com, але я сподівався на щось написане більше для програмістів на C / Java.
stackoverflowuser2010

1
Складність для обчислення виходу однієї вибірки часу становить з різницевим рівнянням. Якщо довжина вхідного сигналу також дорівнює , то загальна складність обчислювальних виходів для кожного вхідного зразка стає . Більш частотно для фільтра IIR довжина вхідного сигналу є значно більшим значенням оскільки порядок фільтра невеликий, тому складність може бути записана в . Якщо суттєво менший за , то ви можете зафіксувати якусь обчислювальну вигоду. NO(N) NO(N2)MNO(MN)MN
Джейсон R

Вибачте, що побили мертвого коня. Для загального різницевого рівняння ( ccrma.stanford.edu/~jos/fp/Difference_Equation_I.html ), чи справді складність не буде , де N - довжина вхідного та вихідного сигналів і M - порядок фільтру? Цикла на кожному виході y [i], є O (N), і кожен y [i] вимагає циклів O (N + M). Я думаю, як ви сказали, залежно від відносних розмірів N і M, результат є або або . O(M×(N+M))iNO(N2)O(NM)
stackoverflowuser2010

2

Підводячи підсумок, фільтри IIR на основі простих ідеалізованих фізичних моделей, таких як RC-фільтр, мають невелику кількість полюсів і нулів, і тому зазвичай реалізуються як різницеве ​​рівняння, оскільки невелика кількість полюсів або нулів передбачає дуже мало арифметичних операцій на зразок, використовуючи різницеве ​​рівняння.

Оскільки IIR передбачає імпульсну реакцію нескінченної довжини, то згортання вимагатиме або обчислення вічно, або використання наближення.

Фільтри FIR зазвичай реалізуються згорткою з імпульсною характеристикою кінцевої довжини (або швидкою згорткою FFT, якщо фільтр достатньо довгий, щоб бути обчислювально ефективним). Такі види фільтрів частіше використовуються, коли можна наблизити бажану характеристику частотної характеристики з імпульсною характеристикою кінцевої довжини, а не знати, де можуть бути розташовані полюси та нулі площини Z.

Однак, оскільки фільтр з чіткими специфікаціями передбачає тривалу згортання FIR, реалізація фільтрів FIR може бути набагато повільнішою, а налаштування може включати в себе ще багато рядків коду, через що фільтри FIR можуть не використовуватися так часто в простому програмному забезпеченні приклади.


0

Я знову і знову повертаюся до цієї посади. Дякую, що поставили запитання. Ось чудова, обчислювальна технологія, реалізація герметичного інтегратора в С (призначена для мікроконтролера).

По-перше, деяка перестановка: y = α * x + (1 - α) * y_last = α * (x - y_last) + y_last

якщо обмежимо α приблизно 12%, 25%, 50%, (1/8, 1/4, 1/2, ...). Ми можемо скористатись ефективними зрушеннями бітів. Приймаючи випадок 1/8, 8 => 2 ^ 3 => (зменшення в 3 рази)

= (x - y_last) / 8 + y_last

#define SMOOTHING_FACTOR       (3)

int16_t FilterSample(int16_t new_sample)
{
  static int16_t last_result = 0;

  // Each bit shift down is equivalent to dividing-by-two
  last_result = (new_sample - last_result) >> SMOOTHING_FACTOR) + last_result;

  return last_result;
}

Сподіваюся, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.