Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Отображение большого колличества точек на маленьком экране
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Petrovich
Господа, есть задача, помогите пожалуйста решить.
Есть выборка сигнала длинной 10000 семплов. Всю эту выборку нужно отобразить на экране длинной в 300 точек. Как это сделать так, что бы из исходной выборки не были выкинуты характерные максимумы и минимумы?
При этом алгоритм должен быть не ресурсоемким...
alexPec
Цитата(Petrovich @ Nov 26 2010, 23:23) *
Господа, есть задача, помогите пожалуйста решить.
Есть выборка сигнала длинной 10000 семплов. Всю эту выборку нужно отобразить на экране длинной в 300 точек. Как это сделать так, что бы из исходной выборки не были выкинуты характерные максимумы и минимумы?
При этом алгоритм должен быть не ресурсоемким...

Вроде все логично, делал так: разбивал на блоки по 10000/300 семплов, в каждом искал min,max рисовал вертикальную линию от min до max, при этом х-координата линии равна номеру блока. В моем случае было быстрее, чем на каждый семпл ставить точку с координатой (trunc (x/(10000/300)),y) (здесь х-номер отсчета, у - значение)
Petrovich
Хорошая идея, попробую так. Только наверное нужно проводить линию от предыдущего минимума, к текущему максимуму и уже от него к минимуму. Это позволить масштабировать.
alexPec
Цитата(Petrovich @ Nov 27 2010, 20:07) *
Хорошая идея, попробую так. Только наверное нужно проводить линию от предыдущего минимума, к текущему максимуму и уже от него к минимуму. Это позволить масштабировать.

Как масштабировать? У Вас и так все плотно, если масштабируете, у вас блок просто меньше будет. Такое масштабирование нужно когда на экране больше точек чем семплов, а у вас наоборот. Да и когда на экране больше точек, то просто точки соединяем, min/max не при делах.
Petrovich
Я имею ввиду что тогда можно отображать при разных соотношениях точек/пикселей. От 1/1 до любого другого значения
Petrovich
С отображением большого количества точек получилось все хорошо, Но сейчас задача немного изменилась. Как правильно отобразить например 350 или любое не кратное значение на экране размером 300. Как тут быть? Это вроде называется ресамплинг, но четкого описания алгоритма не нашел. Кто нибудь знает как это делается корректно?
rezident
Цитата(Petrovich @ Jan 29 2011, 00:18) *
Это вроде называется ресамплинг, но четкого описания алгоритма не нашел. Кто нибудь знает как это делается корректно?
Это называется анти-алиасинг или сглаживание. Почитайте статьи в Википедии и погулите по словосочетаниям "антиалиасный фильтр" и "anti-aliasing filter".
Petrovich
Цитата(rezident @ Jan 28 2011, 23:17) *
Это называется анти-алиасинг или сглаживание. Почитайте статьи в Википедии и погулите по словосочетаниям "антиалиасный фильтр" и "anti-aliasing filter".

Не совсем так, мне нужно не выкинуть все лишнее, я ужать с сохранением все характерных максимумови и минимумов.
alexPec
Цитата(Petrovich @ Jan 28 2011, 22:18) *
С отображением большого количества точек получилось все хорошо, Но сейчас задача немного изменилась. Как правильно отобразить например 350 или любое не кратное значение на экране размером 300. Как тут быть? Это вроде называется ресамплинг, но четкого описания алгоритма не нашел. Кто нибудь знает как это делается корректно?


А зачем Вам ресамплинг? У Вас точек на реальную горизонтальную координату по любому >1. Так эти 50 лишних точек равномерно распределить по 300. Получим такую картину: 5 точек ставим как они есть, 6-ю, 7-ю - колдонуть как нибудь (ну или тот же мин-макс или среднее или еще чего, то есть сделать из 2-х одну), затем снова 5 точек как есть, снова 2 точки в 1 слепленные. Получится 50 точек более-менее равномерно размазаны по графику. Конечно линейность представления результата пострадает, но если это не принципиально - гораздо менее затратно по ресурсам чем ресамплинг. Кстати если при слеплении мин-макс использовать, все мин и макс остаются на графике
Petrovich
Цитата(alexPec @ Jan 28 2011, 23:31) *
А зачем Вам ресамплинг? У Вас точек на реальную горизонтальную координату по любому >1. Так эти 50 лишних точек равномерно распределить по 300. Получим такую картину: 5 точек ставим как они есть, 6-ю, 7-ю - колдонуть как нибудь (ну или тот же мин-макс или среднее или еще чего, то есть сделать из 2-х одну), затем снова 5 точек как есть, снова 2 точки в 1 слепленные. Получится 50 точек более-менее равномерно размазаны по графику. Конечно линейность представления результата пострадает, но если это не принципиально - гораздо менее затратно по ресурсам чем ресамплинг. Кстати если при слеплении мин-макс использовать, все мин и макс остаются на графике

Это понятно, но мне нужен общий принцип, мне не только 350 точек нужно отобразить, а например 3323, 561, 305... в общем любое кратное и не кратное 300мстам точкам экрана
alexPec
Цитата(Petrovich @ Jan 28 2011, 23:43) *
Это понятно, но мне нужен общий принцип, мне не только 350 точек нужно отобразить, а например 3323, 561, 305... в общем любое кратное и не кратное 300мстам точкам экрана

Извините, принцип думал из примера понятен. Поясню как думаю. Делим нацело ко-во точек которое нужно отобразить (а) на количество пикселей экрана где это отображается ( B ) - пусть получается m. Далее смотрим остаток от целочисленного деления ( a mod b ).
Если ноль - группируем исходные точки в блоки по m и к каждому блоку применяем алгоритм (мин-макс, усреднение и т.д.).
Группировка такая получается (по кол-ву точек в блоке): m, m, m,.....,m ; т.е. в вашем случае 300 раз (300 блоков) по m элементов.
Если не ноль - то находим как часто "размазываемые" точки должны появляться в блоках, т.е. делим ( a mod B ) на b - результат float . Пусть получается С, 0<C<1. Далее группируем исходные точки в блоки, но уже не по m, а следующим образом.

1 Группируем блок из m точек,
2 Производим операцию d=(d+c);
3 Если d>1, то: {d=d-1 и следующий блок будет из m+1 точек}, иначе {следующий блок из m точек}
4 к шагу 2

Например: 561 точка.
561/300=1, (561 mod 300)=261, C=261/300=0,87

Группируем блоки:

1 эл-т ;d=0+0,87=0,87
1 эл-т; d=0,87+0,87=1,74; d=1,74-1=0,74;
2 эл-та; d=0,74+0,87 = 1,61; d=1,61-1=0,61;
2 эл-та; d=0,61+0,87 = 1,48; d=1,48-1=0,48;
....

И так у вас должно получиться 300 блоков (300 строчек) с разным ко-вом элементов в блоке.
Ну в последнем блоке может получиться (возможно) m-1 или m+2 элемента - надо думать а неохота уже

Кол-во эл-тов в блоках будет отличаться на 1. Далее обрабатываем каждый блок таким же алгоритмом (мин-макс, среднее и т.д.) и отображаем 300 точек.
Petrovich
Спасибо, попробую так, вроде все логично...
Petrovich
Все выглядит красиво. Спасибо за совет! beer.gif
alexPec
Цитата(Petrovich @ Jan 31 2011, 14:45) *
Все выглядит красиво. Спасибо за совет! beer.gif



А пожалуйста! beer.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.