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) :