2

時間ベースの値を使用して、基本的なローパスフィルターを実装しました。これは問題ありませんが、正しいタイムスライスを見つけようとするのは推測作業であり、さまざまな入力オーディオファイルに基づいてさまざまな結果が得られます。これが私が今持っているものです:

- (void)processDataWithInBuffer:(const int16_t *)buffer outBuffer:(int16_t *)outBuffer sampleCount:(int)len {   
    BOOL positive;
    for(int i = 0; i < len; i++) {
        positive = (buffer[i] >= 0);
        currentFilteredValueOfSampleAmplitude = LOWPASSFILTERTIMESLICE * (float)abs(buffer[i]) + (1.0 - LOWPASSFILTERTIMESLICE) * previousFilteredValueOfSampleAmplitude;
        previousFilteredValueOfSampleAmplitude = currentFilteredValueOfSampleAmplitude; 
        outBuffer[i] = currentFilteredValueOfSampleAmplitude * (positive ? 1 : -1);
    }
}

このコードを特定のdBレベルで特定のHz以上の周波数をカットできるコードに変換するにはどうすればよいですか?

4

3 に答える 3

2

持っているのはIIRフィルターです。より詳細に制御するには、係数の計算が簡単なFIRフィルターを使用することをお勧めします。次のようなウィンドウ関数を作成します。

y = sin (x * bandwidth) / (sin (x) * windowWidth)

ここで、windowWidthはウィンドウの幅のサンプル数、xの範囲は-2*PIから2*PI、帯域幅は次のとおりです。

bandwidth = 2 * frequency * n / sampleRate;

これにより、出力するサンプルを中心としたサンプルの範囲に適用する数値の配列が作成されます。すべてのサンプルでこれを繰り返します。

元のコードはかなり粗雑なので、これを行うための自分のコードを要約しました。

于 2010-11-22T04:58:03.133 に答える
2

c の数値レシピを強くお勧めします。それ以外では、私はあなたを助けることができるかどうかわかりません.

フィルターを設計するときは、周波数に基づいてそのフィルターの係数を計算する必要があるため、関数だけでなく、それを処理するためのクラスがほとんど必要になります。

これはC++で書かれていますが、すぐに始められるはずです。申し訳ありませんが、具体的な回答を提供できません。

于 2010-11-12T19:34:11.567 に答える
1

インタラクティブ フィルター デザイナーを使用してフィルターを実装しました。

統合されたサンプルコードを次に示します: https://github.com/davidcairns/MediaPlayerDemo

于 2011-04-22T18:34:49.193 に答える