【问题标题】:how to make a high pass filter?如何制作高通滤波​​器?
【发布时间】:2020-01-25 01:37:37
【问题描述】:

我有一个海平面数据(时间、y、x)的 3D 数据矩阵,我通过取 FFT 的平方找到了功率谱,但低频确实占主导地位。我想通过应用高通滤波器来消除那些低频......我该怎么做呢? 数据集和结构/代码示例如下:

这是数据集和创建数组:

Yearmin = 2018
Yearmax = 2019
year_len = Yearmax - Yearmin + 1.0 # number of years

direcInput = "filepath"
a = s.Dataset(direcInput+"test.nc", mode='r') 

#creating arrays
lat = a.variables["latitude"][:] 
lon = a.variables["longitude"][:] 
time1 = a.variables["time"][:] #DAYS SINCE JAN 1ST 1950
sla = a.variables["sla"][:,:,:] #t, y, x
time = Yearmin + (year_len * (time1 - np.min(time1)) / ( np.max(time1) - np.min(time1))) 


#detrending and normalizing data 
def standardize(y, detrend = True, normalize = True):
    if detrend == True:
        y = signal.detrend(y, axis=0)
    y = (y - np.mean(y, axis=0))
    if normalize == True:
        y = y / np.std(y, axis=0)
    return y

sla_standard = standardize(sla)

print(sla_standard.shape) = (710, 81, 320)


#fft
fft = np.fft.rfft(sla_standard, axis=0)
spec = np.square(abs(fft))

frequencies = (0, nyquist, df)


#PLOTTING THE FREQUENCIES VS SPECTRUM FOR A FEW DIFFERENT SPATIAL LOCATIONS
plt.plot(frequencies, spec[:, 68,85])
plt.plot(frequencies, spec[:, 23,235])
plt.plot(frequencies, spec[:, 39,178])
plt.plot(frequencies, spec[:, 30,149])
plt.xlim(0,.05)
plt.show()

我的目标是制作原始时间序列 (sla_standard) 的高通滤波器,以去除两个真正的大峰值。我应该使用哪种类型的过滤器?谢谢!

【问题讨论】:

  • 高通实际上是低通滤波版本的减法。你知道如何实现低通吗?
  • 您可以使用任何您想要的过滤器,您必须根据您的需要决定过滤器的形状。一个简单的(非因果)高通滤波器是对信号执行傅里叶变换,将较低频率设置为零,然后进行傅里叶逆变换。

标签: python multidimensional-array filtering fft


【解决方案1】:

使用.axes.Axes.set_ylim 设置y 轴限制。

Axes.set_ylim(self, left=None, right=None, emit=True, auto=False, *, ymin=None, ymax=None)

因此,在您的情况下,ymin=None 并在开始绘图之前将 ymax 设置为例如 ymax=60000

因此plt.ylim(ymin=None, ymax=60000)

这里不应该提取数据,因为它“伪造结果”。你真正想要的是放大图表。独立于您阅读图表的人如果没有提前意识到,将会错误地解释数据。超出图表的峰值是可以的,因为每个人都明白这一点。

或者:

直接替换数组中的某些值(arr):

arr[arr > ori] = dest

例如在你的情况下ori=60000dest=1

大于 ">" 的所有值都被 1 替换。

【讨论】:

  • 啊是的...但我想对原始时间序列应用高通滤波器。不只是改变轴以消除 FFT 功率规范中的第一个和第二个峰值
  • 添加了将数组中的高值替换为您想要的任何值的方法。
  • 刚刚投反对票的人会不会看OP原文,把反对票去掉。需要明确的是,OP 声明:“我的目标是制作一个高通滤波器以去除两个非常大的峰值。我应该使用哪种类型的滤波器?谢谢!”。通过过滤器详细信息替换图表中的值以更改数组中的数据,然后才能显示它!
【解决方案2】:

不同的过滤器:正如您所说,过滤器作用于信号的频率。存在不同的滤波器形状,其中一些具有复杂的表达式,因为它们需要在实时处理(因果)中实现。但是,在您的情况下,您似乎对数据进行了后期处理。您可以使用傅里叶变换,这需要所有数据(非因果关系)。

要选择的过滤器:因此,您可以通过在频率上应用掩码直接在傅里叶域中执行过滤操作。如果你想去除频率,我建议你使用由 0 和 1 组成的二进制掩码。为什么?因为它是你能想到的最简单的过滤器。声明您完全删除了一些频率(说出来并证明它是合理的)在科学上是相关的。然而,更难说你让一些而对另一些有所衰减,并且你随意选择了衰减因子......

Python 实现

signal_fft = np.fft.rfft(sla_standard,axis=0)
mask = np.ones_like(sla_standard)
mask[freq_to_filter,...] = 0.0 # define here the frequencies to filter
filtered_signal = np.fft.irfft(mask*signal_fft,axis=0)

【讨论】:

    猜你喜欢
    • 2012-10-22
    • 2014-07-29
    • 2021-06-12
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2014-02-09
    • 2014-03-20
    相关资源
    最近更新 更多