Python Parsevals定理在Welch方法中的应用
对于我的项目,我必须使用下面的代码手动编写welch方法。它几乎涉及通过fft找到光谱密度,并结合加窗和重叠分割 我需要知道我的PSD是否正确,所以我通过两种方法检查Python Parsevals定理在Welch方法中的应用,python,fft,spectrum,Python,Fft,Spectrum,对于我的项目,我必须使用下面的代码手动编写welch方法。它几乎涉及通过fft找到光谱密度,并结合加窗和重叠分割 我需要知道我的PSD是否正确,所以我通过两种方法检查 PSD下的面积根应为均方根(E[x^2]),因为我已经从数据中去掉了我的平均值,这应等于数据的标准偏差 检查Parseval定理是否成立 有两个主要问题,我遇到了麻烦。首先,我得到一个0Hz的峰值,即使在开始时去掉平均值。我唯一能消除0Hz峰值的方法是在我分割并乘以窗口后去掉平均值。(##############) 有了峰值,点1
- 抱歉,如果编码效率不高,我还是个新手
- 将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上获得更多的关注。请看,能否提供输入数据或链接?另外,为了节省我们回答您的问题的时间,您能否将您的示例剥离到演示问题的最少代码?(例如,我们不必花时间来重现您的目录结构)。非常感谢。