2

私は、44100、16 ビット モノラルで AudioRecord を使用してオーディオ ソースを録音する Android アプリケーションの保守を引き継ぎました。8000 にダウンサンプリングする必要があります。現在のアプリにはダウンサンプリング アルゴリズムが含まれており、正しく機能しているかどうかはわかりません。別のアプリ (ブラック ボックス) がそれを受信すると、音声は再生されますが、バックグラウンドで大きなブーンという音がし、音声が予想よりも遅くなります。受信アプリにパイプされた適切な形式の他のオーディオは、問題なく正常に受信されます。

私が持っているアルゴリズムはここにリストされています(変数名に基づいて、どこかから逆コンパイルされたコードだったと思います)。

private void downSample() {
    int v5 = 0;
    int v4 = 0;
    int v2;
    for (v2 = 0; v2 < 0xA0; ++v2) {
        v5 += 0xD755;
        int v6 = v5 / 0x2710;
        v5 -= v6 * 0x2710;
        double v0 = 0;
        int v3 = v4;
        v4 += v6;
        while (v3 < v4) {
            v0 += ((double) ((((float) this.readBuffer[v3])) * this.volume));
            ++v3;
        }

        v0 /= ((double) v6);
        if (32767 < v0) {
            v0 = 32767;
        }
        else if (-32768 > v0) {
            v0 = -32768;
        }

        this.downSampledBuffer[v2] = ((short) (((int) v0)));
    }
}

readBuffer は、記録ソースによって入力される short[] です。downSampledBuffer も short[] です。何がうまくいかないのかについて何か考えはありますか?

4

1 に答える 1

1

「ブーンという音」と「予想よりも遅いオーディオ」は、このアルゴリズムの外部で生成されます。

アルゴリズムは正確に 882 個の入力サンプルを処理し、160 個の出力サンプルを生成します。したがって、downSample() の各呼び出しの前に、正確に 882 個の新しい short 値で this.readBuffer を埋める必要があり、downSample() から戻った後、結果の 160 個の short 値を既に処理されたサンプルに連結する必要があります。

統合されたローパス「フィルター」は、5 つまたは 6 つの入力サンプルを単純に平均するだけなので、すべてのエイリアシングを取り除くことはできませんが、ダウンサンプリングの問題に対する最も遅い解決策ではありません。

于 2013-10-31T08:03:35.380 に答える