psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2008-12-06 01:33 pm

Небольшая авантюра :)

И до чего же мне остопи... осточертели разнообразные глюки виндового контрола ListView. В один прекрасный день я осознал, что на периодический отлов и исправление подобных глюков было потрачено много дней. Ну и решился я на такую авантюру: написать этот класс "ручками", так сказать, под себя. Пока получается. Позавчера сделал отображение и скроллинг, вчера - множественный выбор и перетаскивание/растягивание заголовков. Как там говорится в одной программистской поговорке: никогда не находится время, чтобы сделать что-то необходимое, но всегда находится время, чтобы переделать ;)



Это, кстати, к вопросу, как дела с bard-ом. Нормально дела, вовсю идет работа над новой версией.

[identity profile] yogsagot.livejournal.com 2008-12-06 10:59 am (UTC)(link)
Это на чем? На сях?

[identity profile] psilogic.livejournal.com 2008-12-06 11:06 am (UTC)(link)
да, на сях с плюсами

[identity profile] odysseos.livejournal.com 2008-12-06 01:41 pm (UTC)(link)
Для Delphi такой готовый есть, опенсорсный. Причем - возможностей несколько даже больше, чем у виндового ListView (примерно как у Vista'овского).

[identity profile] metaclass.livejournal.com 2008-12-06 06:45 pm (UTC)(link)
Для дельфи и его родного TCustomGrid с наследниками хватает. У него очень прилично сделанная объектная модель, можно извращаться, как душе угодно.

[identity profile] odysseos.livejournal.com 2008-12-06 09:17 pm (UTC)(link)
Не-е-е, это именно ListView - он поддерживает разные режимы отображения, не только "строчно"-"ячеейчный".

[identity profile] psilogic.livejournal.com 2008-12-07 11:14 am (UTC)(link)
Ага, приходилось иметь дело :)

[identity profile] odysseos.livejournal.com 2008-12-07 04:22 pm (UTC)(link)
Мы про одно и то же говорим? :) Про EasyListview?

[identity profile] psilogic.livejournal.com 2008-12-08 12:06 pm (UTC)(link)
Вроде нет :) Я о стандартном дельтфийском контроле :)

[identity profile] odysseos.livejournal.com 2008-12-08 12:16 pm (UTC)(link)
Дык а я именно что не про стандартный :)

[identity profile] psilogic.livejournal.com 2008-12-08 01:14 pm (UTC)(link)
угу. впрочем, уже неважно, я уже сделал себе контрол с кучей нужных мне наворотов - с деревьями, ячейками в несколько строк/столбцов, итп. listview отовсюду убрал.

[identity profile] http://technorati.com/people/technorati/ketmar/ (from livejournal.com) 2008-12-09 02:05 am (UTC)(link)
(задумчиво) а у нас Qt дают…

[identity profile] psilogic.livejournal.com 2008-12-09 01:06 pm (UTC)(link)
у нас на работе - тоже. а это - не "для дяди", это для себя :]

[identity profile] http://technorati.com/people/technorati/ketmar/ (from livejournal.com) 2008-12-09 01:09 pm (UTC)(link)
а «для себя» так Qt и вовсе бесплатен же…

[identity profile] psilogic.livejournal.com 2008-12-09 03:17 pm (UTC)(link)
дело не в цене, а в удовольствии :)

[identity profile] http://technorati.com/people/technorati/ketmar/ (from livejournal.com) 2008-12-09 03:19 pm (UTC)(link)
ты прав. завсегда приятно взять чужой рабочий и понятный код, а не пилить непонятный свой. %-)

[identity profile] psilogic.livejournal.com 2008-12-09 03:23 pm (UTC)(link)
это уж кому как :) особенно, если выбор между чужим и непонятным и своим понятным ;)

[identity profile] http://technorati.com/people/technorati/ketmar/ (from livejournal.com) 2008-12-09 03:25 pm (UTC)(link)
Qt весьма понятна. в отличие от моего кода. %-)

[identity profile] psilogic.livejournal.com 2008-12-09 03:43 pm (UTC)(link)
А у меня наоборот - мне проще свое написать или разобраться в своем старом (да, да, я комментов пишу в достатке), чем разобраться в чужом.

[identity profile] http://technorati.com/people/technorati/ketmar/ (from livejournal.com) 2008-12-09 03:47 pm (UTC)(link)
я уже как-то привык чужой код читать. а шо делать — линуксы и не до такого доведут.

