реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Отображение большого колличества точек на маленьком экране
Petrovich
сообщение Nov 26 2010, 20:23
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658



Господа, есть задача, помогите пожалуйста решить.
Есть выборка сигнала длинной 10000 семплов. Всю эту выборку нужно отобразить на экране длинной в 300 точек. Как это сделать так, что бы из исходной выборки не были выкинуты характерные максимумы и минимумы?
При этом алгоритм должен быть не ресурсоемким...
Go to the top of the page
 
+Quote Post
alexPec
сообщение Nov 26 2010, 20:42
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(Petrovich @ Nov 26 2010, 23:23) *
Господа, есть задача, помогите пожалуйста решить.
Есть выборка сигнала длинной 10000 семплов. Всю эту выборку нужно отобразить на экране длинной в 300 точек. Как это сделать так, что бы из исходной выборки не были выкинуты характерные максимумы и минимумы?
При этом алгоритм должен быть не ресурсоемким...

Вроде все логично, делал так: разбивал на блоки по 10000/300 семплов, в каждом искал min,max рисовал вертикальную линию от min до max, при этом х-координата линии равна номеру блока. В моем случае было быстрее, чем на каждый семпл ставить точку с координатой (trunc (x/(10000/300)),y) (здесь х-номер отсчета, у - значение)

Сообщение отредактировал alexPec - Nov 26 2010, 20:44
Go to the top of the page
 
+Quote Post
Petrovich
сообщение Nov 27 2010, 17:07
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658



Хорошая идея, попробую так. Только наверное нужно проводить линию от предыдущего минимума, к текущему максимуму и уже от него к минимуму. Это позволить масштабировать.
Go to the top of the page
 
+Quote Post
alexPec
сообщение Nov 27 2010, 22:53
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(Petrovich @ Nov 27 2010, 20:07) *
Хорошая идея, попробую так. Только наверное нужно проводить линию от предыдущего минимума, к текущему максимуму и уже от него к минимуму. Это позволить масштабировать.

Как масштабировать? У Вас и так все плотно, если масштабируете, у вас блок просто меньше будет. Такое масштабирование нужно когда на экране больше точек чем семплов, а у вас наоборот. Да и когда на экране больше точек, то просто точки соединяем, min/max не при делах.
Go to the top of the page
 
+Quote Post
Petrovich
сообщение Nov 28 2010, 15:23
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658



Я имею ввиду что тогда можно отображать при разных соотношениях точек/пикселей. От 1/1 до любого другого значения
Go to the top of the page
 
+Quote Post
Petrovich
сообщение Jan 28 2011, 19:18
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658



С отображением большого количества точек получилось все хорошо, Но сейчас задача немного изменилась. Как правильно отобразить например 350 или любое не кратное значение на экране размером 300. Как тут быть? Это вроде называется ресамплинг, но четкого описания алгоритма не нашел. Кто нибудь знает как это делается корректно?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 28 2011, 20:17
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Petrovich @ Jan 29 2011, 00:18) *
Это вроде называется ресамплинг, но четкого описания алгоритма не нашел. Кто нибудь знает как это делается корректно?
Это называется анти-алиасинг или сглаживание. Почитайте статьи в Википедии и погулите по словосочетаниям "антиалиасный фильтр" и "anti-aliasing filter".
Go to the top of the page
 
+Quote Post
Petrovich
сообщение Jan 28 2011, 20:23
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658



Цитата(rezident @ Jan 28 2011, 23:17) *
Это называется анти-алиасинг или сглаживание. Почитайте статьи в Википедии и погулите по словосочетаниям "антиалиасный фильтр" и "anti-aliasing filter".

Не совсем так, мне нужно не выкинуть все лишнее, я ужать с сохранением все характерных максимумови и минимумов.
Go to the top of the page
 
+Quote Post
alexPec
сообщение Jan 28 2011, 20:31
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



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


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

Сообщение отредактировал alexPec - Jan 28 2011, 20:32
Go to the top of the page
 
+Quote Post
Petrovich
сообщение Jan 28 2011, 20:43
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658



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

Это понятно, но мне нужен общий принцип, мне не только 350 точек нужно отобразить, а например 3323, 561, 305... в общем любое кратное и не кратное 300мстам точкам экрана
Go to the top of the page
 
+Quote Post
alexPec
сообщение Jan 28 2011, 22:07
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(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 точек.

Сообщение отредактировал alexPec - Jan 28 2011, 22:11
Go to the top of the page
 
+Quote Post
Petrovich
сообщение Jan 29 2011, 20:34
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658



Спасибо, попробую так, вроде все логично...
Go to the top of the page
 
+Quote Post
Petrovich
сообщение Jan 31 2011, 11:45
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658



Все выглядит красиво. Спасибо за совет! beer.gif
Go to the top of the page
 
+Quote Post
alexPec
сообщение Feb 1 2011, 14:42
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(Petrovich @ Jan 31 2011, 14:45) *
Все выглядит красиво. Спасибо за совет! beer.gif



А пожалуйста! beer.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01477 секунд с 7
ELECTRONIX ©2004-2016