こんにちは、みんな!
Y カーブは、他の 3 つのカーブの合計です。
具体的な式は次のとおりです: Y = 最大値 + 中間値 + 最小値 + 10
Y だけがわかっている場合は、「最大」、「中間」、「最小」の 3 つのカーブを復元する必要があります。
調べてみたらフーリエ変換でできるようです。
この復元を実現するための JMP に対応するモジュールがあるかどうかを尋ねたいと思います。

他の 3 つの曲線の Excel 式は次のとおりです。
min=ROUND(2*SIN(80*RADIANS(:x)+RADIANS(7)),10)+2
mid=ROUND(3*SIN(21*RADIANS(:x)+RADIANS(8)),10)+3
max=ROUND(4*SIN(5*RADIANS(:x)+RADIANS(64)),10)+4
ありがとう!
Craige FFT 分析によれば、実際の曲線はさらに多くの曲線に分割される必要があります。
FITモデルでパラメータを調整する方法がわかりません。
ありがとう!

私はこの分野で学び始めたばかりです。実際のデータに切り替えるのはそれほど簡単ではありません。
FFT、FITモデル、時系列を試してみました。

正しいアプローチを採用しなかったのですが、
トラブルの専門家は引き続き私を指導してくれました。
専門家に感謝します!
マークベイリーさん、ありがとう!
JMP は非常に強力ですが、私はほとんど使用しません。
パラメトリック モデルを列式として定義できます。 この場合のモデルは、3 つの正弦関数と定数の合計です。 開始値とともに数式エディターでパラメーターを定義します。 (特に三角関数の場合、開始値が重要であることに注意してください。) 次のようになります。

非線形プラットフォームのソリューションは次のようになります。

