1#!/usr/bin/python
2
3# Copyright (C) 2012 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#       http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17from consts import *
18import numpy as np
19import scipy as sp
20import scipy.fftpack as fft
21import matplotlib.pyplot as plt
22
23# generate random signal with max freq
24# Input: peak amplitude,
25#        duration in msec,
26#        sampling rate HZ
27#        high frequency,
28# Output: generated sound (stereo)
29
30def do_gen_random(peakAmpl, durationInMSec, samplingRate, fHigh, stereo=True):
31    samples = durationInMSec * samplingRate / 1000
32    result = np.zeros(samples * 2 if stereo else samples, dtype=np.int16)
33    randomSignal = np.random.normal(scale = peakAmpl * 2 / 3, size=samples)
34    fftData = fft.rfft(randomSignal)
35    freqSamples = samples/2
36    iHigh = freqSamples * fHigh * 2 / samplingRate + 1
37    #print len(randomSignal), len(fftData), fLow, fHigh, iHigh
38    if iHigh > freqSamples - 1:
39        iHigh = freqSamples - 1
40    fftData[0] = 0 # DC
41    for i in range(iHigh, freqSamples - 1):
42        fftData[ 2 * i + 1 ] = 0
43        fftData[ 2 * i + 2 ] = 0
44    if (samples - 2 *freqSamples) != 0:
45        fftData[samples - 1] = 0
46
47    filteredData = fft.irfft(fftData)
48    #freq = np.linspace(0.0, samplingRate, num=len(fftData), endpoint=False)
49    #plt.plot(freq, abs(fft.fft(filteredData)))
50    #plt.plot(filteredData)
51    #plt.show()
52    if stereo:
53        for i in range(len(filteredData)):
54            result[2 * i] = filteredData[i]
55            result[2 * i + 1] = filteredData[i]
56    else:
57        for i in range(len(filteredData)):
58            result[i] = filteredData[i]
59    return result
60
61
62def gen_random(inputData, inputTypes):
63    output = []
64    outputData = []
65    outputTypes = []
66    # basic validate
67    inputError = False
68    if (inputTypes[0] != TYPE_I64):
69        inputError = True
70    if (inputTypes[1] != TYPE_I64):
71        inputError = True
72    if (inputTypes[2] != TYPE_I64):
73        inputError = True
74    if (inputTypes[3] != TYPE_I64):
75        inputError = True
76    if inputError:
77        output.append(RESULT_ERROR)
78        output.append(outputData)
79        output.append(outputTypes)
80        return output
81
82    result = do_gen_random(inputData[0], inputData[1], inputData[2], inputData[3])
83
84    output.append(RESULT_OK)
85    outputData.append(result)
86    outputTypes.append(TYPE_STEREO)
87    output.append(outputData)
88    output.append(outputTypes)
89    return output
90
91# test code
92if __name__=="__main__":
93    peakAmplitude = 10000
94    samplingRate = 44100
95    durationInMSec = 10000
96    #fLow = 500
97    fHigh = 15000
98    result = do_gen_random(peakAmplitude, durationInMSec, samplingRate, fHigh)
99    plt.plot(result)
100    plt.show()
101