总的来说,我想计算给定数据集的傅里叶变换并过滤掉一些具有最大绝对值的频率。所以:
1)给定一个带有时间 t 的数据数组 D,2)找到 k 个最大的傅里叶系数,3)从数据中删除这些系数,以便从原始数据中滤除某些信号。
在绘制给定时间内过滤后的数据集时,最终会出现问题。我不太确定错误在哪里。最终的“过滤数据”图看起来甚至没有稍微平滑,并且与原始数据相比以某种方式改变了其位置。我的代码完全糟糕吗?
第1部分):
n = 1000
limit_low = 0
limit_high = 0.48
D = np.random.normal(0, 0.5, n) + np.abs(np.random.normal(0, 2, n) * np.sin(np.linspace(0, 3*np.pi, n))) + np.sin(np.linspace(0, 5*np.pi, n))**2 + np.sin(np.linspace(1, 6*np.pi, n))**2
scaling = (limit_high - limit_low) / (max(D) - min(D))
D = D * scaling
D = D + (limit_low - min(D)) # given data
t = linspace(0,D.size-1,D.size) # times
第2部分):
from numpy import linspace
import numpy as np
from scipy import fft, ifft
D_f = fft.fft(D) # fft of D-dataset
#---extract the k biggest coefficients out of D_f ---
k = 15
I, bigvals = [], []
for i in np.argsort(-D_f):
if D_f[i] not in bigvals:
bigvals.append(D_f[i])
I.append(i)
if len(I) == k:
break
bigcofs = np.zeros(len(D_f))
bigcofs[I] = D_f[I] # array with only zeros in in except for the k maximal coefficients
第 3 部分):
D_filter = fft.ifft(bigcofs)
D_new = D - D_filter
p1=plt.plot(t,D,'r')
p2=plt.plot(t,D_new,'b');
plt.legend((p1[0], p2[0]), ('original data', 'filtered data'))
感谢您的帮助,提前致谢。
largeQ
相关分类