Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2019, 15:52   #1
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию Фильтрация данных ЭЭГ

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

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

Код:
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);
Полученные данные интерполирую чтобы получить цветовую картинку. Картинка привожу из оригинальной программы.
И у меня никак не получается получить похожий результат.

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

Подскажите пожалуйста в чем может быть ошибка??
Изображения
Тип файла: jpg ritm.jpg (103.6 Кб, 137 просмотров)
Тип файла: jpg result.jpg (79.3 Кб, 139 просмотров)
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 06.06.2019 в 16:13.
WorldMaster вне форума Ответить с цитированием
Старый 21.06.2019, 14:13   #2
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

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

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

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

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

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

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

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

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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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