| #!/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 with max freq |
| # Input: peak amplitude, |
| # duration in msec, |
| # sampling rate HZ |
| # high frequency, |
| # Output: generated sound (stereo) |
| |
| def do_gen_random(peakAmpl, durationInMSec, samplingRate, fHigh, stereo=True): |
| samples = durationInMSec * samplingRate / 1000 |
| result = np.zeros(samples * 2 if stereo else samples, dtype=np.int16) |
| randomSignal = np.random.normal(scale = peakAmpl * 2 / 3, size=samples) |
| fftData = fft.rfft(randomSignal) |
| freqSamples = samples/2 |
| iHigh = freqSamples * fHigh * 2 / samplingRate + 1 |
| #print len(randomSignal), len(fftData), fLow, fHigh, iHigh |
| if iHigh > freqSamples - 1: |
| iHigh = freqSamples - 1 |
| fftData[0] = 0 # DC |
| 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 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]) |
| |
| 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, fHigh) |
| plt.plot(result) |
| plt.show() |