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

September 12, 2011   ·   0 Comments

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 
radio

// 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);
...
short[] buffer = new short[readSize];
audioInput.startRecording();
audioInput.read(buffer, index, readSize); // record data from mic into buffer

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:
[1] http://developer.android.com/index.html
[2] Examples of AudioRecord http://code.google.com/p/moonblink/wiki/Audalyzer
[3] Introduction of FFT http://www.vlf.it/fft_beginners/fft_beginners.html
[4] FFT source code  http://www.cs.princeton.edu/introcs/97data/FFT.java
[5] Examples of AudioTrack http://apistudios.com/hosted/marzec/badlogic/wordpress/?p=228

shareShare on FacebookShare on Google+Share on LinkedInEmail this to someonePrint this pageBuffer this pageDigg thisFlattr the authorShare on RedditPin on PinterestShare on StumbleUponShare on TumblrTweet about this on Twitter

By


Readers Comments (0)


You must be logged in to post a comment.

PowenKo’s Online Store

powenko_arduinoBook
Android7

Amazon

adsbygoogle

Recent Posts

Categories

Amazon