2

次のコードを使用して PCM オーディオ データを正規化していますが、これは正規化する正しい方法ですか? 正規化後、LPFを適用しています。最初にLPFを実行し、その出力で正規化を行うか、それが重要な場合にのみ現在の順序が優れているかは、順序が重要ですか。また、私の targetMax は、このフォーラムの投稿から使用した 8000 に設定されています。その最適値はいくらですか。私の入力は、サンプルレート 44100 の 16 ビット MONO PCM です。

private static int findMaxAmplitude(short[] buffer) {
    short max = Short.MIN_VALUE;
    for (int i = 0; i < buffer.length; ++i) {
        short value = buffer[i];
        max = (short) Math.max(max, value);
    }
    return max;
}

short[] process(short[] buffer) {
    short[] output = new short[buffer.length];
    int maxAmplitude = findMaxAmplitude(buffer);
    for (int index = 0; index < buffer.length; index++) {
        output[index] = normalization(buffer[index], maxAmplitude);
    }
    return output;
}

private short normalization(short value, int rawMax) {
    short targetMax = 8000;
    double maxReduce = 1 - targetMax / (double) rawMax;
    int abs = Math.abs(value);
    double factor = (maxReduce * abs / (double) rawMax);

    return (short) Math.round((1 - factor) * value);
}
4

1 に答える 1

1

あなたの findMaxAmplitude は、正のエクスカーションのみを調べます。次のようなものを使用する必要があります

max = (short)Math.Max(max, Math.Abs(value));

あなたの正規化はかなり複雑なようです。より単純なバージョンでは次を使用します。

return (short)Math.Round(value * targetMax / rawMax);

targetMax の 8000 が正しいかどうかは好みの問題です。通常、16 ビット サンプルの正規化では、値の最大範囲を使用することを期待します。したがって、targetMax の 32767 はより論理的に見えます。LPF のゲインがシーケンスの最大値を変更する可能性があるため、正規化はおそらく LPF 操作の後に行う必要があります。

于 2013-07-21T15:31:15.427 に答える