簡體   English   中英

計算Python中感興趣的頻率F附近的每個頻帶的能量

[英]Calculate energy for each frequency band around frequency F of interest in Python

我是信號處理的新手,在這個問題中,我想問一下如何為感興趣的頻率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.

在此輸入圖像描述

你幾乎就像麥克指出的那樣,但是這里有一個不同的方法,它更容易理解。你可以設置一個變量來保存濾波后的信號並返回一個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])

使用在1D numpy數組中使用Numpy查找局部最大值/最小值的信號處理模塊,您將執行以下操作:

from scipy.signal import argrelextrema
import numpy as np

delta = 0.1
F = 1
X_delta = abs(freq - F) < delta
A_f_delta = abs(f[X_delta])**2
maximum_ix = argrelextrema(A_f, np.greater)
E_F_delta = np.sum(A_f[maximum_ix])/2
E_F_delta
2453.8235776144866

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM