Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127

Найти логическое решение, чтобы отфильтровать шум

07.04.2019, 11:56. Показов 2686. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Во вложении файл. Там график пульсации тока. Помогите найти логическое решение, чтобы отфильтровать шум.
Уже всю голову сломал, не могу найти решение. Мне даже не код нужен, я его напишу. Мне нужен алгоритм, как эту логику реализовать.
Миниатюры
Найти логическое решение, чтобы отфильтровать шум  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.04.2019, 11:56
Ответы с готовыми решениями:

Отфильтровать ввод так, чтобы исключить дубликаты рядом стоящих цифр
Несколько натуральных чисел вводятся с клавиатуры. По мере ввода преобразовывать каждое число так, чтобы в нем были исключены дубликаты...

Отсеивать совпадения среди коллекций (Логическое решение)
Привет, Задача: Сверить определенный массив коллекций с остальными элементами массива этой же коллекции. Как пытаюсь решить. Есть...

Как отфильтровать текст чтобы с его момощью можно было назвать файл?
Вообщем есть переменная ,в ней есть текст в котором могут быть любые символы.Нужно отфильтровать текст так чтобы этим названием можно было...

39
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
07.04.2019, 17:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от slavavs Посмотреть сообщение
почему они там должны быть? там профиль ровный... Какая разница что в конце? Задача отсеять пульсации. Нет понятия локальные, не локальные. Если гр фик прошел вверх более 6 делений или более - минимум есть, прошел вниз 6 делений или более - максимум есть
Так я по данным и смотрю - там колебания больше 6. И таких колебаний много.
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
07.04.2019, 17:39  [ТС]
Я частично обвел кружочками (без масштаба) как примерно должен выглядеть массив контрольных точек.
Миниатюры
Найти логическое решение, чтобы отфильтровать шум  
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
07.04.2019, 17:45  [ТС]
Элд Хасп, я 6 привел для примера, это может быть и 10 и 15, смотря как задать уставку.

Добавлено через 5 минут
Элд Хасп, я скинул пример
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Так я по данным и смотрю - там колебания больше 6. И таких колебаний много.
С другой стороны, если пульсации очень частые и их значение более заданного значения, они все равно соответствуют условиям, что мешает им присвоить контрольные точки, даже если эти точки очень частые...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
07.04.2019, 19:13
Лучший ответ Сообщение было отмечено slavavs как решение

Решение

Цитата Сообщение от slavavs Посмотреть сообщение
С другой стороны, если пульсации очень частые и их значение более заданного значения, они все равно соответствуют условиям, что мешает им присвоить контрольные точки, даже если эти точки очень частые...
В принципе работает. Нашёл одну ошибку - перепутал условия больше-меньше.
Находит на Вашем наборе 52 точки. Вроде правильно. Попробуйте "поираться" значениями period и minDiff
Переменные debug1, debug2, debug3 - для удобства отладки. Когда будут не нужны - закомменте их.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    string[] lines = File.ReadAllLines("at1.txt");
    IEnumerable<double> numbers = lines.Select(double.Parse); // new double[] {/* Элементы поледовательности */ };
    int period = 10; // Размер периода
    double minDiff = 6; // Размер минимальной разницы 
 
    // Получение катриджей - индекс + значение
    IEnumerable<(int index, double numb)> numbersIndex = numbers.Select((n, i) => (index: i, numb: n));
    var debug1 = numbersIndex.ToList();
 
    // Получение периодов в катриджах
    IEnumerable<(int index, double numb, IEnumerable<double> per)> numbIndPer =
        debug1    /*numbersIndex*/.Select(ni => (ni.index, ni.numb,
                numbersIndex
                .SkipWhile(nii => ni.index - nii.index > period)
                .TakeWhile(nii => nii.index - ni.index < period)
                .Select(nii => nii.numb)));
    var debug2 = numbIndPer.ToList();
 
    // Получение локальных критических точек
    IEnumerable<(int index, double numb, int type)> numbIndLocCrit =
        debug2  /*numbIndPer*/
            .Select(nip => (nip.index, nip.numb, type: nip.numb == nip.per.Max() ? 1 : nip.numb == nip.per.Min() ? -1 : 0))
            .Where(nilc => nilc.type != 0);
    var debug3 = numbIndLocCrit.ToList();
 
    // Результирующий список
    List<(int index, double numb, int type)> result
        = new List<(int index, double numb, int type)>() { numbIndLocCrit.First() };
 
    foreach (var nils in numbIndLocCrit)
    {
        var last = result.Last();
        if (Math.Abs(last.numb - nils.numb) > minDiff)
            result.Add(nils);
    }
 
    Console.WriteLine("Локальные критические точки:");
    Console.WriteLine(string.Join
        (
            "\r\n",
            result.Select(nilc => (nilc.type > 0 ? "Максимум: " : "Минимум: ") + $"Индекс {nilc.index}, Значение {nilc.numb}")
        ));
