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: