2

このようなことが可能かどうか(そして比較的簡単にできるかどうか)疑問に思っています。

再生中の Wave ファイルにバンド フィルタリングを適用したいと考えています。ほとんどの Winamp のようなアプリケーションで見られる「イコライザー」に似たもの。
ただし、私の考えは、サウンドをイコライズするのではなく、非常に高い負の dB 値を使用して、フィルタリングしている帯域をほとんど殺すことです。

最初の質問は次のとおりです。DirectSound は、これを可能にする何かを提供してくれますか?
そうでない場合: これをどのように実装しますか?
高速フーリエ変換を使用して、サンプリングされた波形から周波数の分布に変換できることは知っています (完全には理解していませんが)。さて、特定の周波数の振幅値を変更した後、明らかにその分布から元の波形に戻ることはできません:-)

どうすればこのようなことができますか?

また、これらのフィルターをどの程度正確に作成できますか? (2250Hz から 2275Hz までのすべてを除外したい場合、フィルターの誤差はどうなるでしょうか? 得られる最大精度は何に依存するでしょうか?)

ありがとう!

4

7 に答える 7

3

DirectSound がこの機能を提供しているかどうかはわかりませんが、DSP はかなり複雑で、状況によって大きく異なることが多いため、提供されていないと思います。あなたがやりたいことは、通常、DSP(デジタル信号処理)で「フィルタリング」と呼ばれます。多くの場合、これには FIR (有限インパルス応答) フィルターの使用が含まれます。あなたが望むことを正確に行うための多くのライブラリがあります。フィルター設計の最も厄介な側面の 1 つは、速度、精度、および誤差の間に常にトレードオフがあることです。あなたの例では、周波数間の信号を削除できますが、これは周囲の周波数にも影響します。それが影響する量は、処理時間とフィルター設計に関連しています。

おそらくここから始めてください(数学が重い):FIRフィルター

次に、独自の Windows/DirectSound 固有の FIR 関連情報を Google で検索します

于 2008-11-03T14:01:25.157 に答える
2

私の知る限り、DirectSoundはここで説明するようなバンドフィルタリングを行いません。

バンドパスフィルタリングの背後にある一般的な考え方は、信号出力を受け取り、指定された遅延時間と減衰(または減衰)係数で入力ストリームにフィードバックする遅延線を使用することです。フィルタを注意深く設計すると、オーディオソースの特定の周波数範囲を増幅または減衰させることができます。この手法では、フィルター効果のテスト中の診断ツールを除いて、FFTを使用しないことに注意してください。FFT技術は、周波数を制限または増幅するというより正確な仕事をしますが、遅延線は一般的に高速です(そしてコーディングがはるかに簡単です)。

(リアルタイムの合成/フィルタリングを行うのではなく)WAVファイルを処理する場合、オーディオバッファでディレイラインを実行するのは次のように簡単です。

for (int i = 0; i < samples.Length - delay; i++)
{
    samples[i + delay] += samples[i] * decay;
}

もちろん、実際にはこれよりも少し複雑です(たとえば、潜在的なオーバーフロー値を処理する必要があり、一部のタイプの遅延線は逆方向に実行する必要があります。これは、Cスタイルのコーディングでは常に苦痛です)。

フィルターの精度に関しては、それはフィルターがどれだけうまく設計されているかに依存します(それは非常に困難です)。遅延線を使用してフィルターを設計する場合、電気技師が安価なマイクロプロセッサーの前の数十年間に行った(そして今でも行っている)のと基本的に同じことを行っています。

于 2008-11-03T14:04:15.853 に答える
1

この種のことを直接処理するライブラリは知りません。

あなたはフーリエ変換であなたが望むものを達成することができます.FFTWなどの実装はあなたのために計算作業を行います. 1ヒット。

FFT を使用して eq を適用するための基本的な考え方は次のとおりです。

  1. オーディオを取得します。オーディオは非常に長い配列の値 (サンプル) であり、スピーカー コーンの変位/経時変化です。
  2. オーディオのフーリエ変換を行います (ライブラリがこれを行いますが、オーディオ サンプルを正しい形式にシャントする必要があります。これにより、時間ベースのサンプルが周波数ベースの表現に変換されます。基本的に、信号が変換されて分布が表示されます。信号の周波数の。
  3. 周波数分布を分割します - 分布を領域に分割します。各領域は周波数の範囲になります。
  4. 次に、周波数帯域で調整を実行できます。たとえば、1 つの領域をゼロにして、そのすべてのトレースを削除できます。
  5. 更新された周波数分布の逆フーリエ変換を行います。これにより、表現が時間領域に戻り、元の信号の (近似) が再構築されますが、行った調整が行われます。

このようなことを行うと、オーディオに存在する周波数を正確に操作して、必要に応じてコントロールできるようになります。ただし、実装は簡単ではないことに注意してください。

この件について一読することをお勧めします。ビート検出は、これらの多くに非常に密接に関連しています (基本的なテクニックを多く使用します) 。最初に、ここの最初のいくつかのセクションを試してください。

それが少し役立つことを願っています。

于 2008-11-04T12:20:32.257 に答える
1

DirectSound には、信号処理機能がまったくありません。やりたいことを実行するために使用できるさまざまなテクニックがあります。FFT を使用して目的を達成することは可能ですが、おそらく最良または最も簡単な方法ではありません。オーディオ DSP、特にデジタル フィルタリング (IIR、FIR) について調べておく必要があります。The Scientist and Engineer's Guide to Digital Signal Processingというオンラインで無料で入手できる優れた DSP の本があり、一見の価値があります。Amazonなどから入手できる他の多くの優れたDSP本もあります.

于 2008-11-03T14:00:31.103 に答える
0

私はFIRフィルターのアイデアを2番目にしています。狭いノッチを取得するには、長いフィルターカーネルが必要になります。

基本的に、値のセット(カーネル)に対して入力ストリームの畳み込みを使用します。すべての出力サンプルは、前のN個のサンプルの合計に、フィルターカーネルの対応するエントリを掛けたものです。

したがって、同じ数のサンプルのカーネル配列とFIFOまたは循環バッファを保持する必要があります。

それらはウェブ上のFIRフィルターカーネル計算機であり、グーグルの「FIRフィルター計算機」です。

于 2009-01-04T21:12:23.307 に答える
0

FFTを実行し、周波数領域をいじり(周波数ビンのスケーリング)、IFFTを実行して時間領域信号を回復できるはずです。それ以外の場合、ScopeFIR または MATLAB を使用してフィルターを設計するのは非常に簡単です。ScopeFIR では、バンドストップ フィルターを簡単に設計して係数を取得できるため、信号に対して畳み込みを行うことができます。これは、ScopeFIR Web サイトのチュートリアルです: http://www.iowegian.com/fir/tutor/firintro.htm

于 2009-01-28T05:57:00.773 に答える
0

DirectSound はこれを直接サポートしていない可能性がありますが、DirectShow はサポートする必要があります。代わりにその API を使用できますか?

于 2008-11-14T19:44:31.383 に答える