计算Python中感兴趣的频率F附近的每个频带的能量

时间:2015-06-05 06:17:30

标签: python signal-processing physics

我是信号处理的新手,在这个问题中,我想问一下如何为感兴趣的频率F周围的每个频段获取能量。我找到了一个公式,但我不知道如何在Python中实现它。这是公式和我的傅里叶变换图: enter image description here

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.

enter image description here

2 个答案:

答案 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