[identity profile] psilogic.livejournal.com 2008-12-09 03:58 pm (UTC)(link)
Ну, видимо, кому как, я не отказываюсь совсем от чужого кода, просто после какой-то границы (зависящей от разных факторов) мне оказывается проще написать свой. В данном случае QT не подходит по ряду причин. Основная - продукт делаю я сам, сам опредеяю требования к нему, и требования кросс-платформенности среди них нет и не будет :) Страдания линуксоидов не тронут мое жЫстокое серЦэ. :)

На тему "привык чужой код читать" вспомнилось с баш.орга: если при чтении чужого кода матерные восклицания звучат не чаще двух раз в минуту, это качественный код :)

[identity profile] http://technorati.com/people/technorati/ketmar/ (from livejournal.com) 2008-12-09 04:41 pm (UTC)(link)
>Основная — продукт делаю я сам, сам опредеяю требования к нему, и требования
>кросс-платформенности среди них нет и не будет

Qt — ещё и мощный тулкит, где зиллионы всего уже написаны и отлажены. %-)
алсо, QT — это QuickTime. %-)

>сли при чтении чужого кода матерные восклицания звучат не чаще двух раз в минуту,
>это качественный код :)

обычно если мне надо лезть в чужой код, то суточный запас матов я уже израсходовал. ибо я что, по доброй воле лезу? ежели работает — не трогаю.

(no subject)

[identity profile] psilogic.livejournal.com - 2008-12-09 17:19 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2008-12-09 17:26 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2008-12-09 17:31 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2008-12-09 17:53 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2008-12-09 18:29 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2008-12-09 18:47 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2008-12-09 19:19 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2008-12-09 19:22 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2008-12-09 19:44 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2008-12-09 20:06 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2008-12-09 20:50 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2008-12-09 21:00 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2008-12-09 17:31 (UTC) - Expand

Не в тему, сорри

[identity profile] dominik-111.livejournal.com 2008-12-11 10:21 pm (UTC)(link)
Доброго времени!Можно обратиться с вопросом по фурье трансформации? Вышел через сайт. Я сам не математик, а тут понадобилось :-)
Итак, имеется непрерывный температурный сигнал от датчика. Этот сигнал абсолютно негармоничен, то бишь колеблется вверх и вниз. В зависимости от условий происходящих процессов сигнал меняет частоту и амплитуду. При падении амплитуды и частоты до определённых значений требуются вмешательство в процесс (действие), которое влияет на процесс и изменяет структуру сигнала в сторону увеличения амплитуды и изменения частоты.
Задача: проанализировать сигнал и составить четкий алгоритм, когда производить действие над процессом.
После долгих рысканий в инете вышел на дискретное быстрое преобразование Фурье. То бишь разделить непериодическую функцию на значения и составить из них функцию (как я понял, но не факт). В экселе есть функция для Фурье трансформации (ФФТ).
Эта трансформация выдаёт комплексные числа, которые состоят из реальной и представляемой компоненты. По длине вектора (по теореме Пифагора) можно судить об амплитуде исходных данных. Почти вся литература в интернете о Фурье преобразовании относится к обработке звука, и там такое преобразование показывает частоту, на которой встречаются определенные амплитуды. Но какая частота у температуры? Сигнал считыватся раз в секунду. И второй, самый главный вопрос, как использовать представляемую компоненту комплексного числа для анализа?
спасибо!


[identity profile] psilogic.livejournal.com 2008-12-19 05:49 pm (UTC)(link)
Я расскажу коротко, а если захотите подробнее детали и формулы, то в конце моего ответа есть ссылка на определенную главу в середине моего материала.

Значит, идея ФФТ состоит в том, чтобы представить некое колебание (все равно, какое) в виде суммы синусоид. На входе ФФТ нужно изменение величины во времени с некоторым интервалом. В вашем случае - изменение температуры. Берут некий промежуток времени длиной T, делят его на N фрагментов, записывают значения температуры в N точках на этом интервале T. То есть, делают обычную дискретизацию.

На выходе получится набор из N комплексных величин. Из этого набора надо взять первые N/2 - по определенным причинам остальные не несут полезной информации. В каждой величине зашифрована фаза, амплитуда и частота - отдельно. То есть, у вас получится N/2 разных колебаний, из которых состоит то колебание, которое вы изначально взяли.

Далее, каждое комплексное число надо расшифровать (см. формулу в самом конце страницы по ссылке). Получим для каждого числа одну амплитуду, одну фазу и одну частоту. Фаза обычно не несет полезной информации. Также, если амплитуда маленькая (сравнительно с другими), это комплексное число можно проигнорировать. В результате останется некоторое количество "осмысленных" пар: амплитуда и частота. Это есть так называемые "гармоники". По ним можно судить, из чего состоял исходный сигнал - из каких амплитуд и частот.

