我是信号处理的新手,在这个问题中,我想问一下如何为感兴趣的频率F周围的每个频段获取能量。我找到了一个公式,但我不知道如何在Python中实现它。这是公式和我的傅里叶变换图:
x = np.linspace(0,5,100)
y = np.sin(2*np.pi*x)
## fourier transform
f = np.fft.fft(y)
## sample frequencies
freq = np.fft.fftfreq(len(y), d=x[1]-x[0])
plt.plot(freq, abs(f)**2) ## will show a peak at a frequency of 1 as it should.
答案 0 :(得分:2)
你几乎就像Mike所指出的那样,这里有一个更容易理解的不同方法。你可以设置一个包含过滤信号的变量并返回一个Af的1d数组,然后应用上面的公式非常简单(这些幅度的平方和)
过滤掉这样的信号
from scipy.signal import butter, lfilter
def butter_bandpass(lowcut, highcut, fs, order=5):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
b, a = butter(order, [low, high], btype='band')
return b, a
def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
b, a = butter_bandpass(lowcut, highcut, fs, order=order)
y = lfilter(b, a, data)
return y
现在假设y
是您的原始信号,您需要信号中 5Hz 分量的能量,
#let fs = 250
#let order = 5
oneD_array_of_amps_of_fiveHz_component = butter_bandpass_filter(y, 4, 6, 250, 5)
#calculate energy like this
energy_of_fiveHz_comp = sum([x*2 for x in oneD_array_of_amps_of_fiveHz_component])
答案 1 :(得分:0)
使用Finding local maxima/minima with Numpy in a 1D numpy array中的信号处理模块,您将执行以下操作:
res[country, sex, job][age] = cnt