1
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
07.04.2019, 19:36  [ТС]
Элд Хасп, Я изначально, когда начал искать решение задачи, тоже задался периодом, так как это самое очевидное. Но у периода есть один нюанс, он может не охватить диапазон наличия минимума или максимума при условии если движение будет затяжным. И я пришел тому, что лучшим решением будет сначала создать массив всех колебаний, даже самых минимальных. так сказать массив помойку (чередование всех Максимумов и Минимумов). Затем на основе этого массива уже не потребуется диапазон, так как можно будет в цикле перебрать "массив помойку" и отсортировать, создав второй массив на основе коэффициента коррекции. Соответственно я не смог это алгоритмировать...
Я понимаю, что вы мне очень помогли, я честно сказать всегда с огромным уважением отношусь к таким людям как вы, но все-таки, как вы думаете, тот алгоритм с двумя массивами он реален или нет?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
07.04.2019, 19:43
Цитата Сообщение от slavavs Посмотреть сообщение
сначала создать массив всех колебаний, даже самых минимальных.
В предельном случае все точки войдут в этот массив. Ведь в реале значения тока всегда разные.
Так что создание этого массива ничего не даст.
Или я не понял Вашу идею.
Цитата Сообщение от slavavs Посмотреть сообщение
Но у периода есть один нюанс, он может не охватить диапазон наличия минимума или максимума при условии если движение будет затяжным.
В периоде же ищется локальный экстремум. Даже если он будет затяжной - это несколько не мешает.
Поэкспериментируйте с данными.
Анализируются данные впереди и сзади на размер периода. Если изменение затяжное (в одну строну) , то текущая точка не будет соответствовать условию экстремума.
1
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
07.04.2019, 20:27  [ТС]
Я понял, буду тестировать! Про два массива это мои домыслы...

Добавлено через 14 минут
Элд Хасп, Прогнал, все четко находит. Только одно не могу понять, почему программа не вывела последнее значение 7597, ведь оно соответствует всем критериям, ждать новой точки уже не нужно, так как мы прошли расстояние более 6 значений.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
07.04.2019, 20:43
7597 - 699 индекс, перед ней локальный максимум 7607 (695).
Расстояние между индексами меньше периода.

Добавлено через 1 минуту
А нет! Всё равно олжна сработать.
Проверю сейчас.

Добавлено через 10 минут
Под 690 индексом значение 7595. Поэтому на промежутке 689-707 значение 7597 не является локальным минимумом.
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
07.04.2019, 21:04  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Под 690 индексом значение 7595. Поэтому на промежутке 689-707 значение 7597 не является локальным минимумом.
При диапазоне 12, последнее (7597) и предпоследнее (7607) пропадают, но появляется 7611, которое не должно быть, так как цена не прошла вниз 6 и более значений))
Я пока еще ваш код полностью не понял, завтра на свежую голову подумаю, но что-то тут нужно поправить видимо

