Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 06.06.2019, 16:52   #1
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 2,152
Репутация: 607

icq: 359393755
По умолчанию Фильтрация данных ЭЭГ

Здравствуйте.
Есть задачка с виду достаточно простая, но то ли я чего то не понимаю толи чтото упустил.

В общем есть у меня наборы данных ЭЭГ.
Их нужно профильтровать и выделить нужные ритмы.
Взял я фильтр фурье.

Код:
const int SampleRate = 200; // частота дискретизации 200 или 500 гц
const int samlesWin = 128; // окно отсчетов

public double[] FilterData(double[] samples)
        {
            double[] freqs = new double[samples.Length];
            fftr1d(samples, out complex[] f);
            double maxAmpl = 0;
            for (int i = 0; i < freqs.Length/2; i++)
            {
                double freq = i * (SamplesInSec / (float)samples.Length); // получаю частоту 
                double dx = f[i].x;
                double dy = f[i].y;
                double ampl = Math.Sqrt(dx * dx + dy * dy); // амлитуда частоты
               
                if (freq <= StartFreq || freq >= EndFreq)
                {
                    f[i].x *= 0;
                    f[i].y *= 0;
                }
                if (freq > StartFreq && freq < EndFreq) // ищу максимум в заданном диапазоне
                {
                    maxAmpl = Math.Max(maxAmpl, ampl);  
                }
            }
            fftr1dinv(f, out double[] filtered);
            //MaxAmplitude = filtered.Max();
            MaxAmplitude = maxAmpl;
            return filtered;
        }
Код:
 // сделал класс где можно задать нужный диапазон ритмов
        DataProcessor Delta = new DataProcessor(SampleRate, 0.8, 3.8);
        DataProcessor Theta = new DataProcessor(SampleRate, 4, 7.8);
        DataProcessor Alfa1 = new DataProcessor(SampleRate, 8, 9.8);
        DataProcessor Alfa2 = new DataProcessor(SampleRate, 10, 12.8);
        DataProcessor Beta1 = new DataProcessor(SampleRate, 13, 19.8);
        DataProcessor Beta2 = new DataProcessor(SampleRate, 20, 30);
Полученные данные интерполирую чтобы получить цветовую картинку. Картинка привожу из оригинальной программы.
И у меня никак не получается получить похожий результат.

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

Подскажите пожалуйста в чем может быть ошибка??
Миниатюры
Нажмите на изображение для увеличения
Название: ritm.jpg
Просмотров: 14
Размер:	103.6 Кб
ID:	96875   Нажмите на изображение для увеличения
Название: result.jpg
Просмотров: 17
Размер:	79.3 Кб
ID:	96877  
__________________
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
Если помог - нажми на весы

Последний раз редактировалось WorldMaster; 06.06.2019 в 17:13.
WorldMaster вне форума   Ответить с цитированием
Старый 21.06.2019, 15:13   #2
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Адрес: Москва, Зеленоград
Сообщений: 180
Репутация: 59
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Взял я фильтр фурье.
Правильнее конечно говорить преобразование Фурье. Все-таки оно преобразует данные из временной области в частотную, а вовсе не фильтрует что-либо.

А откуда берется значение SamplesInSec? Совершенно случайно это не SampleRate?
И что за частоту вы определяете вот этой формулой?
Код:
double freq = i * (SamplesInSec / (float)samples.Length); // получаю частоту

Последний раз редактировалось max_prorok; 21.06.2019 в 15:24.
max_prorok вне форума   Ответить с цитированием
Старый 21.06.2019, 15:48   #3
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 2,152
Репутация: 607

icq: 359393755
По умолчанию

Цитата:
Сообщение от max_prorok Посмотреть сообщение
А откуда берется значение SamplesInSec? Совершенно случайно это не SampleRate?[/CODE]
Да это одно и тоже.

Цитата:
Сообщение от max_prorok Посмотреть сообщение
И что за частоту вы определяете вот этой формулой?
Частоту гармоники. если в терминах не путаю.
__________________
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
Если помог - нажми на весы
WorldMaster вне форума   Ответить с цитированием
Старый 21.06.2019, 17:00   #4
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Адрес: Москва, Зеленоград
Сообщений: 180
Репутация: 59
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Частоту гармоники. если в терминах не путаю.
Термины не путаете. Долго вникал, но в итоге все-таки понял. Мне кажется логичнее было бы написать
Код:
double freq = SamplesInSec * (i / (float)samples.Length);
Но не суть.
Возможно вы не полный текст метода вставили, но непонятно назначение массива freqs. Он просто создается и даже не заполняется.
Так же непонятен смысл использования переменных dx и dy. И судя по алгоритму, лишние разы считаете амплитуду.
Но, к сожалению, это все не решает проблемы.
А можно подробнее пояснить что делает класс DataProcessor? Метод FilterData() хранится в этом классе?

Последний раз редактировалось max_prorok; 21.06.2019 в 17:14.
max_prorok вне форума   Ответить с цитированием
Старый 21.06.2019, 17:09   #5
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 2,152
Репутация: 607

icq: 359393755
По умолчанию

Цитата:
Сообщение от max_prorok Посмотреть сообщение
А можно подробнее пояснить что делает класс DataProcessor? Метод FilterData() хранится в этом классе?
DataProcessor просто сохраняет переменные внутри себя. основной метод работы это FilterData
Он просто в цикле вызывается.
То что лишние переменные потому что это все отладочная версия .. тут много еще мусора.
Я все в фурье сомневаюсь ... в методе FilterData
__________________
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
Если помог - нажми на весы
WorldMaster вне форума   Ответить с цитированием
Старый 21.06.2019, 17:16   #6
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Адрес: Москва, Зеленоград
Сообщений: 180
Репутация: 59
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Я все в фурье сомневаюсь ...
Могу лишь предположить, что после "идеальной фильтрации" ОБПФ с сигналом творит невероятные чудеса.
Попробуйте в отладке посмотреть, какие данные у вас на входе, какие на выходе, быстро с помощью Chart`а картинки глянуть до фильтрации и после...
Или если есть возможность, выложите файлик с одного из датчика... Ради интереса глянуть.
max_prorok вне форума   Ответить с цитированием
Старый 21.06.2019, 17:31   #7
Pavia
Лис
Профессионал
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 1,819
Репутация: 1956
По умолчанию

Из 1 сообщения непонятно ровным счётом ничего. А ставить диагноз по фотографии это к экстрасенсам. Хотя точно можно сказать с вероятностью 85 % у вас частоты не на своих местах . Тут смотрите документацию на Ваш FFT.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
фильтрация данных(БД) sasha_14-88 Общие вопросы Delphi 4 03.06.2014 12:30
Фильтрация данных Дмитрий mause Помощь студентам 2 29.10.2012 13:27
Фильтрация данных snikers987 PHP 1 08.02.2011 00:36
Фильтрация данных skiffter Помощь студентам 10 17.11.2009 17:44
Фильтрация данных Gladiator БД в Delphi 4 23.05.2009 12:37


06:05.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru