その式に従えば、interp1まったく必要ありません。私があなたの質問を正しく解釈していれば、あなたはF(10k)真剣に計算alpha*F1 + (1-alpha)*F2するだけで得ることができalphaます.[0,1]
の場合、これは で見られる値と でalpha見られる値の間の分数です。あなたの場合、これは次のように簡単です。F1F2
alpha = (ffnew - ff1) / (ff2 - ff1)
ff1とff2は、必要な値の間の価格です。これはffnewです。ffnew = ff1の場合、alpha = 0元のF2曲線が得られることを確認できます。同様に、 の場合ffnew = ff2、alpha = 1元のF1曲線が得られます。F1との間の任意の価格値は、F2指定方法に注意する必要がありますalpha。
したがって、andalphaの場合は次のように なります。ff1 = 9.5kff2 = 11kfnew = 10k
alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3) = 0.33333...
したがって、F1およびがそれぞれおよびF2での曲線であると仮定します。9.5k11k
alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3);
Fnew = alpha*F1 + (1-alpha)*F2;
上記は、信号が同じ長さであることを前提としています。そうでない場合は、小さい方の信号を補間して、大きい方の信号と長さが一致するようにする必要があります。 interp1ここで使用するツールです(IMHO)。からのポイントとしてキー/コントロール ポイントを指定しますF1。ただし、ペアinterp1が必要で、値(x,y)はありませんx....y値はF1. xしたがって、増加する数値ベクトルになるように人為的に値を作成します。私が考えることができる最も単純なものは、1 から小さな信号にあるのと同じ数の値までのベクトルです。信号を拡張するには、1 から小さい方の信号の値までの別のベクトルを生成しますが、linspace.
そのため、次のようなことを試してください。
max_len = max(numel(F1),numel(F2));
F1_interp = interp1(1:numel(F1), F1(:).', linspace(1,numel(F1),max_len));
F2_interp = interp1(1:numel(F2), F2(:).', linspace(1,numel(F2),max_len));
alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3);
Fnew = alpha*F1_interp1 + (1-alpha)*F2_interp2;
コードの最初の行は、信号の 2 つの長さのうち最大のものを見つけます。次に、F1とF2が同じ長さであることを確認します。その効果は、これらの 1 つが変化しないことですが、もう 1 つがより大きな信号に一致するように拡張されます。上記は、何が何であるかに関係なく、両方の信号が同じ長さであることを確認するためのものF1ですF2。これを行うと、上記で説明した操作を新しいシグナルに通常どおり適用できます。