Что касается вашей задачи, то там надо смотреть, а правда ли, что ФФТ - подходящий метод для решения задачи? Например, если вам нужна некая амплитуда "в целом", то, возможно, есть смысл посчитать просто средний размах колебаний? А часоты - тут мне неясно, какой практический смысл имеет частота температуры? То есть вот температура возрастает, убывает с некоторой периодичностью, а зачем может быть нужен период этих колебаний? Есть я пойму смысл задачи, возможно, я вам посоветую метод лучше, чем FFT.

http://psi-logic.shadanakar.org/fft/fft7.htm

[identity profile] dominik-111.livejournal.com 2008-12-24 07:38 am (UTC)(link)
Спасибо, Вашу страничку почитал (может на "ты"?, меня Дима зовут). А также еще пару-тройку разделов из несольких книг (особенно понравилась (www.dspguide.com)). Теперь совсем другие вопросы :-))
Для начала описание проблемы:
измеряется разница температур между двумя близко расположенными термодатчиками. Цель - наблюдать изменение температурного напора независимо от абсолютных значений температур. Сигнал (дельта Т) изменяется со временем в сторону уменьшения амплитуды и возможно частоты (макс амплитуды на определенных частотах пока не получилось отфильтровать). Потом производится дествие в системе и сигнал возвращается на прежний уровень амплитуд (частот?). Сигналы считываются 1 раз в секунду. Анализ проводится из 4096 точек в экселе. После Фурье анализа и построения зависимости "амплитуда (реальная компонента комплексного числа) - частота", получаю 4 пика, но они сильно засорены шумом, так что примерно можно вычислить пики, но математический аппарат надо еще подстроить. Прочитал про Окно Хамминга, но так и не понял как его применять. Как японял, надо разбить 4096 точек на например 128 сегменты, умножить каждый на окно и потом взять Фурье от каждого сегмента. Но не уверен, что именно так. С этим и связаны в данный момент основные вопросы. Окно Хамминга математически уже выразил, это несложно. Предствавляемая компонента комплексного числа вроде бы не несет полезной (в данном случае инфо).
Вот такие дела.

[identity profile] psilogic.livejournal.com 2008-12-24 12:26 pm (UTC)(link)
Амплитуду правильно все-таки считать не на голой реальной компоненте, а как как (корень из (re^2 + im^2)) / 4096. А то половину пиков потеряете. Не выбрасывайте комплексную компоненту, если она у вас случайно оказалась близкой к нулю на этом сигнале, то не факт, что окажется близкой к нулю на другом сигнале или когда вы начнете бить на сегменты.

То, что получаемый спектр "зашумлен", это нормально, обычно так и получается на реальных сигналах. Связано это с тем, что сигнал может быть суммой всего нескольких колебаний, но БПФ представляет его как сумму "не тех" колебаний. Например, сигнал есть сумма колебаний с периодом в 5,5 и 12,3 секунд, а после БПФ получаются ненулевые результаты для периодов 2, 3, 4, 5, 6,... 20 секунд, но с пиками в районе 5 - 6 и 12 - 13. К сожалению, БПФ не умеет точно угадывать частоты, это ее недостаток.

Хамминг, по идее, увеличивает высокие пики и опускает низкие, отфильтровывает спектрльный шум. Для этого надо умножить ваши 4096 точек на функцию Хамминга перед тем, как делать БПФ.

Разбиение на сегменты нужно, если вы хотите проследить изменение частот во времени. Т.е. если вы хотите посмотреть, не менялась ли частота/амплитуда колебаний за ваш час с небольшим. Тогда вы делите на двухминутные сегменты по 128 отсчетов и смотрите: в первые 2 минуты частота/амплитуда была такие, в следующие 2 минуты - такие, и так далее.

Но вообще-то все это мне кажется излишним. Если вам нужен именно некий "градиент" температуры, то есть, перейти от абсолютных показаний к относительным и от статики к динамике, то частоты вам, извиняюсь, не припеклись, как и преобразовнаие Фурье и окна Хамминга :) Вам нужно просто взять отрезок в 60 отсчетов, посчитать среднее. Потом взять следующий отрезок в 60 отсчетов, посчитать среднее. Потом сравнить результаты либо вычитанием, либо делением. При вычитании получите изменение в абсолютных единицах, при делении - в процентах.