Добавлено через 3 минуты
При уменьшении диапазона, вроде все норм, но 7611 присутствует

Добавлено через 1 минуту
получается что надо прописать, чтобы программа в конце, если условие не выполняется, должна ожидать, а не выводить контрольную точку
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
07.04.2019, 21:12
Цитата Сообщение от slavavs Посмотреть сообщение
При диапазоне 12, последнее (7597) и предпоследнее (7607) пропадают, но появляется 7611, которое не должно быть, так как цена не прошла вниз 6 и более значений))
Предыдущая точка - это 682-7593. 7611 боле чем на 6 от неё отличается. Точки между ними считаются как временными, переходными, так как в заданном периоде они не являются локальными экстремумами.

Добавлено через 4 минуты
Цитата Сообщение от slavavs Посмотреть сообщение
получается что надо прописать, чтобы программа в конце, если условие не выполняется, должна ожидать, а не выводить контрольную точку
В статическом анализе точки не имеющие полные данные о заданном окружении в итоговые результаты обычно не включаются. Поэтому начало и конец по статанализу надо отбрасывать.
Но в реал-тайме по другому. Там нужна реакция на текущие данные. Там надо делать какие-то аппроксимации на краях диапазона.
В общем, всё зависит от ТЗ.
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
07.04.2019, 21:29  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Точки между ними считаются как временными, переходными, так как в заданном периоде они не являются локальными экстремумами.
Есть ли вариант эти точки тоже вывести, если они соответствуют входным данным?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но в реал-тайме по другому. Там нужна реакция на текущие данные. Там надо делать какие-то аппроксимации на краях диапазона.
Тут конечно засада... программный комплекс работает в реал-тайме... интересно как поведет себя код в живую? когда будет добавляться новые данные... программа по сути будет постоянно выводить Экстремум, хотя он не будет соответствовать заданию.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
07.04.2019, 21:49
Цитата Сообщение от slavavs Посмотреть сообщение
Есть ли вариант эти точки тоже вывести, если они соответствуют входным данным?
Для этого нужно математически определить что такое длительное изменение в одну сторону.
Я в примере определил это как отсутствие локальных экстремумов на +- период.
Если определить по другому, то можно сделать и другую реализацию.

Цитата Сообщение от slavavs Посмотреть сообщение
Тут конечно засада... программный комплекс работает в реал-тайме... интересно как поведет себя код в живую? когда будет добавляться новые данные... программа по сути будет постоянно выводить Экстремум, хотя он не будет соответствовать заданию.
Для реал тайма эта реализация в принципе не подойдёт. Эта реализация для ста анализа.
Для реал тайма обязательно нужна иная математика для последних значений. И учитывать что идёт постоянное добавление значений в конец последовательности.
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
07.04.2019, 22:00  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для реал тайма эта реализация в принципе не подойдёт. Эта реализация для ста анализа.
в любом случае спасибо!
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
07.04.2019, 22:46  [ТС]
Элд Хасп, вот такие мысли по поводу реала.
1. Принимаем первое значение
2. Принимаем второе значение
3. Сравниваем 1 и 2, если первое меньше, то записываем его в переменную t_i (временная минимума)
4. Считываем далее... если при движении вверх появится значение меньшее, то предыдущее записываем в t_a (временный максимум).
5. если график следует выше t_a, то ждем новый t_a, а предыдущий удаляем (перезаписываем)
6. Одновременно отслеживаем на сколько график убежал от t_i. Если график прошел 6 шагов, то t_i -> в T_I (постоянная минимума)
и тд.
Такое реально написать?
Миниатюры
Найти логическое решение, чтобы отфильтровать шум  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
07.04.2019, 22:56
Цитата Сообщение от slavavs Посмотреть сообщение
6. Одновременно отслеживаем на сколько график убежал от t_i. Если график прошел 6 шагов, то t_i -> в T_I (постоянная минимума)
и тд.
Это приведёт к отставанию на размер анализируемого периода.
Фактически тоже самое, что моём примере, но с обрезкой неполных периодов в начале и конце.
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
07.04.2019, 23:00  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это приведёт к отставанию на размер анализируемого периода.
Какие периоды, они не нужны, работаем с каждым новым значением.

