2009-09-19 2 views
4

Я пытаюсь найти способ алгоритмически получить амплитуду и фазу функции, которая имеет синусоидальные члены в системе компьютерной алгебры Maxima. Это относится только к установившемуся состоянию (при t -> бесконечности и распаду переходных процессов). Например, тривиальный случай был бы:Алгоритмически получить амплитуду и фазу синусоидальной волны?

f(t) = 1/w * sin(w * t + theta) + exp(-a * t) + 8 

В этом случае коэффициент усиления будет 1/ш, то фазовый сдвиг будет тета, и мы будем игнорировать переходный термин ехр (-а * т), потому что мы заботимся только об устойчивом усилении и фазовой задержке, а exp (-a * t) -> 0 при t -> бесконечности. Мы также будем игнорировать термин «+ 8», потому что это просто смещение по постоянному току. То, как меня учили делать это в моих инженерных классах, требует много эвристики и утомительной перестройки уравнений, чтобы получить их в форме, подобной приведенной выше, где ответ очевиден, просто взглянув на него.

Кто-нибудь знает об общем алгоритмическом методе нахождения коэффициента усиления и фазовой задержки, предполагая, что они существуют, учитывая, что у меня есть полная система компьютерной алгебры (и стандартные функции, которые можно было бы ожидать от CAS) бросить на это? Хотя я, вероятно, буду реализовывать его в Maxima, я бы, конечно, оценил общие ответы, объясняемые только с точки зрения математики.

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

+1

Поскольку этот вопрос является довольно dsp-niche, вы можете попросить здесь http://www.kvraudio.com/forum/viewforum.php?f=33 и затем ответьте на вопрос самостоятельно ответом для будущих читателей SO. – Nosredna

ответ

7

Вы имеете в виду символически или численно?

Численно вы хотите выполнить Fourier transform:

  • Sample функцию для по меньшей мере в два раза ожидаемой максимальной частоты (даже выше, если вы хотите более точное измерение фазы) и до тех пор, по крайней мере, ваша максимальная ожидаемая длина волны

  • выполнить transfomr Фурье (поиск БПФ должно оказаться много примеров - мои поиски предполагают, что максимумы могут даже встроенную функцию FFT)

  • это даст вам «частотную область» версии вашей функции. У вас будет ряд комплексных значений, где величина - это амплитуда этой частоты, а угол - фаза этой частотной составляющей. В вашем случае это звучит, как вы хотите, чтобы искать frequeny с максимальной амплитудой

1

Это может или не может быть идеальным, но я предполагаю, что вы не можете выполнить любую математику на функцию генерации формы сигнала (или функция недоступна) -

Я бы опробовал волну с интервалами, значительно меньшими периода. Это, вероятно, сложно - вам наверняка нужно знать, что peirod волны больше интервала выборки, но вы не хотите, чтобы он был слишком маленьким, или навсегда понадобится закончить несколько циклов волны. Возможно, вы можете начать выборку с минимальным значением и развернуть ее до тех пор, пока значение не изменится с некоторой приемлемой скоростью.

Если вы сделаете это, вы можете сдвинуть волну в центр на оси X (путем вычитания или добавления среднего значения) и определить 1) Минимальные/максимальные значения, которые обеспечивают амплитуду и 2) X-перехваты , который обеспечивает период.

+0

См. редактирование исходного вопроса. Идея состоит в том, что у меня есть функция генерации, но в некоторой громоздкой форме, которая может быть чрезвычайно утомительной для преобразования вручную во все, очевидный – dsimcha

1

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

0

Подумав об этом некоторое время, я сам это понял. Я отправлю его здесь, потому что это довольно интересно. Предполагаются следующие предположения:

  1. Сигнал существует бесконечно, поэтому все находится в устойчивом состоянии.
  2. Ваше выражение имеет только одну частоту. Это легко проверить только осмотром, даже если он находится в какой-то ужасно сложной форме. Например, вы не можете иметь sin (w1 * t) + sin (w2 * t), иначе это не сработает.
  3. Вы знаете, как обозначаются переменные частоты и времени.
  4. У вас есть достойная система компьютерной алгебры и все стандартные функции, которые идут с ней.

алгоритм, при этих предположениях, является:

  1. Возьмет преобразование Лапласа. На практике это тривиально, так как большую часть времени, когда вы сталкиваетесь с такими проблемами, ваш ответ изначально находится в домене Laplace, и вы в конечном итоге переходите обратно во временную область, чтобы получить выражение с синусоидальной волной. Даже если нет, у приличного CAS уже будет зрелая функция преобразования Лапласа.
  2. Разделите преобразование Лапласа sin (w * t). (Предполагая, что вы используете w для частоты и t для времени). Это дает вам функцию переноса, то есть константу области Лапласа, которую умножает входная синусоидальная волна.
  3. Поскольку t -> бесконечность, то есть для сигналов, которые существовали бесконечно, переменная Laplace s эквивалентна i w, поэтому, просто подставив i w для s, вы получите передаточную функцию в частотной области, в действительности преобразование Фурье передаточной функции.
  4. Для синусоидальной волны w коэффициент усиления представляет собой комплексное абсолютное значение передаточной функции. (Комплексное абсолютное значение - это расстояние некоторого комплексного числа от начала координат в комплексной плоскости, sqrt (realpart (my_number)^2 + imagpart (my_number)^2).
  5. Смещение фазы просто arctan (imaginarypart (transferFunction))/realpart (transferFunction))
Смежные вопросы