def initLanczos(self, filtOrder):
self.filtOrder = filtOrder
if self.filtOrder % 2 != 0:
raise Exception('Invalid filtOrder: ' + str(self.filtOrder) +
' Must be an even integer.')
radius = self.filtOrder // 2
win = np.sinc(np.linspace(-radius, radius, self.filtOrder+1) / float(radius)) # lanczos
#win = spsig.hamming(self.filtOrder+1) # sinc-hamming
# this should be automated somehow XXX - idfah
if self.filtOrder <= 6:
cutoff = 2*0.570
elif self.filtOrder <= 8:
cutoff = 2*0.676
elif self.filtOrder <= 12:
cutoff = 2*0.781
elif self.filtOrder <= 16:
cutoff = 2*0.836
elif self.filtOrder <= 32:
cutoff = 2*0.918
elif self.filtOrder <= 64:
cutoff = 2*0.959
# need to fix for multiple pool sizes XXX - idfah
cutoff /= float(self.poolSize)
taps = cutoff * np.linspace(-radius, radius, self.filtOrder+1, dtype=self.dtype)
impulseResponse = cutoff * np.sinc(taps) * win
self.filters = []
nReadoutLayers = 1 if self.nHidden is None else 2
for ni, no in self.layerDims[:-nReadoutLayers]:
noEmb = no*(self.filtOrder+1) # no outs after filter embedding
filtMat = np.zeros(noEmb*2, dtype=self.dtype)
filtMat[noEmb-1::-no] = impulseResponse
# filters strided for embedding
sz = filtMat.itemsize
filtMat = npst.as_strided(filtMat, (no,noEmb), strides=(sz,sz))[::-1].T
self.filters.append(filtMat.copy())
评论列表
文章目录