Добавлено через 1 минуту
Получили новое значение, обработали...
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
07.04.2019, 23:22
slavavs, Вообще, про обработку сигналов много толстых книжек написано.
Вставлю свои две копейки (из того что я понял из вашей задачи, хотя, конечно, надо больше данных).

1) Чтобы отфильтровать сигнал, внезапно, его надо отфильтровать. Из графиков я понял, что полоса частот шума шире, чем полоса сигнала -> ставим на входе ФНЧ. (для начала сгодится дискретный БИХ фильтр первого порядка). Конечно, точки максимумов/минимумов относительно исходных данных при этом слегка изменятся (как по времени, так и по амплитуде), но, в любом случае, получить обратно сигнал из смеси сигнала с шумом в общем случае невозможно.

2)Сделаем своеобразное окно (допустим в 1 вольт) с центром в начальной точке (пусть начальное значение, допустим 5В, тогда окно - от 4.5В до 5.5В). Как только сигнал вылезет из этого окна двигаем окно запоминая время и направление движения (допусти сигнал стал 6.1В - окно стало от 5.1В до 6.1В, движется вверх). Как только направление движения поменялось - предыдущее движение - это точка экстремума. Это позволит убрать ложные экстремумы, неотфильтрованые на первом шаге.

Принципиально можно обойтись только вторым шагом, но лучше оба.
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 127
07.04.2019, 23:24  [ТС]
avgoor, ваш коммент заслуживает внимания, но мне он не понят ввиду моих не глубоких познаний.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
07.04.2019, 23:26
Цитата Сообщение от slavavs Посмотреть сообщение
Какие периоды, они не нужны, работаем с каждым новым значением.
А это Если график прошел 6 шагов что? Какая разница назвать шагами или периодом - суть, то не меняется.
Вот у Вас идут значения 1, 2, 3, 4, 5, 6, 7 . "7" - это локальный максимум? Это зависит от того какие значения придут пеосле этого, но при анализе "7" их ещё нет. Если придут дальше 3, 4, 6, 2, и т.д - то максимум.
А если придут 8, 9, 10 ? А если 6, 5, 9 ? Когда при каких условиях можно сделать вывод, что "7" - это локальный максимум?

Это зависит от задачи. Для чего это определяется? Какая должна быть реакция на этот сигнал? Как эта реакция зависит от истории предыдущих значений? Какой коэффициент риска? И т.д.
То есть простого теоретизирования мало. Нужно создавать матмодель реального объекта. В реал-тайме без этого не обойдёшься.

Наглядный пример - различные биржевые роботы. Ну, нету до сих пор матмодели биржи, и какой бы робот не был - без вмешательства человека он в итоге загоняет в минус.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
07.04.2019, 23:28
slavavs, так спрашивайте, что не поняли.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.04.2019, 23:28

Как отфильтровать вывод результата выполнения команды ipconfig, чтобы получить только IP-адрес?
Доброго времени суток, не подскажите, какой фильтр нужно использовались, чтобы отобразить только IP адрес?

Отфильтровать таблицу Выдача_книг так, чтобы остались читатели которые просрочили сдачу книг
Отфильтровать таблицу Выдача_книг так, что бы остались читатели которые просрочили сдачу книг. Добавлено через 6 минут Вот скрин...

Как сделать, чтобы метод возвращал логическое значение
Добрый день, господа форумчане. Пытаюсь сделать обработчик событий через if else, но что-то никак не получается, нужна Ваша помощь... Код...

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

Шум в системе, После замены компрессора увеличился шум
После замены компрессора на фреоне R600a увеличился шум в системе-шипение ,булькание.Как можно бороться с этими дефектами ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru