|
Автор: Большой Грызь
Дата : 07-05-02, Втр, 17:46:27
|
Вполне реальная математическая задача в программировании, которую в данный момент надо решить. И мне показалось, чо она может быть интересна не только мне
Имеется некоторый записанный сигнал - квадратные импульсы вот такой вот формы примерно: _П_П_П_П_
Запись - это просто массив с числами - значениями сэмплингов с некоторой частотой. Требуется найти устредненный максимум и минимум сигнала за как можно меньшее время (чтобы в реальном времени во время записи самого сигнала определять успевало). Проблема - именно в усреднении. Просто пробежаться и найти максимум и минимум - не хохма. Но тогда такой алгоритм выловит все спайки случайные - а это никому не нужно. За две пробежки найти максимум и минимум усредненный тоже легко - сначала делается первая пробежка и определяется абсолютный максимум и минимум вместе со спайками. Затем пробегаются по массиву еще раз и делают усреднение на всё что выше или ниже половины между абсолютным максимумом и минимумом - это и будут усредненные их значения. Но это за две пробежки. А за одну как? Тем более, что заранее амплитуда сигнала неизвестна - т.е. невозможно заранее взять эту половину. |
----------------------------- Quod erat demonstrandum! |
|
|
Автор: Андрей
Дата : 08-05-02, Срд, 08:57:45
|
עבוד אותות, однако. Обратись к кому-нить с хашмаля или мехонот, там эти дела учат. |
|
|
Автор: Паша
Дата : 12-05-02, Вск, 12:00:42
|
Самое простое, что приходит в голову, это динамически вычислять среднее между абсолютным "макс" и "мин", всё что больше прибавлять к среднему "макс", всё что меньше к среднему "мин". Если массив большой, то точность будет высока. Можно ещё откинуть значения некоторого количества первых проб... |
|
|
Автор: Паша
Дата : 13-05-02, Пнд, 02:30:57
|
А ещё можно откинуть все предыдущие, если динамически среднее вылезет за рамки между абсолютным динамическим "мин" и "макс"... |
|
|
Автор: Большой Грызь
Дата : 13-05-02, Пнд, 06:03:51
|
Вобщем пока что лучше решения не нашел, чем отловить первый пульс и определить по нему примерный абсолютный максимум и минимум, а затем по всем остальным пульсам в буффере уже считать усредненное значение (кол-во пульсов в буффере - 9-10, так что плюс-минус первый пульс никак не повлияет на точность усреднения). Это решение в лоб. То есть те же две пробежки, только не в параллель по всему буфферу, а последовательно по двум частям буффера. Я просто думал, что каким-то образом можно решить это дело за одну проходку математически. |
----------------------------- Quod erat demonstrandum! |
|
|
Автор: Паша
Дата : 13-05-02, Пнд, 13:19:01
|
Грызь, если в моём решении в момент, когда динамически среднее вылезает за рамки между абсолютным динамическим "мин" и "макс", ничего не отбрасывать, а бывшие среднии усреднять и учитывать дальше только в одну сторону, то получишь точно такой же результат за один пробег, как и в твоём изначальном решении за два. Если я правильно понял условие задачи, то моё решение делает свою работу за один пробег. Если хочешь позвони я уточню, что я имел в виду. Телефон можно выяснить по мылу... Хотя может быть я и не понял условия, так как я далёк от программирования... |
|
|
Автор: Большой Грызь
Дата : 14-05-02, Втр, 05:41:29
|
Паша, первый пульс - все равно пропустишь или надо вставлять условие еще одно (хотя пробежка будет одна). То есть вот, что я имею в виду - "внутри" каждого пульса ты имеешь почти "прямую" линию. Ключевых слов два: "почти" и "прямую". Иимеется в виду, что вот ты начал сканирование буффера и видишь, что значения первых, скажем, 100 элементов "почти" одинаковы - но ты-то не знаешь "максимум" это или "минимум". Это может быть, как "верхняя" планка, так и "нижняя". И до того момента, пока ты не добежишь до "перепада" - ты этого не узнаешь. Но допустим, что изначально ты будешь сохранять среднее значение в какой-то временной переменной и добежав до резкого перепада уже решишь, что ты считал - максимум или минимум, а дальше, узнав это, продолжишь уже считать усреднение обычным путем. Это возможно, но имеется одно большое НО: обнаружить "резкий" перепад не очень-то просто, так как неизвестно, что же считать резким перепадом. Постараюсь буквенно "нарисовать" пример сигнала (картинкой было бы проще, но еще не успел эту опцию сделать ) |\ | /\ ||___|_|__ __| |___ __ АВ С | | | | |___ ___ _| |___ __| \/ | \_|
То есть вот тебе, пожалуйста - сигнал, начавшийся с "верхней планки" (от точки А), у которого почти сразу - перепад после всплеска (после точки В). И весь кусок ВС уже будет воспринят, как "нижняя планка" и соответственно будет добавлен к усреднению минимума. Вобщем-то на приведенном сигнале (который, в принципе, приближен к реальному) и невозможно даже примерно сказать, где есть "абсолютный максимум", а где - "абсолютный минимум", пока не пробежишься хотя бы по 1/10 буффера (заранее известно, что в буффере есть 9-10 импульсов). |
----------------------------- Quod erat demonstrandum! |
|
|
Автор: Паша
Дата : 14-05-02, Втр, 12:16:13
|
Грызь в своём втором сообщении я чётко определил определение "резкого перепада", а в третьем, как избежать потери значений первого сигнала. Единственное условие, для того чтобы мой метод дал 100% результат, звучит так: все верхние и нижние значения должны лежать по разную сторону от среднего любой пары верхняя-нижняя точка. Что легко соблюдается, если "резкий перепад", действительно резкий. |
|
|
Автор: Большой Грызь
Дата : 14-05-02, Втр, 12:59:21
|
Верно... надо подумать.... |
----------------------------- Quod erat demonstrandum! |
|