|
|
  |
Простейший цифровой ФНЧ, для конечного массива точек |
|
|
|
Jan 25 2011, 15:04
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Ivan Kuznetzov @ Jan 21 2011, 17:24)  SasaVitebsk, поясните пожалуйста как пользоваться? Есть массив, 200 точек. Входные параметры фильтра - это data? Там же всё видно. )) Давайте я упрощу. 1. Объявляем Код // Каналы АЦП struct data_ADC { int16_t x[3],y[3],z[3]; // Данные фильтра };
struct data_ADC lin[8]; // Объявляем массив данных. 2. Объявляем массив констант коэффициентов фильтра так, как это в предыдущем моём посте показано. 3. Читаем АЦП Код lin[cnt_line].x[2] = lin[cnt_line].x[1]; // Коэффициенты x переписать lin[cnt_line].x[1] = lin[cnt_line].x[0]; // Коэффициенты x переписать lin[cnt_line].x[0] = ADC; // Прочитать АЦП fir2_16((uint8_t *)&lin[cnt_line].x[0],(uint8_t *)fltr_c1);// Первое звено фильтра fir2_16((uint8_t *)&lin[cnt_line].y[0],(uint8_t *)fltr_c2);// Второе звено фильтра 4. Результат получаем в lin[cnt_line].z[0] Если у вас фильтр 6 порядка, то вам надо добавить в структуру data_ADC ещё один массив, и вызвать ещё одно звено фильтра с соответствующими коэффициентами. PS: Есть и IIR фильтр если хотите. ))
|
|
|
|
|
Jan 26 2011, 07:20
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(_pv @ Jan 23 2011, 16:06)  Кстати, то что предложил SasaVitebsk - fir фильтром не является. )) Во-первых Вы мне льстите. Это предложил не я, а Баттерворт. )) Во-вторых, а чем по вашему мнению является уравнение вида "y0 = 0,061885*(x0+x2) + 0,123770*x1 + 1,048600*y1 - 0,296140*y2"? (где x1 = x(n-1) и так далее) Я не математик, если честно, и не теоретик, но некоторые источники типа фильтрсолюшн, QED и другие, просто вводят нас в заблуждение, а Вы нам сейчас откроете всю правду. )) Ждём. === 2 777777 по поводу Цитата разводить плату надо было так, чтобы программисту не пришлось фильтровать результаты АЦП . А причём здесь АЦП? Иногда входной сигнал требует фильтрации. Или обработанный. То есть даже если этот сигнал идеально снят АЦП.
|
|
|
|
|
Jan 26 2011, 15:29
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(SasaVitebsk @ Jan 26 2011, 13:20)  )) Во-первых Вы мне льстите. Это предложил не я, а Баттерворт. )) Во-вторых, а чем по вашему мнению является уравнение вида "y0 = 0,061885*(x0+x2) + 0,123770*x1 + 1,048600*y1 - 0,296140*y2"? (где x1 = x(n-1) и так далее) Я не математик, если честно, и не теоретик, но некоторые источники типа фильтрсолюшн, QED и другие, просто вводят нас в заблуждение, а Вы нам сейчас откроете всю правду. )) Ждём. я всегда считал что, соответсвенно названию, FIR фильтры (с конечной импульсной характеристикой) это Y = A1*X1 + A2 * X2 + ..., одна из особенностей которых - линейная фазовая характеристика, т.е. просто задержка, а это может быть важно для автора исходного сообщения, он хочет определять после фильтрации когда именно спад на сигнале произошол. а IIR - с обратной связью и, соответственно, с бесконечной импульсной характеристикой это Y = A1*X1 + A2*X2 + ... + B1*Y1 + B2*Y2 + ... и, соответственно, с нелинейной фазовой характеристикой не думаю что qed и фильтрсолюшен могут их перепутать, посмотрите внимательнее.
|
|
|
|
|
Jan 26 2011, 21:14
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(_pv @ Jan 26 2011, 18:29)  не думаю что qed и фильтрсолюшен могут их перепутать, посмотрите внимательнее. Я вот даже не буду с Вами спорить. Просто посмотрите сами любую прогу из перечисленных. Лучше фильтрсолюшен - там прямо формулу можно посмотреть. И задайте любой фильтр 2 порядка, к примеру. Фильтр ведь можно рассматривать как последовательное соединение звеньев. Цитата(firstvald @ Jan 26 2011, 18:38)  Навсякий случай: FIR все же постабильнее, хотя и длиннее, IIR может так зазвенеть, что не задушишь не убъешь. Если честно, топику надо простейшими методами добиться удовлетворительной работы, иначе утопнет в этих фильтрах. Если не на обум фильтр выбирать, то ничего там звенеть не будет. И не надо пугать человека. Пусть человек возьмёт и выведет результирующий график с моего примера. Хотя, этот фильтр не под него делался. Характеристики его я привёл. А если захочет, то может и свой фильтр построить с любыми характеристиками. Работы на подбор фильтра - 15 минут.
|
|
|
|
|
Jan 27 2011, 11:54
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
QUOTE (_pv @ Jan 23 2011, 15:06)  Кстати, то что предложил SasaVitebsk - fir фильтром не является. QUOTE (SasaVitebsk @ Jan 26 2011, 09:20)  Во-вторых, а чем по вашему мнению является уравнение вида "y0 = 0,061885*(x0+x2) + 0,123770*x1 + 1,048600*y1 - 0,296140*y2"? (где x1 = x(n-1) и так далее) Я не математик, если честно, и не теоретик, но некоторые источники типа фильтрсолюшн, QED и другие, просто вводят нас в заблуждение, а Вы нам сейчас откроете всю правду. )) Ждём. Так все таки, каким типом является этот фильтр? Если по вашему мнению утверждение "fir фильтром не является" есть ложное, то это все же fir фильтр? Я тоже не математик, и не теоретик, как и многие здесь. Поэтому вы заинтриговали. Ждем. И если не затруднит, на пальцах, без ссылок на проги. Это ведь вопрос принципа, а не реализации
|
|
|
|
|
Jan 28 2011, 08:48
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(ig_z @ Jan 27 2011, 13:54)  Так все таки, каким типом является этот фильтр? И если не затруднит, на пальцах, без ссылок на проги. Это ведь вопрос принципа, а не реализации Из приведенных формул не совсем понятно, какие индексы подразумеваются для отсчетов y. Но если в выражении используются не только входные данные (x), но и выходные (y), рассчитанные чуть раньше, то это будет фильтр с бесконечной импульсной характеристикой (БИХ, по-английски IIR). Если бы использовались только входные данные, это был бы фильтр с конечной импульсной характеристикой (КИХ, по-английски FIR).
|
|
|
|
|
Jan 30 2011, 09:00
|

