25 окт. 2011 г.

Как использовать мощь приложений UNIX'а, чтобы быстрее оформить лабораторную?

У меня в магистратуре есть один предмет, под названием "Теоретическая информатика", который вернее было бы назвать "Математические методы, применяемые при цифровой обработке сигналов".
В отчетах  по лабораторным этого предмета непременно должны содержаться результаты моделирования изучаемого фильтра сигнала при различных параметрах входного сигнала - то есть куча табличек и графиков. Раньше, я делал все это в Google Docs и у меня уходило много времени на вбивание данных в табличку и щелканье по менюшкам и кнопочкам, чтобы получить графики весьма низкого качества. Кроме того, сам Google Docs добавлял работы, поскольку он не умел копировать данные из своего табличного редактора в текстовый редактор.
Помучившись с оформлением одного отчета, я решил забить на клятый WYSIWYG и вернуться к истокам LaTeX'у и gnuplot'у. Что из этого вышло - читайте дальше.

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

После того, как все данные будут записаны в соответствующие текстовые файлы, нужно написать скрипт для gnuplot'а, который нарисует нам много графиков. Вот содержимое скрипта, написанное мною; его можно легко адаптировать под себя:
Несмотря на кажущуюся сложность, данный скрипт очень простой. Команда set terminal epslatex заставит гнуплот сгенерировать eps-файл с графиком и tex-файл с обвязкой для вставки графика в LaTeX-овский документ. Чтобы указать имя выходного файла для графика используется строка set output "filename.tex", но в итоге, согласно используемому терминалу, будут сгенерированы два файла - filename.tex и filename.eps.
Строки set xlabel "Fs/Fn" font "Droid Sans Mono,12" и set ylabel "SNRout" font "Droid Sans Mono,12" нарисуют на графике подписи к осям X и Y указанным шрифтом. Ну а команда plot нарисует сам график. Эта команда принимает кучу параметров, за подробностями лучше всего обратиться к исчерпывающему мануалу по gnuplot в блоге дебианщика: http://mydebianblog.blogspot.com/search/label/гнуплот. Я лишь отмечу параметр smooth csplines - он позволяет нарисовать линии графика более плавно, а не "топорно" прямо по точкам. Но на графике, построенном по вышеприведенным исходным данным он мне нарисовал график с локальным максимумом в районе десятой отметки по X хотя видно, что график должен постоянно убывать, поэтому данная опция мною практически не используется.
Еще отмечу команды set log y и unset log y - они позволяют включать/отключать построение графиков с логарифмическим масштабом по Y. Я использую этот режим для построения графиков из исходных данных, подобных приведенным выше. В нормальном режиме,  эти графики "прибиты" к координатным осям и ничего не понятно, особенно если несколько линий нарисованы на одной координатной плоскости. При использовании же логарифмического масштаба внешний вид графика гораздо лучше.

Для создания графиков из исходных данных нужно подать наш скрипт на вход гнуплота:
cat laba2-plot.graph | gnuplot
А полученные TeX-файлы следует вставить в документ на LaTeX'е:
\begin{center}
\input{plot2.tex}
\end{center}
 ...и скомпилировать его, предварительно проверив наличие директивы \usepackage{graphicx} в преамбуле документа, иначе LaTeX не поймет желания TeX-файла вставить в документ еще и eps-файл.

Что хорошо, текстовый формат исходных данных позволяет легко вставить их как табличку в документ:

В итоге получаются вот такие красивые графики с соответствующими табличками:
График с нормальным масштабом вдоль осей
А последняя "страшная" конструкция в скрипте дает нам вот такой "мультиграфик" (с логарифмическим масштабом по оси Y):

Для сравнения, вот графики, которые мне генерировал Google Docs:

7 комментариев:

  1. Статья, пронизанная и порождённая неадекватным воинствующим красноглазием, а именно — принципиальным нежеланием использовать для задач софт, предназначенный для их решения.

    ОтветитьУдалить
  2. gnuplot предназначен для рисования графиков и широко используется в научной среде. Латех - для научных статей. В лабораторной своего рода отчет по эксперименту. Что не так? =)

    ОтветитьУдалить
  3. Прикол в том, что мне все равно, сколько у меня исходных данных и какая их длина. Если в следующей лабораторной мне нужно будет сделать 10 графиков для 10 типов фильтров, то я их сделаю с такой же скоростью, как и эти несколько графиков из статьи. Изначальная сложность при написании всех этих скриптов окупается при повторном использовании.
    И почему меня должно заботить негативное впечатление у каких-то там людей? gnuplot и LaTeX вполне естественные инструменты для работы с текстом и графиками. Если кто-то после ворда боится видеть на скриншотах черные буковки и непонятный ему язык разметки, то это не мои проблемы =).

    ОтветитьУдалить
  4. Александр Карпич26 окт. 2011 г., 9:27:00

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

    ОтветитьУдалить
  5. Ты про меня, что ли?
    Речь-то не о том.

    ОтветитьУдалить
  6. Не, я про абстрактных людей, у которых "складывается негативное впечатление о работе с никсами. О них как раз и речь...

    ОтветитьУдалить
  7. Фигасе!

    Блин, получается, что я тоже все делаю не правильно

    Я тоже юзаю gnuplot. У меня тоже полно всяких полевых данных, и по ним мне нужно строить разные графики. Обработку данных я делаю с помощью своих программ, которые написаны на С. Все это дело кручу-верчу под bash-евскими скриптами.

    Чтобы было понятно, с чем я имею дело, вот пара цифирей. Исходные данные -- это одно- и двумерные массивы чисел (1 или 4 столбца),  длина массивов может достигать миллиона строк. Данные жутко зашумлены. Нужна фильтрация, усреднение и т.п. первичная обработка. Это очень длительные операции. Усреднение скользящим окном фильтра (длиной 180000 отсчетов) по всему миллион-точек-массиву занимает около 20 минут. Заметьте, прога написана на С!

    После того, как данные обработаны, нужно построить график (-и). Иногда на этих графиках  можно видеть некие аномалии в данных. Тогда эти графики нужно масштабировать (set xrange). Иногда нужно откинуть начало и конец записей. Ну и т.д.

    Я не буду перечислять всех этих рутинных операций. Я пользуюсь gnuplot-ом и мне в нем комфортно. Комфортно стало, конечно, не сразу. Пришлось изучить инструмент.

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

    Какие "существуют специальные инструменты"? Мне кажется, gnuplot как раз для этого и был создан, а не для того что бы пугать хомячков.

    Да, совсем забыл уточнить -- решение типа пиратская Венда + крякнутый софт не предлагать!

    ОтветитьУдалить