Перейти к содержанию
    

Простейший цифровой ФНЧ

Внесу ясность в суть дела. Речь идет о цифровом измерителе артериального давления.

И делается это так - момент появления тонов в манжете - это систолическое давление, момент когда тоны вдруг резко спадают и начиают идти примерно одинакого уровня - диастолическое давление. Проблема в том что интенсивность тонов у всех людей разная и "порог" тут не катит по-видимому...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 фильтр если хотите. ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SasaVitebsk, хотим! чем отличается от этого?
Изменено пользователем Ivan Kuznetzov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, то что предложил SasaVitebsk - fir фильтром не является.

)) Во-первых Вы мне льстите. Это предложил не я, а Баттерворт. ))

Во-вторых, а чем по вашему мнению является уравнение вида "y0 = 0,061885*(x0+x2) + 0,123770*x1 + 1,048600*y1 - 0,296140*y2"?

(где x1 = x(n-1) и так далее)

Я не математик, если честно, и не теоретик, но некоторые источники типа фильтрсолюшн, QED и другие, просто вводят нас в заблуждение, а Вы нам сейчас откроете всю правду. ))

Ждём.

===

2 777777 по поводу

разводить плату надо было так, чтобы программисту не пришлось фильтровать результаты АЦП
. А причём здесь АЦП? Иногда входной сигнал требует фильтрации. Или обработанный. То есть даже если этот сигнал идеально снят АЦП.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Внесу ясность в суть дела. Речь идет о цифровом измерителе артериального давления.

И делается это так - момент появления тонов в манжете - это систолическое давление, момент когда тоны вдруг резко спадают и начиают идти примерно одинакого уровня - диастолическое давление. Проблема в том что интенсивность тонов у всех людей разная и "порог" тут не катит по-видимому...

 

Тут все сурово. Шумов много. Один из основных - шуршание манжеты ( и с увеличением возраста манжеты растет). Причем спектрально он практически в полосе тонов короткова. Немножко спасают специальные микрофоны с мелой чувствительностью к низкочастотным шумам. Я думаю вам нужно как фнч, так и фвч. А решение о начале и конце тонов принимать только после того как всю раелизацию записали - т е пороги принятия решения плавающие.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

)) Во-первых Вы мне льстите. Это предложил не я, а Баттерворт. ))

Во-вторых, а чем по вашему мнению является уравнение вида "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 и фильтрсолюшен могут их перепутать, посмотрите внимательнее.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Навсякий случай: FIR все же постабильнее, хотя и длиннее, IIR может так зазвенеть, что не задушишь не убъешь. Если честно, топику надо простейшими методами добиться удовлетворительной работы, иначе утопнет в этих фильтрах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не думаю что qed и фильтрсолюшен могут их перепутать, посмотрите внимательнее.

Я вот даже не буду с Вами спорить. Просто посмотрите сами любую прогу из перечисленных. Лучше фильтрсолюшен - там прямо формулу можно посмотреть. И задайте любой фильтр 2 порядка, к примеру. Фильтр ведь можно рассматривать как последовательное соединение звеньев.

 

Навсякий случай: FIR все же постабильнее, хотя и длиннее, IIR может так зазвенеть, что не задушишь не убъешь. Если честно, топику надо простейшими методами добиться удовлетворительной работы, иначе утопнет в этих фильтрах.

Если не на обум фильтр выбирать, то ничего там звенеть не будет. И не надо пугать человека. Пусть человек возьмёт и выведет результирующий график с моего примера. Хотя, этот фильтр не под него делался. Характеристики его я привёл. А если захочет, то может и свой фильтр построить с любыми характеристиками. Работы на подбор фильтра - 15 минут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, то что предложил SasaVitebsk - fir фильтром не является.

 

 

Во-вторых, а чем по вашему мнению является уравнение вида "y0 = 0,061885*(x0+x2) + 0,123770*x1 + 1,048600*y1 - 0,296140*y2"?

(где x1 = x(n-1) и так далее)

Я не математик, если честно, и не теоретик, но некоторые источники типа фильтрсолюшн, QED и другие, просто вводят нас в заблуждение, а Вы нам сейчас откроете всю правду. ))

Ждём.

 

Так все таки, каким типом является этот фильтр? Если по вашему мнению утверждение "fir фильтром не является" есть ложное, то это все же fir фильтр?

Я тоже не математик, и не теоретик, как и многие здесь. Поэтому вы заинтриговали.

Ждем. И если не затруднит, на пальцах, без ссылок на проги. Это ведь вопрос принципа, а не реализации :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так все таки, каким типом является этот фильтр? И если не затруднит, на пальцах, без ссылок на проги. Это ведь вопрос принципа, а не реализации

Из приведенных формул не совсем понятно, какие индексы подразумеваются для отсчетов y. Но если в выражении используются не только входные данные (x), но и выходные (y), рассчитанные чуть раньше, то это будет фильтр с бесконечной импульсной характеристикой (БИХ, по-английски IIR). Если бы использовались только входные данные, это был бы фильтр с конечной импульсной характеристикой (КИХ, по-английски FIR).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще вопрос по теме тонометра. Я сейчас использую датчик давление-напряжение, пульсации давления вылавливаю так: убираю постоянную составляющую и усиливаю пульсации операционником.

Есть вариант использовать датчик давление-частота (1 МГц). Как улавливать малейшие колебания частоты (тоны короткова) при частотном методе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 увеличивается).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не , там напряжение ли или частота - все едино - переводим в давление. Если частота, можно период мерять и тогда получим реализацию с хорошим временным разрешением. Так тоны короткова ловить - в этом самый смысл. Не зря покупные тонометры все врут по-своему , алгоритмы разные. Ну сделайте несколько огроменных массивов. В одном чистая реализация, в другом отфильтрованная , в третьем первая производная, в четвертом отфильтрованная производная. Если на них посмотреть - какой алгоритмик и придумаете. Я уже сказал - порог принятия решения должен быть переменным. Из поступающей реализации надо вычитать медленную устредненную - тогда получаем собственно изменения без постоянной составляющей. Но тут все лепять по своему, вряд ли кто будет так запросто делиться. Хотя лет 30 назад выходила книжка по кардиомониторам - мужики там все алгоритмы расписали, включая фильтрацию. Где теперь те мужики.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...