#!/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 validate 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()