そのため、現在、matlab でブロック畳み込みのオーバーラップ保存方法を実装していますが、そうするのに問題があります。
私の実装では、入力データをベクトルでリアルタイム処理するために、バッファリングされた入力を使用しています。入力はオーバーラップ保存クラスのインスタンスに供給され、事前定義されたブロック長 (フィルター長よりも大きい) よりも多くの入力でバッファーがいっぱいになると、入力はチャンク (ブロック長のサイズ) で処理されます。バッファ内のデータの長さがブロックの長さよりも小さくなるまで、標準のオーバーラップ保存アルゴリズムを使用します。その後、待機してさらにデータが入ってくるのを待ち、プロセスを繰り返します。
すべてが正常に機能しているように見えますが、問題は、すべての入力がクラスに渡された後にバッファをフラッシュすることです。フラッシュ メソッドが呼び出されると、バッファ内のデータは常にブロック サイズよりも少なく、残りのデータの処理に問題があります。
クラスが通常のデータを処理した後、後続のデータのアルゴリズムの「重複」部分を維持するために、入力から最後の N-1 (N はフィルターの長さ) のデータ ポイントを保持することにも注意してください。または最終フラッシュ。
私の質問は、flush() が呼び出されたときにバッファ内の残りのデータをどのように処理すればよいですか? 単純にゼロパディングしてフィルターで畳み込みを試みましたが、ガベージ出力が生成されます...何か提案はありますか?
注: フラッシュの出力は、通常のデータ ブロックの処理の出力に追加する必要があり、この新しい出力は、matlab の conv(input, filter) の出力と一致する必要があります。