Calculer la FFT de fichier audio

Avant, j'ai posé la question à propos de Obtenez de fréquence audio wav à l'aide de la FFT et le Complexe de classe ,

Là, j'ai besoin de calculer la FFT valeur de AudioRecord d'entrée --> à partir du microphone , j'ai réussi à obtenir la FFT valeur...

Maintenant, j'ai besoin de calculer la FFT la valeur à partir de *.wav fichier audio que j'ai sauvé avant,
J'ai enregistré l'audio en "brut" dossier à l'intérieur de 'res' dossier de mon projet

Je continue d'utiliser le même FFT Classe: http://www.cs.princeton.edu/introcs/97data/FFT.java

Le complexe de classe pour aller avec elle: http://introcs.cs.princeton.edu/java/97data/Complex.java.html

J'utilise cette méthode pour lire le fichier audio à partir de mon cru foldern, puis j'appelle la méthode calculateFFT pour aller avec elle

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);
        }

Méthode pour convertir des octets

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;
        }

Et c'est le CalculateFFT méthode

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;

        }

J'ai utilisé ce CalculateFFT méthode trop de traiter les données audio à partir d'enregistreur audio --> que l'un avec entrée microphone avant... j'ai réussi à obtenir la valeur de l'enregistreur audio, mais je n'ai pas réussi à obtenir la valeur de mon fichier audio... je n'ai pas l'intention de jouer l'audio.. j'ai juste besoin de le traiter avec la FFT.

Est-il un problème avec mon code ?? 😮 Semble que j'échoue à obtenir la valeur de la méthode Asli(); Mais je ne sais pas quelle partie est mal..

Toute aide serait appréciée... 🙂
Grâce

  • Vous avez juste posté beaucoup de code, mais un très incertaine description de quelle façon votre code ne fonctionne pas, et ce que vous avez déjà essayé de le résoudre.
  • J'en suis désolé.. 🙁 Depuis que j'ai lu beaucoup de question sans passer de codes appropriés, puis les gens vote vers le bas..très incertaine description de ce que mes codes ne parvient pas --> j'ai déjà écrit je n'ai pas réussi à obtenir la valeur de mon fichier audio... à traiter avec la FFT. Ce que j'ai déjà essayé, c'est --> méthode asli() j'essaie de me connecter à l'audio à l'aide d'InputStream inputStream =getResources().openRawResource(R. raw.b1); DataInputStream dataInputStream = new DataInputStream(inputStream); puis j'ai lu le tableau de données avec la taille de la mémoire tampon, mais il me semblait que je n'ai pas
  • Les échantillons en RIFF WAV, les fichiers sont généralement stockés sous forme de 16 bits de poids faible des nombres entiers signés, non octets ou en double. Donc, vous pourriez être manquant un type de conversion.
  • Je pense que hotpaw est correct. En outre, je ne vois pas de code qui analyse le fichier au format wav. Je pourrais être une erreur de lecture, mais il semble que vous suffit d'ouvrir le fichier et de transmettre les octets brutes à la fft la fonction. Vous pouvez lire sur la façon d'analyser les fichiers wav ou l'utilisation de java pour les analyser. Il n'y a plus d'info ici je crois: jsresources.org
  • Merci beaucoup pour ur de correction.. 🙂 , donc maintenant je dois l'analyser en premier. Je suis vraiment nouveau dans ce traitement audio.. et ur réponse a été d'une grande aide. Merci
  • Oui.. merci lof pour la page d'reccomendation.. 🙂 je suis en train d'apprendre ça...
  • J'ai édité mon code.. je ajouter de la méthode de conversion de maintenant, le résultat est sorti, mais le retour toujours 0.0 ... une suggestion ?? 🙁
  • Salut. J'ai créé un .fichier wav avec 2 alternance de fréquences, l'ambulance de la sirène peut être l'un des exemples. Maintenant, j'ai besoin de lire ce fichier et extraire les deux fréquences et de le retourner dans les bits format c'est à dire où il est le 1er de la fréquence-je obtenir '0' et pour la 2ème fréquence " 1 " ou vice versa. Par exemple: "11100010', ce qui montre que la 1ère fréquence était dans le 1er trois, et le 2e de la dernière position. Je suis vraiment coincé ici. Je suis très nouveau dans Java Audios. Si vous pouvez m'aider avec cela, il serait vraiment génial. Si vous voulez voir mon code, je peux aussi vous envoyer que. Merci.

InformationsquelleAutor raisa_ | 2013-07-10