ダウンサンプリングとローパスフィルターのデジタルオーディオへの適用

StackOverflow https://stackoverflow.com/questions/238382

質問

16ビットPCMサンプルの配列として表される、CDから44Khzオーディオストリームを取得しました。私はそれを11KHzストリームにカットしたいです。それ、どうやったら出来るの?何年も前のエンジニアリングクラスの日々から、ストリームが5500Hzを超えるものを正確に記述できなくなることはわかっているので、それ以上のものもすべてカットしたいと思います。何か案は?ありがとう。

更新:このページ単純なアルゴリズムと{1、4、12、12、4、1}のような係数配列を使用して48KHzから8KHzに変換します。私はそれが私が必要とするものだと思いますが、私は6倍ではなく4倍のファクターのためにそれを必要とします。これらの定数がどのように計算されるか考えていますか?また、とにかく16バイトのサンプルを浮動小数点数に変換するので、品質を向上させることができれば、ショートではなく浮動小数点数でダウンサンプリングできます。

他のヒント

信号にローパスフィルタリングを適用する必要があるという点であなたは正しいです。 5500 Hzを超える信号はダウンサンプリングされた信号に存在しますが、別の周波数として「エイリアス」されるため、ダウンサンプリングする前にそれらを削除する必要があります。

フロートを使用してフィルタリングを行うことをお勧めします。固定小数点フィルターアルゴリズムもありますが、一般に機能する品質のトレードオフがあります。あなたがフロートを持っているなら、それらを使用してください!

フィルタリングにDFTを使用するのは一般にやり過ぎであり、dftは連続したプロセスではなくバッファーで機能するため、事態はさらに複雑になります。

デジタルフィルターには、通常2つの好みがあります。 FIRおよびIIR。一般に同じ考えですが、IIFフィルターはフィードバックループを使用して、はるかに少ない係数でより急な応答を実現します。ダウンサンプリングでは、非常に急なフィルタースロープが必要になるため、これは良いアイデアかもしれません。

ダウンサンプリングは、特殊なケースの一種です。 4つのサンプルのうち3つを捨てるので、それらを計算する必要はありません。これには、ポリフェーズフィルターと呼ばれる特別なフィルタークラスがあります。

詳細については、多相IIRまたは多相FIRのグーグルを試してください。

(他のコメントに加えて)シンプルで直感的なアプローチは、4つの連続したサンプルの各グループを平均値で置き換えることにより、4倍にダウンサンプリングすることに注意してください&quot ;、最適ではありませんが、それでも間違っているわけでも、実際的でも概念的でもありません。平均化が正確にローパスフィルター(周波数のsincに対応する長方形のウィンドウ)になるためです。概念的に間違っているのは、4つのサンプルごとに1つだけダウンサンプリングすることです。これは間違いなくエイリアシングを導入します。

ちなみに、実際には何らかのリサンプリングを行うソフトウェア(オーディオ、画像など、オーディオケースの例:sox)はこれを考慮に入れており、基本的なローパスフィルターを頻繁に選択できます。

「エイリアス」を避けるため、信号をダウンサンプリングする前にローパスフィルターを適用する必要があります。ローパスフィルターのカットオフ周波数は、ナイキスト周波数(サンプル周波数の半分)よりも低くする必要があります。

「デシメーション」と呼ばれる後のプロセス。 2つのステップがあります:

  1. データにローパスフィルターを適用します(Pi / 4でカットオフを設定したLPF)。
  2. ダウンサンプリング(4つのサンプルのうち1つを取得する場合)。

ローパスフィルターの設計と適用には多くの方法があります。

ここから開始できます:

http://en.wikipedia.org/wiki/Filter_design

libsamplerate を使用して、面倒な作業を行うことができます。 LibsamplerateはC APIであり、フィルター係数の計算を処理します。品質と速度のトレードオフができるように、さまざまな品質のフィルターから選択できます。

コードを記述しない場合は、 Audacity を使用してサンプルレートの変換を行うことができます。 。強力なGUIを提供し、サンプルレートの変換にlibsamplerateを使用します。

DFTの適用、結果の3/4のチョッピング、逆DFTの適用を試みます。実際にタフなことをせずに、それが良い音になるかどうかはわかりません。

「最高の」実際に可能な解決策はDFTで、周波数の上位3/4を破棄し、逆DFTを実行します。ドメインは下位1/4に制限されています。この場合、上位3/4を破棄するのがローパスフィルターです。 2のべき乗の数のサンプルにパディングすると、おそらく速度が向上します。ただし、FFTパッケージがサンプルを保存する方法に注意してください。複雑なFFT(分析がはるかに簡単で、一般に特性が優れている)の場合、周波数は-22から22または0から44のいずれかになります。最初のケースでは、中央の1/4が必要です。後者では、最も外側の1/4になります。

サンプル値を一緒に平均することにより、適切なジョブを実行できます。サンプルを4つずつ取得し、均等な加重平均を実行する単純な方法は機能しますが、それほど大きくはありません。代わりに、「カーネル」を使用します。非直感的な方法でそれらを一緒に平均化する関数。

数学的には、低周波数帯域外のすべてを破棄することは、周波数空間でボックス関数を乗算することです。 (逆)フーリエ変換は、点ごとの乗算を関数の(逆)フーリエ変換の畳み込みに変換し、逆も同様です。したがって、時間領域で作業する場合は、ボックス関数の(逆)フーリエ変換を使用して畳み込みを実行する必要があります。これは、「sinc」に比例することがわかりました。 function(sin at)/ at、ここでaは周波数空間でのボックスの幅です。したがって、4番目の位置ごとに(4倍にダウンサンプリングしているため)、その近くのポイントを加算し、sin(a dt)/ a dtを掛けることができます。ここで、dtはその位置までの時間の距離です。近くにありますか?まあ、それはあなたがそれが鳴りたいかどうかに依存します。たとえば、最初のゼロ以外のすべてを無視するか、ポイント数をダウンサンプリングの比率とするのが一般的です。

最後に、サンプルの大部分を破棄し、0番目、4番目などを保持するだけの、ちょっとした(しかし高速な)方法があります。

正直、メモリに収まる場合は、DFTルートを使用することをお勧めします。他の人がフィルターの作成を推奨しているソフトウェアフィルターパッケージのいずれかを使用しない場合。

最近 BruteFIR に出会いました。興味がありますか?

ローパスフィルターを適用し(5500 Hzを超える周波数を除去)、デシメーションを適用する必要があります(N番目のサンプルごと、4番目ごとのサンプルを残す)。

デシメーションには、IIRフィルターではなくFIRが通常使用されます。これは、以前の出力に依存しないため、破棄されたサンプルについて何も計算する必要がないためです。一般に、IIRは入力と出力の両方に依存するため、特定のタイプのIIRを使用しない限り、3/4を破棄する前にすべての出力サンプルを計算する必要があります。

このテーマに関するイントロレベルの記事をGoogleで検索しました: https:// www。 dspguru.com/dsp/faqs/multirate/decimation

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top