DirectSoundで簡単に帯域フィルタリングを行うことはできますか?そうでない場合、どうすればいいですか?

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

質問

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

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

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

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

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

ありがとう!

役に立ちましたか?

解決

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

おそらくここから始めます(数学が重い): FIRフィルタ

次に、独自のWindows / DirectSound固有のFIR関連情報についてgoogle

他のヒント

DirectSoundは、私が知っている限り、ここで説明したような帯域フィルタリングを行いません。

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

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

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

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

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

DirectSoundには、信号処理機能はまったくありません。必要なことを行うために使用できるさまざまな手法があります。 FFTを使用して目的の処理を実行することは可能ですが、おそらく最善または最も簡単な方法ではありません。オーディオDSP、特にデジタルフィルタリング(IIR、FIR)を読んでください。 デジタル信号処理の科学者およびエンジニアガイドと呼ばれる優れたDSPブックをオンラインで無料で入手できます。見て。他にも多くの優れたDSPブックがAmazonなどから入手できます。

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

フーリエ変換で目的を達成できます。 FFTW などの実装は計算作業を行いますしかし、私の経験では、特に1ヒットでより長いビットのオーディオを処理したい場合、作業するのはかなり厄介であり、膨大な量のメモリを使用します。

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

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

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

私は主題について読むことをお勧めします。ビート検出は、この多くに密接にリンクしています(基本的な手法を多く使用します)-最初のいくつかのセクションを試してくださいここを開始します。

少し役立ちます。

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

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

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

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

これらはウェブ上のFIRフィルターカーネル計算機です。Googleの「FIRフィルター計算機」だけです。

FFTを実行し、周波数領域を混乱させ(周波数ビンをスケーリング)、次にIFFTを実行して時間領域信号を回復できる必要があります。それ以外の場合、ScopeFIRまたはMATLABを使用してフィルターを設計するのは非常に簡単です。 ScopeFIRは、バンドストップフィルターを簡単に設計し、信号をコンボリューションできるように係数を与えることができます。 ScopeFIR Webサイトのチュートリアルは次のとおりです。 http://www.iowegian.com/fir/ tutor / firintro.htm

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