使用python过滤频率

使用python过滤频率,python,numpy,signal-processing,fft,frequency,Python,Numpy,Signal Processing,Fft,Frequency,我是Python新手,如果这个问题很基本,请原谅 我有加速度计矢量幅度(acc_VM)信号,采样频率为100Hz。我必须找到这个信号的傅里叶变换,找到距离Df之间的基频 Df是与行走相对应的频率族。这里我们使用Df=[1.2,4]Hz。如何使用python选择频率范围Df=[1.2,4]Hz我应该实现过滤器还是combFunction()是正确的代码 def combFunction(n): combSignal = [] for element in n: if

我是Python新手,如果这个问题很基本,请原谅

我有加速度计矢量幅度(acc_VM)信号,采样频率为100Hz。我必须找到这个信号的傅里叶变换,找到距离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)

def-combFunction(n):
combSignal=[]
对于n中的元素:

如果元素>1.2且元素则FFT不会返回频率,而是返回一组固定的均匀间隔频率的振幅。 因此,您的
combFunction
(已实现)将拾取频谱振幅在1.2和4之间的组件

为了能够选择频率,您需要这些均匀分布的频率的对应阵列,您可以得到 从…起 请注意,您需要采样率(如果您的数据不是均匀采样的,则需要对其重新采样)。 在下面的代码中,我将使用变量
sampling\u rate
。然后,将通过以下公式给出频率:

freqs = np.fft.rfftfreq(len(data), sampling_rate)
现在,让我们提取与感兴趣频带内的那些频率对应的阵列索引:

in_band = np.where([f >= 1.2 and f <= 4 for f in freqs])[0]
这将在频率
f[频带内[峰值位置]]
处为您提供峰值频谱振幅
X[频带内[峰值位置]]
。 把所有这些放在一起,你会得到如下结果:

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)
def在频率范围内查找峰值(X、频率、fmin、fmax):

in_band=np。其中([f>=fmin和f),Df已在代码中实现
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)