度からラジアンへの変換を含む修正された JMP データ テーブル、モデル式、および非線形を起動するためのテーブル スクリプトを添付しました。
ありがとうマークベイリー!
スクリプトを探して操作してみますが、やり方が分かりません。サンプルを教えてください。
ご協力ありがとうございました!
非線形プラットフォームを使用して、3 つの三角関数の合計であるカスタム モデルを適合させることもできます。
Craige の具体的な指導と Markbailey の助けに感謝します。
プロジェクトを完了する方法の全体像を把握するため。また、JMP がこの分解を達成できることも証明します。
クレイジさんに聞き続けたいのですが:
実際には一連のデータ Y があるとしても、その具体的な構成がいくつかの曲線であることはわかりません。
ただし、この Y を 3 つまたは 4 つの元の曲線に分解したいだけです。
各カーブのさまざまなパラメータを最大限に復元する方法。そしてもちろん、DC は復元できないことはご存知でしょう。
どうもありがとうございます!
3 つの元のカーブと 4 つのカーブを復元できるかどうかを確認してください。
データを関数として扱い、必要な情報を識別するために関数の主成分を使用できることに利点があるのではないかと思います。
見るFDEヘルプ。
何を回復したいと思っていますか?
- 周波数/振幅
- 段階
- DCオフセット
3 つの周波数成分と振幅成分 (80、21、5、および 2、3、4) を復元することは、FFT 関数を使用すると簡単ですが、現実世界のデータではさらに複雑になります。 見るFFTとDTMF古い例として。 位相を回復するのは難しいようです。 以下の私の実験では、バッファ長が波形の周期と完全に一致していれば (7,8,64) が回復しますが、そうでない場合は位相情報が失われる可能性があると思います。 (私はこの問題の専門家ではありません。) 個々の DC オフセットはすべて加算されるため、それらを回復することは不可能です。
この JSL は、使用する前にさらに多くのテストが必要です。
RADIANS = Function( {x}, 2 * Pi() * x / 360 );
NSAMPLES = 360; // 360 makes the answer look perfect. Real-world data will change everything for the worse...
time = NSAMPLES/360; // number of seconds the table holds
dt = New Table( "Untitled 4",
Add Rows( NSAMPLES ),// generate perfect, non-real world data
New Column( "x", formula( Row()-1 ) ), // time axis, in degrees
// not sure why you would round this to 10 places, but it was part of the question...
// adding 7 degrees is a phase adjustment, multiplying by 2 is an amplitude adjustment
// adding 2+3+4 at the end is the DC level of 9. You'll never get those individual values back, just the 9.
New Column( "min", formula( Round( 2 * Sin( 80/*Hz*/ * RADIANS( :x ) + RADIANS( 7/*degrees*/ ) ), 10 ) + 2 ) ),
New Column( "mid", formula( Round( 3 * Sin( 21/*Hz*/ * RADIANS( :x ) + RADIANS( 8/*degrees*/ ) ), 10 ) + 3 ) ),
New Column( "max", formula( Round( 4 * Sin( 5/*Hz*/ * RADIANS( :x ) + RADIANS( 64/*degrees*/ ) ), 10 ) + 4 ) ),
New Column( "combine", formula( min + mid + max ) )
);
dt << Graph Builder( Size( 1275, 240 ), Show Control Panel( 0 ), Variables( X( :x ), Y( :combine ) ), Elements( Line( X, Y, Legend( 11 ) ) ),
SendToReport( Dispatch( {}, "graph title", TextEditBox, {Set Text( "Original Data" )} ) ) );
// there are NSAMPLES and there will be NSAMPLES bins in the FFT result.
// the first half of the bins are interesting, 1..(NSAMPLES/2), the 2nd half mirror them.
// the lowest bin, 1, will represent the DC offset
// The bins 1-(NSAMPLES/2) are equal width in frequency; the maximum frequency is
// NSAMPLES/2 full cycles in a buffer (or (NSAMPLES/2) radians per buffer)
// (you know how much time a buffer represents, so you can get back to Hz)
freq = (((1 :: (NSAMPLES / 2)) - 1) / time)`; // cycles per second for each bin
{real, complex} = FFT( {dt[0, "combine"]} );
amplitude = Sqrt( real ^ 2 + complex ^ 2 );
dt2 = As Table( freq || (amplitude[1 :: (NSAMPLES / 2)]) );
dt2 << Graph Builder(
Size( 1456, 289 ),
Show Control Panel( 0 ),
Variables( X( :Col1 ), Y( :Col2 ) ),
Elements( Points( X, Y, Legend( 7 ) ) ),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( "Recovered Data" )} ),
Dispatch( {}, "X title", TextEditBox, {Set Text( "Hz" )} ),
Dispatch( {}, "Y title", TextEditBox, {Set Text( "Relative Amplitude" )} )
)
);
// At this point the min/mid/max are recovered. Do you need the phase too?
//
// ** I'm not confident this produces a useful answer. The answer appears
// correct for the simulated data with the perfect match to the sample
// buffer, BUT if the buffer is slightly bigger or smaller, the phases
// do not seem related to the original phases. **
//
// I *think* it is necessary to add 90 degrees below because you are using sin
// and fft uses cos. You should study that a bit more.
// I *think* the amplitude*2 vs amplitude*1 is because half of the non-DC
// samples are thrown away. You should study that a bit more too.
For( i = 1, i <= N Rows( freq ), i += 1,
amp = Round( If( i == 1, 1, 2 ) * amplitude[i] / NSAMPLES, 3 );
If( amp > .7, // this will need tweaking
Write( "\!n", freq[i], " Hz \!tAmplitude=", amp, " units \!tphase=",
90 + Round( 360 * ATan( complex[i], real[i] ) / (2 * Pi()), 3 ), " degrees"
)
);
);
Open Log( 1 );
Two graphs and some output in the log.Two graphs and some output in the log.2 つのグラフとログの一部の出力。
FFT のゼロ周波数ビン (JSL の要素 1) は、DC と呼ばれます。これは、DC が (交流、AC とは対照的に) 直流を意味するためです。 AC はすべて別の箱にあります。 AC 信号は DC レベルだけゼロからオフセットされます。 上記のログでは、0 Hz DC ビンの位相角は 90 度であると主張されています。 それは何の意味もありません。
より典型的な結果は次のとおりです。
When the wave form's period does not match the buffer length the results are spread across many bins and the phase is probably lost.When the wave form's period does not match the buffer length the results are spread across many bins and the phase is probably lost.波形の周期がバッファ長と一致しない場合、結果は多くのビンに分散され、位相が失われる可能性があります。