使用python过滤频率
我是Python新手,如果这个问题很基本,请原谅 我有加速度计矢量幅度(acc_VM)信号,采样频率为100Hz。我必须找到这个信号的傅里叶变换,找到距离Df之间的基频 Df是与行走相对应的频率族。这里我们使用Df=[1.2,4]Hz。如何使用python选择频率范围Df=[1.2,4]Hz我应该实现过滤器还是combFunction()是正确的代码使用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
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)