13

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

更新:このページには、単純なアルゴリズムと { 1, 4, 12, 12, 4, 1 } のような係数配列を使用して 48KHz から 8KHz に変換するコードがいくつかあります。それが必要だと思いますが、6倍ではなく4倍にする必要があります。これらの定数がどのように計算されるか考えていますか? また、最終的には 16 バイトのサンプルを float に変換することになるので、ショートではなく float でダウンサンプリングを行うことができます。

4

10 に答える 10

10

FIR および IIR フィルターを読み取ります。これらは、係数配列を使用するフィルターです。

「FIR または IIR フィルター デザイナー」で Google 検索を行うと、難しい仕事 (係数の取得) を行う多くのソフトウェアとオンライン アプレットが見つかります。

編集:

ここのこのページ ( http://www-users.cs.york.ac.uk/~fisher/mkfilter/ ) では、フィルターのパラメーターを入力でき、C コードを使用する準備が整った状態で吐き出されます...

于 2008-10-26T18:46:05.327 に答える
5

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

フロートを使用してフィルタリングを行うことをお勧めします。固定小数点フィルター アルゴリズムもありますが、通常、これらには品質のトレードオフがあります。フロートがある場合は、それらを使用してください。

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

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

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

詳細については、ポリフェーズ IIR またはポリフェーズ FIR を検索してみてください。

于 2008-10-26T20:27:30.550 に答える
5

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

ところで、実質的にリサンプリングを行うすべてのソフトウェア (オーディオ、画像など。オーディオの場合の例: sox) はこれを考慮しており、多くの場合、基礎となるローパス フィルターを選択できます。

于 2010-03-26T17:34:09.860 に答える
1

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

サンプル値を平均することで、適切な作業を行うことができます。サンプルを4つずつ取得して同じ加重平均を実行する単純な方法は機能しますが、それほど優れているわけではありません。代わりに、直感的でない方法でそれらを平均化する「カーネル」関数を使用することをお勧めします。

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

最後に、サンプルの大部分を破棄し、0番目、4番目などを保持する、小便が少ない(ただし高速な)方法があります。

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

于 2008-10-26T21:03:49.947 に答える
1

あなたが求めているプロセスは「デシメーション」と呼ばれます。2 つのステップがあります。

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

ロー パス フィルターを設計して適用する方法は多数あります。

ここから始めることができます:

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

于 2011-05-09T14:32:02.143 に答える
1

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

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

于 2011-06-05T04:41:47.487 に答える
1

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

于 2008-10-26T18:18:54.367 に答える
0

私は最近、あなたが興味を持っていることのいくつかをすでに行っているかもしれないBruteFIRに出くわしましたか?

于 2009-04-15T11:07:49.517 に答える
0

DFT を適用して、結果の 3/4 を切り刻み、逆 DFT を適用してみます。実際に頑張ってみないと良い音になるかどうかは分かりません。

于 2008-10-26T18:27:22.633 に答える