You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Welch周期图的湍流密度谱积分无法还原流向速度波动问题

湍流密度谱积分还原速度波动的问题

我尝试使用Welch周期图计算湍流密度谱,结果看似正常,但通过谱积分无法得到预期的流向速度波动值。以下是我的代码:

sr = 833.3  # Sampling rate i.e. samples per second (1/dt with dt=0.0012)
Nysquid = sr/2

# Perform Welch's periodogram with Hann window and 50% overlap
seg_len = 4
segment = int(seg_len * sr)
myhann = signal.get_window('hann', segment)

# obtain Power density with Hann window and 50% overlap
myparams2 = dict(fs = sr, nperseg = segment, window = myhann, 
                 noverlap = segment/2, scaling = 'density', return_onesided=True)

# xdat is an array composed of the streamwise velocity at a given
# location and for many times.
freqn, xn = signal.welch(x = xdat, **myparams2)

我通过实测数据计算速度波动的代码如下:

U = xdat
U_std = np.std(U)
print("uu=", 0.5 * U_std**2) 

理论上我应该能通过积分谱还原该值,但未能成功。请问使用能量谱还原速度波动的正确表达式是什么?


解决方案

核心问题出在窗口能量修正和功率谱密度的积分逻辑上,以下是正确的处理方式:

1. 明确功率谱密度的积分关系

当scaling='density'时,Welch返回的是功率谱密度(PSD),单位为(速度)^2 / Hz。对单侧谱(return_onesided=True)积分的结果等于信号的均方值(即U_std²),而你需要的0.5*U_std²是湍流动能波动,因此积分后取一半即可。

2. 窗口能量修正

Hann窗口会引入能量损失,因为窗口系数的平方和不等于样本数。你有两种修正方式:

方式一:窗口初始化时自动归一化

调用signal.get_window时添加fftbins=True参数,让窗口满足FFT能量归一化要求:

myhann = signal.get_window('hann', segment, fftbins=True)

方式二:手动修正谱值

计算窗口的能量修正因子,对得到的PSD进行修正:

window_correction = 1 / (np.sum(myhann**2) / segment)
xn_corrected = xn * window_correction

3. 正确的积分代码

完成修正后,通过积分还原速度波动:

# 计算频率间隔
df = freqn[1] - freqn[0]
# 积分PSD得到均方值
uu_from_spectrum = np.trapz(xn_corrected, freqn)  # 或用 np.sum(xn_corrected * df)
# 输出湍流动能波动值
print("uu from spectrum=", 0.5 * uu_from_spectrum)

关键验证

修正后,积分得到的0.5*uu_from_spectrum应该和你直接计算的0.5*U_std²基本一致,误差来源于Welch方法的统计特性和窗口的微小影响。


内容的提问来源于stack exchange,提问作者Martin7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:05:20