Oblicz FFT z pliku audio

Wcześniej pytałem o toUzyskaj częstotliwość audio wav za pomocą FFT i klasy złożonej ,

Tam muszę obliczyć wartość FFT z wejścia AudioRecord -> z mikrofonu, udało mi się jakoś uzyskać wartość FFT ...

Teraz muszę obliczyć wartość FFT z pliku audio * .wav, który zapisałem wcześniej, zapisałem dźwięk w folderze „raw” w folderze „res” z mojego projektu

Nadal używam tej samej klasy FFT:http://www.cs.princeton.edu/introcs/97data/FFT.java

Klasa złożona:http://introcs.cs.princeton.edu/java/97data/Complex.java.html

Korzystam z tej metody, aby odczytać plik audio z mojego surowego foldera, a następnie wywołuję metodę calculFFT, aby przejść z nim

private static final int RECORDER_BPP = 16;
  private static final int RECORDER_SAMPLERATE = 44100;
  private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
  private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;


private void asli(){

            int counter = 0;
            int data;
            InputStream inputStream  = getResources().openRawResource(R.raw.b1);
            DataInputStream dataInputStream = new DataInputStream(inputStream);
            List<Integer> content = new ArrayList<Integer>(); 

            try {
                while ((data = dataInputStream.read()) != -1) {
                    content.add(data);
                    counter++; }
            } catch (IOException e) {
                e.printStackTrace();}

                int[] b = new int[content.size()];
                int cont = 0;
                byte[] audio = convertArray(b);
        }

Metoda konwersji na bajt

public byte[] convertArray(int[] array) { 

            int minBufferSize = AudioTrack.getMinBufferSize(RECORDER_SAMPLERATE,RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING);
                AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,RECORDER_SAMPLERATE,RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING,minBufferSize, AudioTrack.MODE_STREAM);

        byte[] newarray = new byte[array.length];
        for (int i = 0; i < array.length; i++) {
        newarray[i] = (byte) ((array[i]) & 0xFF);       }

            absNormalizedSignal = calculateFFT(newarray);
            return newarray;
        }

A to jest metoda CalculateFFT

public double[] calculateFFT(byte[] signal)
        {           
            final int mNumberOfFFTPoints =1024;
            double mMaxFFTSample;
            double temp;
            Complex[] y;
            Complex[] complexSignal = new Complex[mNumberOfFFTPoints];
            double[] absSignal = new double[mNumberOfFFTPoints/2];

            for(int i = 0; i < mNumberOfFFTPoints; i++){
                temp = (double)((signal[2*i] & 0xFF) | (signal[2*i+1] << 8)) / 32768.0F;
                complexSignal[i] = new Complex(temp,0.0);
            }

            y = FFT.fft(complexSignal);

            mMaxFFTSample = 0.0;
            mPeakPos = 0;
            for(int i = 0; i < (mNumberOfFFTPoints/2); i++)
            {
                 absSignal[i] = Math.sqrt(Math.pow(y[i].re(), 2) + Math.pow(y[i].im(), 2));
                 if(absSignal[i] > mMaxFFTSample)
                 {
                     mMaxFFTSample = absSignal[i];
                     mPeakPos = i;
                 } 
            }

            return absSignal;

        }

Użyłem tej metody CalculateFFT również do przetwarzania dźwięku z AudioRecorder -> tej z wejściem mikrofonowym wcześniej ... Udało mi się uzyskać wartość z AudioRecorder, ale nie udało mi się uzyskać wartości z mojego pliku audio ... Nie planuję Aby odtworzyć dźwięk .. Muszę go przetworzyć za pomocą FFT.

Czy jest jakiś błąd w moim kodzie? : o Wydaje się, że nie udaje mi się uzyskać wartości z metody Asli (); Ale nie wiem, która część jest błędna ..

Każda pomoc byłaby doceniana ... :) Dzięki

questionAnswers(1)

yourAnswerToTheQuestion