pontificator
     
Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483

|
Цитата(Ivan Kuznetzov @ Jan 20 2011, 21:07)  1)Подскажите фильтр (алгоритм на Си) чтобы сгладить(усреднить) значения в массиве? Можно сделать доморощенное грубое подобие фильтра Калмана. Его достоинство - в простоте реализации: не нужно запоминать массив данных, фильтр Калмана фильтрует данные "на лету", по мере их поступления. Пусть Vin - результат на выходе АЦП, а Vout - отфильтрованный текущий результат, n - некое число, при помощи которого оценивается "достоверность" текущего результата. Вычисление ведется по простой формуле: Vout = Vout - (Vout/n) + (Vin/n), где n по ходу фильтрации увеличивается от 1 до некоторого разумного (т.е. не очень большого) значения, определяемого ожидаемыми свойствами сигнала. Пример: 1. Самое первое измерение принимаем как данность, поскольку сравнивать и усреднять не с чем, n=1: Vout = Vin 2. У второго измерения "достоверность" такая же, какая была у первого, так что принимаем n=2: Vout = Vout - (Vout/2) + (Vin/2) 3. Для третьего измерения принимаем n=3: Vout = Vout - (Vout/3) + (Vin/3) ... 16. Ограничимся, например, n=16, иначе все вообще усреднится нафиг. Это и все последующие измерения считаем так: Vout = Vout - (Vout/16) + (Vin/16) Если говорить упрощенно, то у настоящего фильтра Калмана n меняется динамически в зависимости от сигнала. Когда сигнал меняется быстро, вес новых измерений увеличивается (т.е. n уменьшается), когда же изменения сигнала невелики, то вес каждого нового измерения уменьшается (n увеличивается).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|