Пример #1
0
def hrtfComponentsFromDeltas(ordersToShow, spectrumBins, spectralRange) :
	f = spectralRange/float(spectrumBins) * numpy.arange(spectrumBins)
	w = f*2*math.pi
	azimuths = numpy.arange(-90+.1,90,5)
	print "Computing simplified delays..."
	distancesSimplified = numpy.array([
		bmaudio.sphericalHeadDelaySimplified(numpy.radians(a),R,r)
		for a in azimuths
		])
	relativeDistancesSimplified = distancesSimplified + R - r # force closer distance be 0
	delaysSimplified = relativeDistancesSimplified / c  # distance -> time

	print "Computing 3D spherical harmonics..."
	sphericalHarmonics = numpy.zeros((len(ordersToShow), len(azimuths)))
	for i,l in enumerate(ordersToShow) :
		sphericalHarmonics[i,:] = numpy.sqrt(2*l+1)/2. * scipy.special.legendre(l)(numpy.sin(numpy.radians(-azimuths)))

	print "Computing components by adding freq domain deltas..."
	componentsFromDeltas = numpy.zeros((len(ordersToShow), spectrumBins), dtype=numpy.complex)
	for i,l in enumerate(ordersToShow) :
		for a,sh,d in zip(azimuths, sphericalHarmonics[i,:], delaysSimplified) :
			# cos(a) because is the sphere. the whole azimuth shares delay and gain
			componentsFromDeltas[i,:] += numpy.cos(numpy.radians(a))*sh*numpy.exp(-1j*w*d)
	componentsFromDeltas /= len(azimuths) # because we are adding those many deltas
	componentsFromDeltas *= numpy.pi # TODO: why? where we missed it

	return componentsFromDeltas
decoding=decodings[decodingName](maxOrder)
print "decoding", decoding, "order", maxOrder


print "Computing delays..."
distances = numpy.array([
	bmaudio.sphericalHeadDelay(numpy.radians(a),R,r)
	for a in azimuths
	])
relativeDistances = distances + R - r # force closer distance be 0
delays = relativeDistances / c  # distance -> time


print "Computing simplified delays..."
distancesSimplified = numpy.array([
	bmaudio.sphericalHeadDelaySimplified(numpy.radians(a),R,r)
	for a in azimuths
	])
relativeDistancesSimplified = distancesSimplified + R - r # force closer distance be 0
delaysSimplified = relativeDistancesSimplified / c  # distance -> time


print "Computing spherical harmonics..."
sphericalHarmonics = numpy.zeros((maxOrder+1, len(azimuths)))
for l in xrange(maxOrder+1) :
	sphericalHarmonics[l,:] = numpy.sqrt(2*l+1)/2. * scipy.special.legendre(l)(numpy.sin(numpy.radians(-azimuths)))


print "Computing components..."
components = numpy.zeros((maxOrder+1, spectrumBins), dtype=numpy.complex)
for l in xrange(maxOrder+1) :