Python Parsevals定理在Welch方法中的应用

Python Parsevals定理在Welch方法中的应用,python,fft,spectrum,Python,Fft,Spectrum,对于我的项目,我必须使用下面的代码手动编写welch方法。它几乎涉及通过fft找到光谱密度,并结合加窗和重叠分割 我需要知道我的PSD是否正确,所以我通过两种方法检查 PSD下的面积根应为均方根(E[x^2]),因为我已经从数据中去掉了我的平均值,这应等于数据的标准偏差 检查Parseval定理是否成立 有两个主要问题,我遇到了麻烦。首先,我得到一个0Hz的峰值,即使在开始时去掉平均值。我唯一能消除0Hz峰值的方法是在我分割并乘以窗口后去掉平均值。(##############) 有了峰值,点1

对于我的项目,我必须使用下面的代码手动编写welch方法。它几乎涉及通过fft找到光谱密度,并结合加窗和重叠分割

我需要知道我的PSD是否正确,所以我通过两种方法检查

  • PSD下的面积根应为均方根(E[x^2]),因为我已经从数据中去掉了我的平均值,这应等于数据的标准偏差
  • 检查Parseval定理是否成立 有两个主要问题,我遇到了麻烦。首先,我得到一个0Hz的峰值,即使在开始时去掉平均值。我唯一能消除0Hz峰值的方法是在我分割并乘以窗口后去掉平均值。(##############)

    有了峰值,点1保持良好,但没有峰值,标准偏差与RMS略有不同,但这不是一个大问题

    我的第二个问题是,我不能使帕塞瓦尔定理成立。我做错什么了吗?帕塞瓦尔的理论有必要成立吗?如果我的理论是错误的,请告诉我

    关于代码的几个注意事项:

    • 抱歉,如果编码效率不高,我还是个新手
    • 将fft除以(fs*(win*win.sum())是我通过研究发现的,也是内置Welch代码的一部分
    • 最后,我使用梯形规则进行积分
    • 我的FFT能量小了几个数量级(即E-09)

    import numpy as np import matplotlib.pyplot as plt import os import math from scipy.fftpack import fft, ifft, fftfreq, rfft from scipy.signal import detrend, get_window plt.clf() plt.close() ############################################################################### config = '1perc_damping' dir0 = os.getcwd() dir1 = dir0+'/'+config dir2 = dir1+'/Summary files' data = np.loadtxt(dir1 + '/000deg_500rpm_An_Mxx.dat') ############################################################################### fs = 625 nperseg = 1024 noverlap = 512 window_meth = 'hanning' ############################################################################### #detrend data = data - np.mean(data) #get windowing method win = get_window(window_meth, nperseg) # number of segments nseg = np.ceil((len(data)-nperseg)/(nperseg-noverlap)) + 1 total_n = nperseg + (nseg-1)*(nperseg-noverlap) # padding with zeros if total_n > len(data): n = total_n - len(data) padding = np.zeros(np.int(n)) data = np.concatenate((data,padding)) # fft fft_data = 0 for i in range(0,np.int(nseg)): start = i*(nperseg-noverlap) f_data = np.multiply(data[start:start+nperseg],win) f_data = f_data- np.mean(f_data) #### Detrend line ### transf = fft(f_data) transf_c = (transf*np.conj(transf))/(fs*(win*win).sum()) fft_data = fft_data + transf_c Pxx = np.real(fft_data)/(nseg) fx = fftfreq(nperseg, 1/fs) plt.figure(1) plt.plot(fx[0:512],2*Pxx[0:512]) #plt.plot(fx,Pxx) plt.figure(2) x = np.linspace(0,len(data),len(data)) plt.plot(x,data) #Finding RMS l = np.int(len(fx)/2 -1) c = 2 A = 0 for i in range(1,l+1): A = A + 0.5*(c*Pxx[i]+c*Pxx[i-1])*(fx[i]-fx[i-1]) RMS = np.sqrt(A) # Checking Parseval's theorem data_energy = 0 FFT_energy = 0 for i in range(1,l+1): FFT_energy = FFT_energy + 0.5*(np.power(c*Pxx[i],2)+np.power(c*Pxx[i-1],2))*(fx[i]-fx[i-1]) for i in range(1,len(data)): data_energy = data_energy + 0.5*(np.power(abs(data[][1][i]),2)+np.power(abs(data[i-1]),2))*(i-(i-1))*(1/625)
    将numpy作为np导入 将matplotlib.pyplot作为plt导入 导入操作系统 输入数学 从scipy.fftpack导入fft、ifft、fftfreq、rfft 从scipy.signal导入detrend,获取窗口 plt.clf() plt.close() ############################################################################### 配置='1perc\u阻尼' dir0=os.getcwd() dir1=dir0+'/'+config dir2=dir1+“/摘要文件” 数据=np.loadtxt(dir1+'/000deg_500rpm_An_Mxx.dat') ############################################################################### fs=625 nperseg=1024 noverlap=512 窗口法=‘汉宁’ ############################################################################### #德特伦德 数据=数据-np.平均值(数据) #获取窗口方法 win=获取窗口(窗口方法,nperseg) #段数 nseg=np.ceil((len(data)-nperseg)/(nperseg noverlap))+1 总计=nperseg+(nseg-1)*(nperseg noverlap) #用零填充 如果总长度>长度(数据): n=总长度(数据) padding=np.zero(np.int(n)) data=np.concatenate((数据,填充)) #快速傅里叶变换 fft_数据=0 对于范围(0,np.int(nseg))中的i: 开始=i*(nperseg noverlap) f_data=np.multiply(数据[start:start+nperseg],赢) f#u数据=f#u数据-np.平均值(f#u数据)######## transf=fft(f_数据) transf_c=(transf*np.conj(transf))/(fs*(win*win.sum()) fft\u数据=fft\u数据+传输 Pxx=np.real(fft_数据)/(nseg) fx=fftfreq(nperseg,1/fs) plt.图(1) plt.绘图(fx[0:512],2*Pxx[0:512]) #plt.绘图(fx、Pxx) plt.图(2) x=np.linspace(0,len(数据),len(数据)) plt.绘图(x,数据) #查找RMS l=np.int(len(fx)/2-1) c=2 A=0 对于范围(1,l+1)内的i: A=A+0.5*(c*Pxx[i]+c*Pxx[i-1])*(fx[i]-fx[i-1]) RMS=np.sqrt(A) #检验Parseval定理 数据能量=0 FFT_能量=0 对于范围(1,l+1)内的i: FFT_能量=FFT_能量+0.5*(np.功率(c*Pxx[i],2)+np.功率(c*Pxx[i-1],2))*(fx[i]-fx[i-1]) 对于范围(1,len(数据))中的i: 数据能量=数据能量+0.5*(np.功率(abs(数据[1][i]),2)+np.功率(abs(数据[i-1]),2))*(i-(i-1))*(1/625)

    这应该是在,还是在交换?是的,这不是关于编码问题,而是关于数学算法的预期结果。你可能会在其中一个与数学相关的SEs上获得更多的关注。请看,能否提供输入数据或链接?另外,为了节省我们回答您的问题的时间,您能否将您的示例剥离到演示问题的最少代码?(例如,我们不必花时间来重现您的目录结构)。非常感谢。