3

Android Visualizer を使用して、オーディオ ストリームの波形データを取得し、その RMS を計算しています。

public int[] getFormattedData(byte[] rawVizData) {
    for (int i = 0; i < formattedVizData.length; i++) {
        // convert from unsigned 8 bit to signed 16 bit
        int tmp = ((int) rawVizData[i] & 0xFF) - 128;
        formattedVizData[i] = tmp;
    }
    return formattedVizData;
}

//...

double rms = 0;
int[] formattedVizData = getFormattedData(buffer);
if (formattedVizData.length > 0) {
        for (int i = 0; i < formattedVizData.length; i++) {
            int val = formattedVizData[i];
            rms += val * val;
        }
        rms = Math.sqrt(rms / formattedVizData.length);
}

キャプチャ サイズを 1024 に設定し、再生ボリュームが高くなると信号の RMS 値が大きくなると予想しました。440Hz のサイン テスト トーンでテストしたところ、次の結果が得られました。

     ボリューム RMS 最小値 最大値  
      6.67% 5.5 -8 7
     13.33% 13.3 -19 18
     20.00% 28.1 -40 39
     26.67% 42.6 -60 59
     33.33% 68 -96 95
     40.00% 54 -77 76
     46.67% 81 -115 114
     53.33% 64 -91 90
     60.00% 51 -91 90
     66.67% 68 -97 96
     73.33% 48 -69 68
     80.00% 68 -97 96
     86.67% 45 -65 64
     93.33% 64 -91 90
    100.00% 90 -128 127

ボリュームが 33.33% を超えると、私の仮定が成り立たなくなるのはなぜですか? ここで何が欠けていますか?私のコードには、見つけられないように見える明らかなバグがありますか?

これが機能しない理由を見つけるために何日も試みましたが、これまでのところ解決策を見つけることができませんでした。

どんな助けでも大歓迎です。

4

0 に答える 0