【问题标题】:Filter frequency using python使用python过滤频率
【发布时间】:2021-06-11 00:59:07
【问题描述】:

我是 Python 新手,如果这个问题非常基础,请见谅。

我有采样频率为 100Hz 的加速度计矢量幅度 (acc_VM) 信号。我必须找到这个信号的傅里叶变换并找到范围 Df 之间的基频。

Df 是与行走相对应的频率族。这里我们使用 Df = [1.2, 4]Hz。如何使用 python 选择频率范围 Df = [1.2, 4]Hz 我应该实现过滤器还是 combFunction() 是正确的代码?

def combFunction(n):
    combSignal = []
    for element in n:
        if element>1.2 and element<4 :
            combSignal.append(element)
        else:
            combSignal.append(0)
    return np.maximum(combSignal)

def hann(total_data):
    hann_array = np.zeros(total_data)
    for i in range(total_data):
        hann_array[i] = 0.5 - 0.5 * np.cos((2 * np.pi * i)/(total_data - 1))
    return hann_array

def calculate_FT(x):
    hann_weight = hann(len(x))
    x_multiplied_hann = x * hann_weight
    X = np.abs(np.fft.rfft(x_multiplied_hann))
         combSignal = combFunction(X)

calculate_FT(acc_VM)

【问题讨论】:

  • 谢谢老哥,Df已经在代码''''''中实现了

标签: python numpy signal-processing fft frequency


【解决方案1】:

FFT 不返回频率,而是返回一组固定的均匀间隔频率的振幅数组。 因此,您的 combFunction 在实施时会选择频谱幅度在 1.2 和 4 之间的组件。

为了能够选择频率,您需要这些均匀间隔的频率的相应数组,您可以获得 来自np.fft.rfftfreq。 请注意,您将需要采样率(如果您的数据未均匀采样,则需要重新采样)。 在接下来的代码中,我将为此使用变量sampling_rate。然后频率将由下式给出:

freqs = np.fft.rfftfreq(len(data), sampling_rate)

现在让我们提取与感兴趣频带内的频率对应的数组索引:

in_band = np.where([f >= 1.2 and f <= 4 for f in freqs])[0]

那么你可能会得到这个波段内原始频谱X有一个峰值的位置:

peak_location = np.argmax(X[in_band])

它会在频率 f[in_band[peak_location]] 处为您提供峰值频谱幅度 X[in_band[peak_location]]。 将它们放在一起应该会给您以下内容:

def find_peak_in_frequency_range(X, freqs, fmin, fmax):
  in_band = np.where([f >= fmin and f <= fmax for f in freqs])[0]
  peak_location = np.argmax(X[in_band])
  return f[in_band[peak_location]], X[in_band[peak_location]]

def calculate_FT(x, sampling_rage):
  hann_weight = hann(len(x))
  x_multiplied_hann = x * hann_weight
  X = np.abs(np.fft.rfft(x_multiplied_hann))
  freqs = np.fft.rfftfreq(len(x), sampling_rate)
  peakFreq,peakAmp = find_peak_in_frequency_range(X, freqs, 1.2, 4)

请注意,使用spectrum estimation method(例如scipy.signal.welch)可能会获得更好的结果,而不是简单地进行 FFT。

为了便于说明,我在sample data set 上运行了上述内容(文件1.csv 进行了一些重新采样):

【讨论】:

  • 谢谢你的详细解释?。感谢您的努力,再次感谢您。
猜你喜欢
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
相关资源
最近更新 更多