0

私はさまざまな速度で読み取ることができるオーディオ ストリームを実装するクラスを持っています (逆方向と高速の変化/「スクラッチ」を含む)...読み取り部分に線形補間を使用し、すべてが適切に機能します..

しかし、現在、さまざまな速度でストリームへの書き込みも実装したいので、一種の「逆補間」を実装する必要があります。つまり、入力サンプルベクトル Z を推定し、ベクトル Y で補間すると、出力 X が生成されます (これは私が' m を書き込もうとしています)。

私は一定の速度でそれを行うことができましたが、さまざまな速度(加速または減速など)の一般化はより複雑であることが証明されています..

この問題は繰り返し解決されていると思いますが、オンラインで多くの手がかりを見つけることができないようです.解決 :)

ありがとう!

4

1 に答える 1

0

それは存在しないので、私はそれを「逆補間」とは呼びません(私の最初の考えは、あなたが外挿について話しているということでした!)。あなたがしていることは、まだ不均一な速度での単純な補間です。

内挿: 既知の値の間の値を見つける 外挿: 既知の値を超える値を見つける

一定レートへの/からの補間は、「既知の値の間の値を見つける」という一般的な探求よりもはるかに簡単です。2つの解決策を提案します。

1) 非常に高いレートに補間し、最も近いレートにサブサンプリングします (ディザリングを追加してみてください)。

2) 一般的な問題を解決します。各点について、隣接する N 個の点を使用し、N-1 次の多項式をそれらに適合させる必要があります。

  • N=2 は線形になり、倍音を追加します (C0 連続性)
  • N=3 では、ソース サンプルの中間点で段階的な変化が生じる可能性があります (おそらく、N=2 よりも悪い倍音です!)
  • N=4 で C1 連続性が得られます (次のサンプルに変更すると勾配が一致します)。アプリケーションには十分です。

その最後のものを説明しましょう。

出力サンプルごとに、前の 2 つと次の 2 つの入力サンプルを使用します。それらを単位時間スケールで S0 から S3 と呼び (後でサンプル期間を掛けます)、時間 0 から 1 に補間します。Y は出力で、Y' は勾配です。

Y は、この多項式とその微分 (勾配) から計算されます。

    Y(t) = At^3 + Bt^2 + Ct + D
    Y'(t) = 3At^2 + 2Bt + C

制約 (両側の終点での値と勾配)

    Y(0) = S1
    Y'(0) = (S2-S0)/2
    Y(1) = S2
    Y'(1) = (S3-S1)/2

多項式の展開

    Y(0) = D
    Y'(0) = C
    Y(1) = A+B+C+D
    Y'(1) = 3A+2B+C

サンプルを接続する

    D = S1
    C = (S2-S0)/2
    A + B = S2 - C - D
    3A+2B = (S3-S1)/2 - C

最後の 2 つは、簡単に解ける連立方程式です。2 番目から 1 番目の 2 倍を引きます。

    3A+2B - 2(A+B)= (S3-S1)/2 - C - 2(S2 - C - D)
    A             = (S3-S1)/2 + C - 2(S2 - D)

するとBは

    B = S2 - A - C - D

A、B、C、D を取得したら、多項式に時間 't' を入れて、既知のサンプル間のサンプル値を見つけることができます。

出力サンプルごとに繰り返します。次の出力サンプルがまだ同じ 2 つの入力サンプルの間にある場合は、A、B、C、D を再利用します。毎回 t を計算することは、ブレゼンハムのライン アルゴリズムに似ており、毎回異なる量だけ進んでいます。

于 2013-12-16T09:33:26.183 に答える