0

そのため、現在、matlab でブロック畳み込みのオーバーラップ保存方法を実装していますが、そうするのに問題があります。

私の実装では、入力データをベクトルでリアルタイム処理するために、バッファリングされた入力を使用しています。入力はオーバーラップ保存クラスのインスタンスに供給され、事前定義されたブロック長 (フィルター長よりも大きい) よりも多くの入力でバッファーがいっぱいになると、入力はチャンク (ブロック長のサイズ) で処理されます。バッファ内のデータの長さがブロックの長さよりも小さくなるまで、標準のオーバーラップ保存アルゴリズムを使用します。その後、待機してさらにデータが入ってくるのを待ち、プロセスを繰り返します。

すべてが正常に機能しているように見えますが、問題は、すべての入力がクラスに渡された後にバッファをフラッシュすることです。フラッシュ メソッドが呼び出されると、バッファ内のデータは常にブロック サイズよりも少なく、残りのデータの処理に問題があります。

クラスが通常のデータを処理した後、後続のデータのアルゴリズムの「重複」部分を維持するために、入力から最後の N-1 (N はフィルターの長さ) のデータ ポイントを保持することにも注意してください。または最終フラッシュ。

私の質問は、flush() が呼び出されたときにバッファ内の残りのデータをどのように処理すればよいですか? 単純にゼロパディングしてフィルターで畳み込みを試みましたが、ガベージ出力が生成されます...何か提案はありますか?

注: フラッシュの出力は、通常のデータ ブロックの処理の出力に追加する必要があり、この新しい出力は、matlab の conv(input, filter) の出力と一致する必要があります。

4

1 に答える 1

0

これは非常に一般的な質問なので、非常に一般的な答えを言います。フラッシュの概念そのものが、入力が終了したことを意味します。入力信号が終了した後にプロセッサがどのように動作するかを決定したら、それをコーディングできます。ゼロは一般的なアプローチであるため、ゼロパディング(正しい答えだと思います)の試みには他の欠陥があったとしか思えません。または、信号が単にピークで終了し、ゼロ パディングによって急激な遷移が発生した可能性があります。その場合、最後の値を繰り返すことは、ゼロパディングよりも良い解決策かもしれません.

于 2012-06-01T18:39:30.587 に答える