# PowenKo,Android Tutorial 39-2, Sound, Analyze the frequency and strength of sound in Android

Analyze the frequency and strength of sound in Android

1  Purpose
In order to get the distance between two phones, one method is to let the phone
generate  high  frequency  tone  and  the  other  one  detect  the  signal  strength  of  the
sound  in  the  specific  frequency  range.  In  our  experiment  we  use  two  android
phones  to  generate  high  frequency  (>15500Hz)  sound  and  get  it  so  that  its
frequency and strength can be analyzed.
2  Generate sound in specific frequency
AudioTrack  class allows  to  stream  PCM  audio  buffers  to  the  audio  hardware  for
playback. So here we use it to generate the high frequency sound. According to the
theory  of  “Nyquist  Frequency”  (Fmax  =  SampleRate  /  2),  we  use  44100Hz  as  the
sample rate so that later we can have a band from 0 to 22050Hz.

```// construct audio stream in 16bit format with sample rate of 44100Hz
i n t minSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioTrack track = n e w AudioTrack(AudioManager.STREAM_MUSIC,
sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, minSize,
AudioTrack.MODE_STREAM);
...
//use formula to get the wave data in specific frequency (15500Hz)
v o i d genTone(){
i n t angle = 0;
i n t increment = 2 * Math.PI * freqOfTone / sampleRate; // angular increment
f o r (i n t i = 0; i < sample.length; i++) {
sample[i] = Math.sin(angle) * Short.MAX_VALUE;
angle += increment;
}
track.write(sample, 0, sample.length); // write data to audio hardware
track.play();   // play an AudioTrack
}
```

3  Get sound from microphone
AudioRecord  class  records  data  from  the  audio  input  hardware.    In  order  to  get
the correct data, the sample rate for recording should be the same as that of input

```// construct AudioRecord to record audio from microphone with sample rate of 44100Hz
i n t minSize = AudioRecord.getMinBufferSize(sampleRate,AudioFormat.
CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioRecord audioInput = n e w AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
minSize);
...
audioInput.startRecording();
```

4  Analyze the frequency and strength by using FFT
The  data  in  the  buffer  from  read()  are digital  signals  of  the  sound  which  is
sampled  every  22us  (≈  1/44100Hz).  In  order  to  plot  the  frequency  spectrum,  we
need FFT (Fast Fourier Transform) to process the data.
FFT is an effective algorithm to convert signals from time or space domain to the
frequency domain. The input of FFT is a complex vector and we use the data in the
buffer as its real part and 0 as its image part. The output of the algorithm returns a
complex  array.  Then  we  calculate  the  absolute  value  of  the  array  and  plot  the
frequency  spectrum  with  spectrum  bars,  each  of  which  contains  the
magnitude(energy) of a frequency range. Say sample rate is 44100Hz and the buffer
size is 4096. Then a frequency range of 22050Hz is equally split into 2048 bars and
each bar is 22050/2048 ≈ 10.77 Hz wide which is also called frequency resolution.
In order to get the strength in dB unit, we can first calculate the sum of the data
and  the  sum  of  the  squared  values.  Then  use  the  formula  “(squaredsum‐
sum*sum/number)/number”  and  conversion  of  log10()  to  get  the  power  value.  In
the  application  we  use  the  user  interface  provided  by  moonblink  and  Fig  1  shows
some screenshots. The left part shows the normal situation and the right one is got
when the other phone nearby generates a tone with frequency of 1000Hz (a)         (b)
Figure 1. Frequency spectrum and strength value
5  Unsolved problem
Right  now  we  get  some  obstruction  to get  the  pitch  in  the  specific  high  frequency
since microphone of Nexus One filters out the high frequency tone and cannot pick it
up.    We  looked  up  the  technical  specifications  and  the  detailed  frequency  range  is
still unknown.
Reference:
 http://developer.android.com/index.html
 Introduction of FFT http://www.vlf.it/fft_beginners/fft_beginners.html
 FFT source code  http://www.cs.princeton.edu/introcs/97data/FFT.java 