その式に従えば、interp1
まったく必要ありません。私があなたの質問を正しく解釈していれば、あなたはF(10k)
真剣に計算alpha*F1 + (1-alpha)*F2
するだけで得ることができalpha
ます.[0,1]
の場合、これは で見られる値と でalpha
見られる値の間の分数です。あなたの場合、これは次のように簡単です。F1
F2
alpha = (ffnew - ff1) / (ff2 - ff1)
ff1
とff2
は、必要な値の間の価格です。これはffnew
です。ffnew = ff1
の場合、alpha = 0
元のF2
曲線が得られることを確認できます。同様に、 の場合ffnew = ff2
、alpha = 1
元のF1
曲線が得られます。F1
との間の任意の価格値は、F2
指定方法に注意する必要がありますalpha
。
したがって、andalpha
の場合は次のように なります。ff1 = 9.5k
ff2 = 11k
fnew = 10k
alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3) = 0.33333...
したがって、F1
およびがそれぞれおよびF2
での曲線であると仮定します。9.5k
11k
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
。これを行うと、上記で説明した操作を新しいシグナルに通常どおり適用できます。