java - FFT Decoder for Audio Signal in Android -


i trying make decoder in android project published https://github.com/rraval/pied-piper have created decoder in python, in python pretty easy using numpy package, in java having hard time. steps used in python includes :

def dominant(frame_rate,chunk):   w=numpy.fft.fft(chunk)   numpy.fft.fftfreq(len(chunk))   peak_coeff = numpy.argmax(numpy.abs(w))   peak_freq = freqs[peak_coeff]   return abs(peak_freq * frame_rate) # in hz 

above code returns frequency of audio data in chunks[ ].

i trying make android code implements same logic. work far given below :

public class micreadthread3 extends thread {  static final int handshake_start_hz = 8192; static final int handshake_end_hz = 8192 + 512; static final int start_hz = 1024; static final int step_hz = 256; static final int bits = 4; static final int fec_bytes = 4; static final int sample_size=8; boolean callback_done=false;  private static final int audio_source = mediarecorder.audiosource.mic; private static final int sample_rate = 44100; // hz private static final int encoding = audioformat.encoding_pcm_16bit; private static final int channel_mask = audioformat.channel_in_mono; private static final int buffer_size = audiorecord.getminbuffersize(sample_rate, channel_mask, encoding); private static final int blocksize=buffer_size;    public micreadthread3(){     setpriority(thread.max_priority); }  @override public void run(){      system.out.println("buffer size : "+buffer_size);     audiorecord audiorecord=null;     double dom;     byte[] buffer=new byte[blocksize];     short[] buffershort =new short[blocksize];     audiorecord = new audiorecord(audio_source, sample_rate, channel_mask, encoding, buffer_size);     audiorecord.startrecording();     while(true){         audiorecord.read(buffer, 0, blocksize);         dom = dominant(sample_rate, buffer);         system.out.println("dominant="+dom);         if(match(dom,handshake_start_hz)){             system.out.println("found handshake start freq :"+dom);         }          if(match(dom,handshake_end_hz)){             system.out.println("found handshake end freq :"+dom);         }     }  }  public boolean match(double freq1, double freq2) {     return math.abs(freq1 - freq2) < 20; }  public double dominant(int frame_rate, byte[] chunk){     int len=chunk.length;     double[] wavetransformreal=new double[len];     double[] wavetransformimg=new double[len];     for(int i=0;i<len;i++){         wavetransformreal[i]=chunk[i];     }      fft.transform(wavetransformreal,wavetransformimg);      //calculating abs     double[] abs=new double[len];      for(int i=0;i<len;i++) {         abs[i] = (math.sqrt(wavetransformreal[i] * wavetransformreal[i] + wavetransformimg[i] * wavetransformimg[i]));      }     int maxindex=0;     for(int i=0;i<len;i++) {         if (abs[i] > abs[maxindex])             maxindex = i;     }     //frame_rate sampling freq , len no. of datapoints     double dominantfrequency=(maxindex*frame_rate)/len;     return dominantfrequency; } 

}

the class using fft can found in link given below: https://www.nayuki.io/res/free-small-fft-in-multiple-languages/fft.java

i have print dominant frequency if equal handshake frequencies.

but when print values getting junk frequency values 1000,42050,2000,...

in python code fine in android, getting harder... please help, project submission has done next week. part of project, lagging in because of issue! thnanks in advance.

i quick on original answer re

    double dominantfrequency=(maxindex*frame_rate)/len; 

in reference comment, looked again , see difference between github code , 1 posted: github requests 8 bit audio, , here encoding_pcm_16bit.

so each value in wavetransformreal[] partial, because taken chunk[] byte data 2 bytes make full value. quick test, try using encoding_pcm_8bit , see if correct result.


Comments

Popular posts from this blog

php - Permission denied. Laravel linux server -

google bigquery - Delta between query execution time and Java query call to finish -

python - Pandas two dataframes multiplication? -