def CQT_fast(x,fs,bins,fmin,fmax,M):
threshold = 0.0054 #for Hamming window
K = int(bins*np.ceil(np.log2(fmax/fmin)))
Q = 1/(2**(1/bins)-1)
nfft = np.int32(nearestPow2(np.ceil(Q*fs/fmin)))
tempKernel = np.zeros(nfft, dtype = np.complex)
specKernel = np.zeros(nfft, dtype = np.complex)
sparKernel = []
#create sparse Kernel
for k in range(K-1,-1,-1):
fk = (2**(k/bins))*fmin
N = np.int32(np.round((Q*fs)/fk))
tempKernel[:N] = hamming(N)/N * np.exp(-2*np.pi*1j*Q*np.arange(N)/N)
specKernel = fft(tempKernel)
specKernel[np.where(np.abs(specKernel) <= threshold)] = 0
if k == K-1:
sparKernel = specKernel
else:
sparKernel = np.vstack((specKernel, sparKernel))
sparKernel = np.transpose(np.conjugate(sparKernel))/nfft
ft = fft(x,nfft)
cqt = np.dot(ft, sparKernel)
ft = fft(x,nfft*(2**M))
#calculate harmonic power spectrum
#harm_pow = HPS(ft,M)
#cqt = np.dot(harm_pow, sparKernel)
return cqt
评论列表
文章目录