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.
Vous devez vous connecter pour publier un commentaire.
J'ai passé une bonne partie de la matinée, le codage d'une solution pour cela à l'aide de pièces et de morceaux de FFT java des extraits que j'ai trouver... mais je suis tombé sur ce merveilleux wondeful google code du projet qui a un tas de util classes pour faire des tâches de traitement du signal sur des fichiers WAV et MP3 comme.
https://github.com/Uriopass/audio-analysis
Anciennement SVN export a été sur Google code ici: https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/audio-analysis/source-archive.zip
Il devient INCROYABLEMENT facile:
Maintenant, vous pouvez utiliser la fft un objet pour en faire différents calculs. Ils ont un tas de bons exemples, tels que la génération d'une Liste contenant les flux spectral:
Mon entreprise avait besoin d'un moyen pour moi d'analyser certains audio pour voir si certains attendent de musique d'attente qui s'était passé. Alors d'abord, j'ai généré un fichier WAV pour un exemple qui n'ont que la musique d'attente. Ensuite, j'ai capturé quelques-uns audio de l'un de toi exemples qui n'ont pas la musique d'attente. Maintenant, tout ce qui est à gauche est en moyenne de l'éclairement spectral de l'wav et je suis prêt.
Note: je ne pouvais pas avoir tout simplement pris des amplitudes... mais la transformation de fourier a fréquences que je pourrais utiliser correctement pour faire ma comparaison.
J'aime les mathématiques.
wavFileObj
à partir de? Où étiez-vous obtenir leWaveDecoder
à partir de? vous écrire quelques morceaux de code, mais pas utile. veuillez expliquer plus...