在移植matlab的算法程序到python中来发现,python中没有带czt算法的库函数,所以目前需要自己想办法解决一下。
实现from scipy.fftpack import fft
import numpy as np
def czt(x, m=None, w=None, a=1):
n = x.shape[0]
if m is None:
m = n
if w is None:
w = np.exp(-2j * np.pi / m)
if not isinstance(x, np.ndarray):
x = np.asarray(x, dtype=np.complex)
# Length for power-of-two fft.
nfft = 2 ** nextpow2(n + m - 1)
# Premultiply data.
k = np.arange(-n + 1, max((m, n))) ** 2 / 2
ww = w ** k # Chirp filter is 1./ww
# nn = n-1 : 2*n-1
aa = a ** (-np.arange(0, n)) * ww[n - 1:2 * n - 1]
y = x * aa
# Fast convolution via FFT.
fy = np.fft.fft(y, nfft) * np.fft.fft(1 / ww[:m + n - 1], nfft)
g = np.fft.ifft(fy)
# Finally multiply Chirp filter.
#print((g[n - 1:n + m - 1]).shape,(ww[n - 1:n + m - 1]).shape)
return g[n - 1:n + m - 1] * ww[n - 1:n + m - 1]/100
def nextpow2(n):
'''
求最接近数据长度的2的整数次方
An integer equal to 2 that is closest to the length of the data
Eg:
nextpow2(2) = 1
nextpow2(2**10+1) = 11
nextpow2(2**20+1) = 21
'''
return np.ceil(np.log2(np.abs(n))).astype('long')
我这里验证OK,这里我打印出我的参数。
print(IQ41,N_CZT,W,A)
CZT_IQ4=abs(czt(IQ41,N_CZT,W,A)) #ndarray
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)