快速傅里叶变换信号重构的奇异结果

2024-04-23 21:45:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些数据,如下图所示,我有兴趣找到它的一些傅里叶级数系数。你知道吗

r = np.array([119.80601628, 119.84629291, 119.85290735, 119.45778804,
   115.64497439, 105.58519852, 100.72765819, 100.04327702,
   100.08590518, 100.35824977, 101.58424993, 105.47976376,
   112.27556007, 117.07679226, 118.99998888, 119.60458086,
   119.78624424, 119.83022022, 119.36116943, 115.72323767,
   106.58946834, 101.19479124, 100.11537349, 100.13313755,
   100.41846106, 101.42255377, 104.33650237, 109.73625492,
   115.14763728, 118.24665037, 119.35359999, 119.68061835])

z = np.array([-411.42980545, -384.98596279, -358.13032372, -330.89578468,
   -303.39129113, -275.76248957, -248.24478443, -221.07069838,
   -194.33260984, -168.05271807, -142.19357982, -116.62090103,
    -91.15354178,  -65.56745626,  -39.65284757,  -13.29632162,
     13.54374939,   40.84929432,   68.50496394,   96.33720787,
    124.08525182,  151.36802193,  177.98791952,  204.0805317 ,
    229.85399128,  255.44727674,  281.02166554,  306.75399703,
    332.74638285,  359.05528646,  385.74336711,  412.8189858 ])

plt.plot(z, r, label='data')
plt.legend()

enter image description here 然后我计算平均采样周期,因为它不是常数,如Z变量所示:

l = []
for i in range(32-1):
    l.append(z[i]-z[i+1])
Ts = np.mean(l)

然后我计算fft: 从scipy.FFT包装导入fft

rf = scipy.fftpack.fft(r)

对于信号重建:

fs = 1/Ts

amp = np.abs(rf)/r.shape[0]
n = r.shape[0]
s = 0
for i in range(n//2):

    phi = np.angle(rf[i], deg=False)
    a   = amp[i]
    k   = i*fs/n

    s += a*np.cos(2*np.pi*k  *(z)  +phi)

plt.plot(z, s, label='fft result')
plt.plot(z, r, label='data')
plt.legend()

enter image description here

结果是奇怪的,但无论是在振幅和频率方面。你知道吗


Tags: infftfordataplotnprangeplt
1条回答
网友
1楼 · 发布于 2024-04-23 21:45:21

复谱是一个范围为(-fMax/2,…,+fMax/2)的对称谱。 你只使用了光谱的右侧正片。这意味着,你重建的信号只包含一半的频谱频率。 因为光谱是对称的,所以你所要做的就是把计算出的绝对值加倍。然而,有一个重要的例外。直流值振幅[0]不得加倍。你知道吗

相关问题 更多 >