2

I have several equations and each have their own individual frequencies and amplitudes. I would like to sum the equations together and adjust the individual phases, phase1,phase2, and phase3 to keep the total amplitude value of eq_total under a specific value like 0.8. I know I can normalize the signal or change the vertical offset, but for my purposes I need to have the amplitude controlled by changing/finding the values for just the phases in phase1,phase2, and phase3 that will limit the maximum amplitude when the equations are summed.

Note: I'm using constructive and destructive phase interference to adjust the maximum amplitude of the summed equations.

Example:
eq1=0.2*cos(2pi*t*3+phase1)+vertical offset1
eq2=0.7*cos(2pi*t*9+phase2)+vertical offset2
eq3=0.8*cos(2pi*t*5+phase3)+vertical offset3

eq_total=eq1+eq2+eq3

位相 1、位相 2、および位相 3 の値を調整/検索するだけで、eq_total の合計信号の振幅が 0.8 を超えないように、位相 1、位相 2、および位相 3 を解決する方法はありますか?

これは、このアイデアをテストした geogebra アプレットの写真です。

ここに画像の説明を入力

これは、アイデアの編集/テストに使用した geogebra ggb ファイルです。(これを使用して、私のアイデアが機能するかどうかを確認しました)アプレットと動的にやり取りする場合は、Java が必要です http://dl.dropbox.com/u/6576402/questions/ggb/sin_find_phases_example.ggb

私は matlab/octave を使用しています ありがとう

4

3 に答える 3

1

あなたの例

eq1=0.2*cos(2pi*t*3+phase1)+vertical offset1
eq2=0.7*cos(2pi*t*9+phase2)+vertical offset2
eq3=0.8*cos(2pi*t*5+phase3)+vertical offset3

eq_total=eq1+eq2+eq3

最大振幅が 0.8 未満でなければならない場合、無限に多くの解があります。達成したい追加の目的がない限り、正確に0.8 (または 0.79)の最大振幅を持つ位相角の組み合わせを見つけるように問題を修正することをお勧めします。 )。

さらに、3 つの位相角のうち 2 つだけが独立しています。たとえば だけすべてを増やしてもpi/3、解は成立します。したがって、 には 2 つの未知数しかありませんeq_total

FMINSEARCHなどを使用して、非線形最適化問題を解くことができます。max(abs(eq_total(phase1,phase2)))が0.79になるように問題を定式化します。

したがって:

%# define the vector t, verticalOffset here

%# objectiveFunction is (eq_total-0.79)^2, so the phase shifts 1 and 2 that
%# satisfy this (approximately) should guarantee that signal never exceeds 0.8
objectiveFunction = @(phase)(max(abs(0.2*cos(2*pi*t+phase(1))+0.7*cos(2*pi*t*9+phase(2))+0.8*cos(2*pi*t*5)+verticalOffset)) - 0.79)^2;
%# search for optimal phase shift, starting at no shift
solution = fminsearch(objectiveFunction,[0;0]);

編集

残念ながら、このコードを試して結果をプロットすると、最大振幅は 0.79 ではなく、1 を超えています。何か間違っていますか? 以下のコードを参照してください t=linspace(0,1,8000); 垂直オフセット = 0; ObjectiveFunction = @(位相)(最大(abs(0.2*cos(2*pi*t+位相(1))+0.7*cos(2*pi*t*9+位相(2))+0.8*cos(2) *p‌ i*t*5)+verticalOffset)) - 0.79)^2; s1 = fminsearch(objectiveFunction,[0;0]) eqt=0.2*cos(2*pi*t+s1(1))+0.7*cos(2*pi*t*9+s1(2))+0.8* cos(2*pi*t*5)+verticalOffset; プロット(式)

fminsearch目的関数の最小値を見つけます。このソリューションがすべての条件を満たしているかどうかは、テストする必要があります。この場合、fminsearch開始値でによって与えられる解[0;0]は最大 ~1.3 となり、これは明らかに十分ではありません。ただし、0 から 2pi までの位相角の範囲の最大値をプロットすると、`fminsearch が悪い局所最小値で動けなくなっていないことがわかります。むしろ、良い解決策はまったくありません (z 軸が最大)。

ここに画像の説明を入力

于 2011-10-17T14:59:12.157 に答える
0

私があなたを正しく理解しているなら、あなたは信号の振幅を変化させる位相を見つけようとしています。私の知る限り、これは不可能です。 信号の場合

s = A * cos (w*t + phi)

振幅を変更することしかAできません。w信号の周波数を変更し、「水平シフト」を調整phiします。

さらに、上記の式の時間のような「移動変数」が欠落していると思いますt

たぶん、この記事は物事を少し明確にします。

于 2011-10-17T06:09:04.660 に答える
0

すべての垂直オフセットを -1 に設定すると、それぞれeq#が > 0 になることはなく、合計が > 0.8 になることはないため、問題は解決します。

これがあまり役に立たないことはわかっていますが、これが問題をよりよく理解するのに役立つことを願っています.

于 2011-10-17T09:56:46.977 に答える