みなさん、こんにちは!
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
ありがとう!
何を回復したいですか?
- 周波数/振幅
- 段階
- DCオフセット
FFT関数を使用すると、3つの周波数成分と振幅成分(80、21、5と2、3、4)を簡単に復元できますが、実際のデータでは複雑になります。見る 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 );
2つのグラフとログの一部の出力。
FFTのゼロ周波数ビン(JSLの要素1)はDCと呼ばれます。これは、DCが(交流、ACではなく)直流を意味するためです。すべてのACは他のビンにあります。AC信号は、DCレベルによってゼロからオフセットされます。上記のログでは、0 Hz DCビンは90度の位相角を持っていると主張しています。それは何も意味しません。
より典型的な結果:
波形の周期がバッファ長と一致しない場合、結果は多くのビンに分散され、おそらく位相が失われます。
データを関数として扱い、必要な情報を特定するために機能原理のコンポーネントを使用できるかどうか、何かメリットがあるのではないでしょうか。
見る FDE 助けて。
Craige固有のガイダンスとmarkbaileyの支援に感謝します。
プロジェクトを完了する方法の全体像を説明します。また、JMPがこの分解を実行できることも証明します。
私はクレイジに尋ね続けたいです:
実際に一連のデータYの場合、その具体的な構成がいくつかの曲線としてわからない。
しかし、このYを3つまたは4つの元の曲線に分解したいだけです。
各曲線のさまざまなパラメーターのほとんどを復元する方法。もちろん、DCを復元できないことはご存じでしょう。
3つの元の曲線と4つの曲線を復元できるかどうかを確認します。
また、非線形プラットフォームを使用して、3つのトリガー関数の合計であるカスタムモデルを近似することもできます。
Markbaileyさん、ありがとう!
スクリプトを探して操作してみたのですが、どうすればいいのかまだ分かりません。
ご協力ありがとうございました!
パラメトリックモデルを列式として定義できます。この場合のモデルは、3つの正弦関数と定数の合計です。パラメータは式エディタで開始値とともに定義します。(特に三角関数の場合は、開始値が重要です。)次のようになります。

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

度数からラジアンへの変換を含む変更されたJMPデータテーブル、モデル式、およびNonlinearを起動するためのテーブルスクリプトを添付しました。
マークベイリーに感謝!
JMPは非常に強力で、私はほとんど使用していません。
私はこの分野で学び始めたばかりです。実際のデータに切り替えるのはそれほど簡単ではありません。
FFT、FITモデル、時系列を試しました。

私は正しいアプローチをオンにしませんでした、
トラブルの専門家が私を導き続けました。
エキスパートに感謝!
Craige FFT分析によると、実際の曲線はより多くの曲線に分割する必要があります。
FITモデルでパラメーターを調整する方法がわかりません。
ありがとう!
