我有一个5000个点x
和y
的信号当我手动使用离散傅立叶变换时,可以创建一个控制系数数量的系数列表,系数越多,对原始信号的近似度越大。
在下面的示例中,存在5000 points
的信号,其在经过DFT之后生成具有201 coefficients
的列表。
但是当使用fft()
函数时,我无法控制系数的数量。
有没有办法使用numpy
或scipy
,或者它们的fft functions
来生成同样的201个系数,而不是生成5000个系数?
import matplotlib.pyplot as plt
import numpy as np
from math import tau
from scipy.integrate import quad_vec
from scipy.fft import fft
def f(t, t_list, x_list, y_list):
return np.interp(t, t_list, x_list + 1j*y_list)
N = 5000
t_list = np.linspace(0, 2*np.pi, N)
r = (((0.0*np.pi<=t_list) * (t_list<=0.5*np.pi)) * 1/np.cos(t_list-0.25*np.pi) +
((0.5*np.pi<t_list) * (t_list<=1.0*np.pi)) * 1/np.cos(t_list-0.75*np.pi) +
((1.0*np.pi<t_list) * (t_list<=1.5*np.pi)) * 1/np.cos(t_list-1.25*np.pi) +
((1.5*np.pi<t_list) * (t_list<=2.0*np.pi)) * 1/np.cos(t_list-1.75*np.pi))
# create de signal a square form
x_list, y_list = np.cos(t_list) * r, np.sin(t_list) * r
fig, ax = plt.subplots(figsize=(5, 5))
ax.set_aspect('equal')
ax.plot(x_list, y_list)
print('x length list: ', len(x_list)) #5000 points
print('y length list: ', len(y_list)) #5000 points
order = 100 # -order to order i.e -100 to 100
# you can change the order to get proper figure
# too much is also not good, and too less will not produce good result
print("generating coefficients ...")
# lets compute fourier coefficients from -order to order
c = []
# we need to calculate the coefficients from -order to order
for n in range(-order, order+1):
# calculate definite integration from 0 to 2*PI
# formula is given in readme
coef = 1/tau*quad_vec(lambda t: f(t, t_list, x_list, y_list)*np.exp(-n*t*1j), 0, tau, limit=100, full_output=1)[0]
c.append(coef)
print("completed generating coefficients.")
c = np.array(c)
print('c length list: ', len(c))
# convert x and y to complex number
z = x_list + 1j*y_list
# get coeff of all element of list
coeff_fft = fft(z)
print('coeff_fft length list: ', len(coeff_fft))
输出
x length list: 5000
y length list: 5000
generating coefficients ...
completed generating coefficients.
c length list: 201
coeff_fft length list: 5000
1条答案
按热度按时间bvk5enib1#
N个样本的DFT有N个值,如果小于N,变换就不可逆,当然你可以计算变换的各个元素。
FFT(调用
fft()
时使用)是一种计算DFT的快速算法。它之所以快是因为它计算的是整个变换,而不是单个元素。我不知道标准库中有哪个函数可以计算DFT的单个值。但正如你所展示的,编写这样的函数很容易。所以,要么像现在这样手动计算这201个值,要么使用
fft()
计算整个DFT并挑选出你需要的值。哪一种更快取决于你需要多少值以及你有多少样本。