cts_audio work: initial code
- volume calibration and THD test case work tuned.
- 59 unit tests pass
- local audio playback / recording works : uses tinyalsa
- host to device ptorocol in host side implemented / tested (with loopback)
- device side recording / playback works for test cases / test_io.xml
- python processing baseline added.
- spectrum algorithm implementated: calculate Transfer Function of device
  over host and check if amplitudes are within margain. Needs parameter tuning
- spectrum test needs some improvements due to the non-flat response from
  ref microphone.

Change-Id: I5288dec42f272260f30f1ace1374d365e31d1664
diff --git a/suite/audio_quality/test_description/processing/gen_random.py b/suite/audio_quality/test_description/processing/gen_random.py
new file mode 100644
index 0000000..541c60a
--- /dev/null
+++ b/suite/audio_quality/test_description/processing/gen_random.py
@@ -0,0 +1,110 @@
+#!/usr/bin/python
+
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from consts import *
+import numpy as np
+import scipy as sp
+import scipy.fftpack as fft
+import matplotlib.pyplot as plt
+
+# generate random signal
+# Input: peak amplitude,
+#        duration in msec,
+#        sampling rate HZ
+#        low frequency,
+#        high frequency,
+# Output: generated sound (stereo)
+
+def do_gen_random(peakAmpl, durationInMSec, samplingRate, fLow, fHigh, stereo=True):
+    samples = durationInMSec * samplingRate / 1000
+    result = np.zeros(samples * 2 if stereo else samples, dtype=np.int16)
+    #randomSignal = np.random.random_integers(-peakAmpl, peakAmpl, samples)
+    randomSignal = np.random.normal(scale=peakAmpl *2 / 3, size=samples)
+    fftData = fft.rfft(randomSignal)
+    freqSamples = samples/2
+    iLow = 0 #freqSamples * fLow * 2/ samplingRate + 1
+    #if iLow > freqSamples - 1:
+    #    iLow = freqSamples - 1
+    iHigh = freqSamples * fHigh * 2 / samplingRate + 1
+    #print len(randomSignal), len(fftData), fLow, iLow, fHigh, iHigh
+    if iHigh > freqSamples - 1:
+        iHigh = freqSamples - 1
+    fftData[0] = 0 # DC
+    #for i in range(iLow - 1):
+    #    fftData[2 * i + 1 ] = 0 # Re
+    #    fftData[2 * i + 2 ] = 0 # Imag
+    for i in range(iHigh, freqSamples - 1):
+        fftData[ 2 * i + 1 ] = 0
+        fftData[ 2 * i + 2 ] = 0
+    if (samples - 2 *freqSamples) != 0:
+        fftData[samples - 1] = 0
+
+    filteredData = fft.irfft(fftData)
+    #freq = np.linspace(0.0, samplingRate, num=len(fftData), endpoint=False)
+    #plt.plot(freq, abs(fft.fft(filteredData)))
+    #plt.plot(filteredData)
+    #plt.show()
+    if stereo:
+        for i in range(len(filteredData)):
+            result[2 * i] = filteredData[i]
+            result[2 * i + 1] = filteredData[i]
+    else:
+        for i in range(len(filteredData)):
+            result[i] = filteredData[i]
+    return result
+
+
+def gen_random(inputData, inputTypes):
+    output = []
+    outputData = []
+    outputTypes = []
+    # basic sanity check
+    inputError = False
+    if (inputTypes[0] != TYPE_I64):
+        inputError = True
+    if (inputTypes[1] != TYPE_I64):
+        inputError = True
+    if (inputTypes[2] != TYPE_I64):
+        inputError = True
+    if (inputTypes[3] != TYPE_I64):
+        inputError = True
+    if (inputTypes[4] != TYPE_I64):
+        inputError = True
+    if inputError:
+        output.append(RESULT_ERROR)
+        output.append(outputData)
+        output.append(outputTypes)
+        return output
+
+    result = do_gen_random(inputData[0], inputData[1], inputData[2], inputData[3], inputData[4])
+
+    output.append(RESULT_OK)
+    outputData.append(result)
+    outputTypes.append(TYPE_STEREO)
+    output.append(outputData)
+    output.append(outputTypes)
+    return output
+
+# test code
+if __name__=="__main__":
+    peakAmplitude = 10000
+    samplingRate = 44100
+    durationInMSec = 10000
+    fLow = 500
+    fHigh = 15000
+    result = do_gen_random(peakAmplitude, durationInMSec, samplingRate, fLow, fHigh)
+    plt.plot(result)
+    plt.show()