ストリーミングオーディオのフィルタリング


9

103データポイント()のようなものが与えられると、DFTは103周波数値を返します。次に、高周波のフィルタリングなどを行うには、DFTの高周波値をゼロに設定し、逆DFTを実行して、高周波のない元の信号を表す103データポイントを取得します。N=103

これは、103のすべてのデータポイントを一度に与えた場合、私には意味があります。しかし、かなり大きいオーディオWAVファイルのストリーミングについてはどうでしょう(たとえば、)。高周波をフィルタリングしたい場合は、10 5ポイントのデータ全体について説明したアプローチが論理的に理にかなっています。しかし、再生のためにWAVファイルをストリーミングする場合、これは妥当ではありません。オーディオファイルのストリーミング再生を高周波フィルター処理するにはどうすればよいですか?N=105105

回答:


12

FFT->係数のゼロ化-> IFFTはフィルタリングを行う正しい方法ではありません。そうすることで実現される実際のフィルターは、特性が不十分です。

信号をフィルタリングする正しい方法は、デジタルフィルターの係数を計算することです。これは、フィルター設計と呼ばれ、多数のソフトウェアツール/ドキュメントが利用できるプロセスであり、入力シーケンスに適用します。つまり、これは、各サンプルについて、過去の入力サンプルと過去の出力サンプルの線形結合を評価することです。阻止帯域の除去/リップルに関するフィルターの要件によっては、必要な係数がわずかであるため、FFTよりもはるかに効率的です。出力サンプルの計算に必要な情報は過去のいくつかの入出力サンプルだけなので、ストリーミングオーディオに適用しても問題はありません。

FIRフィルターを使用することを決定した場合、およびフィルター要件により非常に多くの係数がフィルターに含まれる場合にのみ、FFTを使用する必要があります。この特定のケースでは、FFTとoverlay-addを使用して、入力データの連続するブロックにフィルターを適用すると効率的です。


8

信号ストリームに周波数領域フィルタリングを適用する最良の方法は、オーバーラップアド(または関連するフレーバーオーバーラップセーブ、ブロックコンボルバーなど)です。

基本的に、一度に1つのフレームを取り込みます(たとえば、1024サンプル)。長さの2倍(2048)にゼロパッドし、FFTを実行し、フィルターの(これもゼロパッドされた)伝達関数と乗算し、逆FFTを実行します。最後の1024サンプルを次のフレームのオーバーラップとして保存し、前のフレームのオーバーラップに最初の1024サンプルを追加すると、これが出力になります。1024の入力サンプルごとに1024の出力サンプルが得られ、ストリームが完了するまで次のフレームでこれを繰り返すだけです。

周波数領域での乗算は循環たたみ込みを実装し、ほとんどのアプリケーションで本当に線形たたみ込みが必要なため、ゼロパディングとオーバーラップを伴うビジネス全体が必要です。

異なるウィンドウ関数とオーバーラップを使用するこれらのメソッドのバリアントがありますが、それはすべて同じ原則です:小さなチャンクに切り分け、一度に1つのチャンクを処理します。


これの詳細を書いた本はありますか?
user782220 2012

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.