0

然后我做这个代码:

 private int[] getAmplitude(byte[] fft) {
        int[] amplitude = new int[fft.length/2-2] ;
        for (int i = 2; i <= fft.length/2-2;i+= 2) {
            for(int j=0;j<= fft.length/2-2;j++){
            amplitude[j]=(fft[i] * fft[i] + fft[i + 1] * fft[i + 1]);}
        }
        return amplitude;

我懂了:

java.lang.ArrayIndexOutOfBoundsException
    at com.astroplayerbeta.gui.eq.EqVisualizerCaptureAudio.getAmplitude(EqVisualizerCaptureAudio.java:90)
    at com.astroplayerbeta.gui.eq.EqVisualizerCaptureAudio.onFftDataCapture(EqVisualizerCaptureAudio.java:67)
    at android.media.audiofx.Visualizer$NativeEventHandler.handleMessage(Visualizer.java:484)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3835)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
    at dalvik.system.NativeStart.main(Native Method)

那是我的麻烦吗?

fft[] 数组的长度为 1024。

4

1 回答 1

1

假设fft.length/2-2是 3。那么幅值是一个大小为 3 的数组。

现在你说

for(int j=0;j<= fft.length/2-2;j++){
    amplitude[j]=(fft[i] * fft[i] + fft[i + 1] * fft[i + 1]);
}

如果我用英语写它会是:对于 j = 0 到 3,将 somthing 放在幅值 [j] 中。所以你将4 个值放入幅度中,这是一个大小为 3 的数组。所以你得到一个ArrayIndexOutOfBoundsException. 将行更改为

for(int j=0;j< fft.length/2-2;j++){
    amplitude[j]=(fft[i] * fft[i] + fft[i + 1] * fft[i + 1]);
}

(<= 更改为 <),你应该设置。

请注意,您对 fft 及其 for 循环也有类似的问题。

于 2013-02-01T09:43:49.757 回答