Генератор периодических функций для Linux - PullRequest
2 голосов
/ 12 мая 2011

В моей работе мне нужны образцы математических функций в виде текстовых потоков.Например, мне нужна программа, которая генерирует значения функции синуса в отдельные моменты времени и печатает их в stdout.Затем мне нужно объединить эти образцы в некоторой форме, например, суммировать два образца, сдвинутые на какую-то фазу.Так что я могу разделить мой вопрос на два:

  1. Существует ли довольно стандартный способ генерирования выборок математической функции, такой как синус, с заданными параметрами - частотой, фаза, амплитуда, шаг по времени - в виде простого текстового потока с двумя столбцами: время и значение функции?Я знаю, что этот простой скрипт в Perl / Tcl может выполнить эту работу, но я хотел бы знать общее решение.

  2. Какими программами можно манипулировать этими потоками?Я знаю о awk, но что я могу сделать с awk, когда у меня есть несколько потоков в качестве входа?Например, как я могу сделать сумму или произведение двух или трех синусоидальных сэмплов?

Я использую Debian Linux и предпочитаю The Unix Way , когдакаждая программа выполняет только простую задачу и выполняет ее отлично, а результаты отдельных программ могут быть объединены другой программой.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 12 мая 2011

Вы можете делать простые числовые вычисления с bc.Смотрите справочную страницу.Более сложные вычисления могут быть выполнены с помощью octave, который является бесплатным клоном Matlab.

Например, для этого вычисляются значения интервала:

$ octave -q --eval 'printf ("%f\n", [0:0.1:pi/2])'|nl|tee x.txt
 1  0.000000
 2  0.100000
 3  0.200000
 4  0.300000
 5  0.400000
 6  0.500000
 7  0.600000
 8  0.700000
 9  0.800000
10  0.900000
11  1.000000
12  1.100000
13  1.200000
14  1.300000
15  1.400000
16  1.500000

Это вычисляет значения sin:

$ octave -q --eval 'printf ("%f\n", sin([0:0.1:pi/2]))'|nl|tee y.txt
 1  0.000000
 2  0.099833
 3  0.198669
 4  0.295520
 5  0.389418
 6  0.479426
 7  0.564642
 8  0.644218
 9  0.717356
10  0.783327
11  0.841471
12  0.891207
13  0.932039
14  0.963558
15  0.985450
16  0.997495

И команду join можно использовать для объединения двух файлов:

$ join -1 1 -2 1 -o 1.2 2.2 x.txt y.txt 
0.000000 0.000000
0.100000 0.099833
0.200000 0.198669
0.300000 0.295520
0.400000 0.389418
0.500000 0.479426
0.600000 0.564642
0.700000 0.644218
0.800000 0.717356
0.900000 0.783327
1.000000 0.841471
1.100000 0.891207
1.200000 0.932039
1.300000 0.963558
1.400000 0.985450
1.500000 0.997495

Но, вероятно, лучше остаться в Octave для всего вычисления:

$ octave -q --eval 'for x = .1:0.1:pi/2 ; printf ("%f %f\n", x, sin(x)); end'
0.100000 0.099833
0.200000 0.198669
0.300000 0.295520
0.400000 0.389418
0.500000 0.479426
0.600000 0.564642
0.700000 0.644218
0.800000 0.717356
0.900000 0.783327
1.000000 0.841471
1.100000 0.891207
1.200000 0.932039
1.300000 0.963558
1.400000 0.985450
1.500000 0.997495
3 голосов
/ 12 мая 2011

Общие программы обработки текста, которые были бы полезны:

  • вставка или объединение (объединение двух файлов вместе)
  • объединить (Операции с заданным набором над строками в файлах)
  • столбец (удалить столбцы)
  • сортировка (общая сортировка)
  • sed (Поиск и замена и другие команды ed)
  • grep (Поиск)
  • awk (Общая обработка текста)
  • тройник (Т-образный переход. Хотя, если вам это нужно, вы, вероятно, делаете что-то слишком сложное и должны его сломать.)

Я не вижу проблем с использованием сценария perl для генерации значений.Конечно, можно использовать сценарий bc .

1 голос
/ 12 мая 2011

Вы смотрели на вс ?

...