blob: 541c60ae929d2196348007789834acdeceb43c3c [file] [log] [blame]
#!/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()