如何在python中使用FFT中的采样频率和numpy中的Morlet小波

2024-10-16 17:15:05 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我一直在玩一些raw biosignal data,并试图学习python用于信号处理和特征提取

我有几个关于FFT和morlet小波构造的具体问题

FFT:我将一个信号存储在一个CSV文件中,其中包含80608个数据点。它包含所有原始1D数据。如果这很重要,则以每秒256个采样的速度从传感器获取信号

我的问题与快速傅里叶变换有关:

  1. 我应该对整个信号应用FFT吗
data = pd.read_csv('12-01-2016.csv')
signal = data['Electrode']  
samplingRate = len(signal) # 80608 

L = np.arange(1,np.floor(samplingRate/2),dtype='int') 

fhat = np.fft.fft(signal,samplingRate)
PSD = fhat*np.conj(fhat)/samplingRate

plt.plot(PSD[L],color='r',LineWidth=2,label="FFT of noisy signal") 
plt.legend()
plt.show()
  1. 或者我应该先对256个数据点应用FFT,然后再对整个信号应用256个数据点,依此类推,而不重叠,还是应该使用滑动窗口?因此,与本节相关的问题是,如果我将信号作为整个信号传递,并在FFT方法中采样为256而不是信号的全长,它会计算整个信号的FFT而不需要循环,还是只计算前256个样本?我是否必须使用for loop对每个循环中的256个点进行FFT
fhat = np.fft.fft(signal,samplingRate)
  1. 我在这里要做的是创建一个morlet小波,并对其应用FFT将其转换为频域。一旦完成,我将在频域中逐点相乘-signalFFT*morletFFT(逐点)并应用逆FFT返回滤波后的信号。我这里有两个问题

    a。当我通过正弦波和高斯波相乘来创建morlet小波时,如何选择频率(f)?该频率是否定义了被过滤掉的频率

    b。如何为创建morlet小波的步骤选择窗口,正如我在这里定义的步骤=np.linespace()中的-1和1一样

# creating a morlet wavelet
steps = np.linspace(-1,1,samplingRate) 
f = 150 # frequency 
s = 7/(2*np.pi*f) # this is the standard deviation of the gaussain

c_signal = np.cos(2*np.pi*f*steps) 
plt.plot(c_signal,color='r',LineWidth=2,label="Sine wave ") 
plt.legend()
plt.show()

gausian_win = np.exp(-(pow(steps, 2))/(2*pow(s,2)))
plt.plot(gausian_win,color='r',LineWidth=2,label="Gaussian window") 
plt.legend()
plt.show()

morlet = np.multiply(c_signal,gausian_win)

plt.plot(morlet,color='r',LineWidth=2,label="Morlet Wavelet") 
plt.legend()
plt.show()

整个练习的目的是提取信号中存在的ECG伪影。快速的谷歌搜索告诉我它在100-150hz窗口之间,所以我假设我需要一个小波,它可以作为带通滤波器,将除100-150hz之外的所有频率归零。为什么我要尝试这样的小波变换,因为我读过这样做比直接做小波变换计算效率更高,因为FFT真的很快

另一个问题是,如何将其应用于实时数据而不是静态数据

多谢各位

另外,我做得对吗?我做错什么了吗?我问得太多是因为我笨吗? 另外,随着我对这个问题的理解越来越清楚,我会更新这个问题。如果你愿意,我可以和你分享我的笔记本


Tags: 数据fftsignal信号plotnppltlabel