随机波浪的谱分析
常用的二维波能谱分析方法有两种,一种为自相关函数(协方差函数)法,另一种为快速傅里叶变换法。自相关函数法含有能量分布的信息,快速傅里叶变换法则更加直接快速。
自相关函数法
自相关函数法主要思路是首先求解自相关函数,然后对自相关函数进行傅里叶变换得出波浪谱的粗谱,最后通过窗函数对数据进行平滑。
1. 求自相关函数
假设现有M个规则波叠加产生的随机波浪可表示为:
ζ
(
x
,
t
)
=
∑
i
=
1
M
a
i
cos
(
k
i
x
−
ω
i
t
+
ε
i
)
\zeta (x,t)= \displaystyle\sum_{i=1}^M a_i \cos(k_i x-\omega_it+\varepsilon_i)
ζ(x,t)=i=1∑Maicos(kix−ωit+εi)
ζ
(
x
,
t
)
\zeta (x,t)
ζ(x,t)为齐次平稳的,具有各态历经性,数学期望
E
[
ζ
(
x
,
t
)
]
=
0
\Epsilon[\zeta (x,t)]=0
E[ζ(x,t)]=0,自相关函数如下式表示:
R
η
η
(
τ
)
=
E
[
ζ
(
x
,
t
)
ζ
(
x
,
t
+
τ
)
]
=
ζ
(
x
,
t
)
ζ
(
x
,
t
+
τ
)
‾
R_{\eta\eta}(\tau)=\Epsilon[\zeta (x,t)\zeta (x,t+\tau)]=\overline{\zeta (x,t)\zeta (x,t+\tau)}
Rηη(τ)=E[ζ(x,t)ζ(x,t+τ)]=ζ(x,t)ζ(x,t+τ)
上面这个是数学公式,但是在实际操作中由于采样数据为离散的,所以要对上式进行离散化处理,方法如下:
假设采样数据点数为N,采样时间间隔为
Δ
t
\Delta t
Δt,则相关函数可以表示为
R
(
τ
)
=
R
(
ν
Δ
t
)
=
1
N
−
ν
∑
n
=
1
N
−
ν
ζ
(
t
n
+
ν
Δ
t
)
ζ
(
t
n
)
τ
=
ν
Δ
t
,
ν
=
0
,
1
,
2
…
m
R(\tau)=R(\nu\Delta t)=\frac{1}{N-\nu} \displaystyle\sum_{n=1}^{N-\nu} \zeta(t_n+\nu \Delta t) \zeta(t_n)\\ \tau=\nu \Delta t, \quad \nu=0,1,2 \ldots m
R(τ)=R(νΔt)=N−ν1n=1∑N−νζ(tn+νΔt)ζ(tn)τ=νΔt,ν=0,1,2…m
这其中的m与前文中所述M是可以理解为同一个值,这是因为靶谱中离散设定的频率个数是M个,那么理论上讲频谱中也就应该有M个。当然我们在开始时并不知道造波时采用了多少个离散频率在波浪中,所以可以根据情况进行设定,在后面做谱的时候,设定的m为多大,就会有多少个离散频率值,设的m值越大,谱中的频率数越多。
将上式拆开进行分析,如下:
ν
=
0
R
(
0
)
=
1
N
[
ζ
(
t
1
)
ζ
(
t
1
)
+
ζ
(
t
2
)
ζ
(
t
2
)
+
…
+
ζ
(
t
N
−
1
)
ζ
(
t
N
−
1
)
+
ζ
(
t
N
)
ζ
(
t
N
)
]
ν
=
1
R
(
Δ
t
)
=
1
N
−
1
[
ζ
(
t
1
+
Δ
t
)
ζ
(
t
1
)
+
ζ
(
t
2
+
Δ
t
)
ζ
(
t
2
)
+
…
+
ζ
(
t
N
−
2
+
Δ
t
)
ζ
(
t
N
−
2
)
+
ζ
(
t
N
−
1
+
Δ
t
)
ζ
(
t
N
−
1
)
]
ν
=
2
R
(
2
Δ
t
)
=
1
N
−
2
[
ζ
(
t
1
+
2
Δ
t
)
ζ
(
t
1
)
+
ζ
(
t
2
+
2
Δ
t
)
ζ
(
t
2
)
+
…
+
ζ
(
t
N
−
3
+
2
Δ
t
)
ζ
(
t
N
−
3
)
+
ζ
(
t
N
−
2
+
2
Δ
t
)
ζ
(
t
N
−
2
)
]
…
ν
=
m
R
(
m
Δ
t
)
=
1
N
−
m
[
ζ
(
t
1
+
m
Δ
t
)
ζ
(
t
1
)
+
ζ
(
t
2
+
m
Δ
t
)
ζ
(
t
2
)
+
…
+
ζ
(
t
N
−
m
+
m
Δ
t
)
ζ
(
t
N
−
m
)
]
\nu=0 \quad R(0)=\frac{1}{N}[\zeta(t_1)\zeta(t_1)+\zeta(t_2)\zeta(t_2)+\ldots+\zeta(t_{N-1})\zeta(t_{N-1})+\zeta(t_{N})\zeta(t_{N})]\\ \nu=1 \quad R(\Delta t)=\frac{1}{N-1}[\zeta(t_1+\Delta t)\zeta(t_1)+\zeta(t_2+\Delta t)\zeta(t_2)+\ldots+\zeta(t_{N-2}+\Delta t)\zeta(t_{N-2})+\zeta(t_{N-1}+\Delta t)\zeta(t_{N-1})]\\ \nu=2 \quad R(2\Delta t)=\frac{1}{N-2}[\zeta(t_1+2\Delta t)\zeta(t_1)+\zeta(t_2+2\Delta t)\zeta(t_2)+\ldots+\zeta(t_{N-3}+2\Delta t)\zeta(t_{N-3})+\zeta(t_{N-2}+2\Delta t)\zeta(t_{N-2})]\\ \ldots \\ \nu=m \quad R(m\Delta t)=\frac{1}{N-m}[\zeta(t_1+m\Delta t)\zeta(t_1)+\zeta(t_2+m\Delta t)\zeta(t_2)+\ldots+\zeta(t_{N-m}+m\Delta t)\zeta(t_{N-m})]
ν=0R(0)=N1[ζ(t1)ζ(t1)+ζ(t2)ζ(t2)+…+ζ(tN−1)ζ(tN−1)+ζ(tN)ζ(tN)]ν=1R(Δt)=N−11[ζ(t1+Δt)ζ(t1)+ζ(t2+Δt)ζ(t2)+…+ζ(tN−2+Δt)ζ(tN−2)+ζ(tN−1+Δt)ζ(tN−1)]ν=2R(2Δt)=N−21[ζ(t1+2Δt)ζ(t1)+ζ(t2+2Δt)ζ(t2)+…+ζ(tN−3+2Δt)ζ(tN−3)+ζ(tN−2+2Δt)ζ(tN−2)]…ν=mR(mΔt)=N−m1[ζ(t1+mΔt)ζ(t1)+ζ(t2+mΔt)ζ(t2)+…+ζ(tN−m+mΔt)ζ(tN−m)]
上式中每一个 R ( ν Δ t ) R(\nu\Delta t) R(νΔt)均可以求出相应的值,编程中仅需采用一次循环就可实现,matlab代码如下:
Data=Surf-mean(Surf);%变量Surf为波面采样数组,变量Data是变量Surf数学期望归零的数组
N=length(Data);%获得采样点个数
dt=1/fs;%此处fs为采样频率,可以在前期前面进行设定,dt为采样周期
M=N/30;%这里设置M为采样点个数的1/30个
% 自相关方程计算
for v=0:M
R(v+1)=sum(Data(1+v:N).*Data(1:N-v))/(N-v);
end
2. 进行傅里叶变换,求得波浪谱粗谱
自相关函数与谱密度函数存在Fourier变换关系,即所谓的纳维-辛钦定理,公式如下:
S
(
ω
)
=
2
π
∫
0
∞
R
(
τ
)
cos
(
ω
τ
)
d
τ
或
S
(
f
)
=
4
∫
0
∞
R
(
τ
)
cos
(
2
π
f
τ
)
d
τ
S(\omega)=\frac{2}{\pi} \int_0^\infty R(\tau) \cos(\omega \tau)d\tau\\ 或\\ S(f)=4\int_0^\infty R(\tau) \cos(2 \pi f \tau)d\tau
S(ω)=π2∫0∞R(τ)cos(ωτ)dτ或S(f)=4∫0∞R(τ)cos(2πfτ)dτ
谱密度函数分布的频率范围为
[
0
,
f
N
]
[0,f_N]
[0,fN],其中
f
N
f_N
fN为奈奎斯特频率(Nyquist frequency),等于离散信号采样频率的一半,为
f
N
=
ω
N
2
π
=
1
2
Δ
t
f_N=\frac{\omega_N}{2\pi}=\frac{1}{2\Delta t}
fN=2πωN=2Δt1
令
f
n
=
n
m
f
N
,
n
=
0
,
1
,
2
…
m
f_n=\frac{n}{m}f_N,n=0,1,2\ldots m
fn=mnfN,n=0,1,2…m,则
S
′
(
f
n
)
=
2
π
∑
τ
=
0
m
Δ
t
R
(
τ
)
cos
(
ω
n
τ
)
d
τ
=
2
π
∑
ν
=
0
m
R
(
ν
Δ
t
)
cos
(
ω
n
ν
Δ
t
)
Δ
t
S'(f_n)=\frac{2}{\pi}\displaystyle\sum_{\tau=0}^{m\Delta t}R(\tau)\cos(\omega_n \tau)d \tau=\frac{2}{\pi}\displaystyle\sum_{\nu=0}^{m}R(\nu \Delta t) \cos(\omega_n \nu \Delta t) \Delta t
S′(fn)=π2τ=0∑mΔtR(τ)cos(ωnτ)dτ=π2ν=0∑mR(νΔt)cos(ωnνΔt)Δt
考虑到
ω
n
=
2
π
f
n
=
2
π
n
m
f
N
=
2
π
n
m
1
2
Δ
t
\omega_n=2\pi f_n=2\pi \frac{n}{m}f_N=2\pi\frac{n}{m}\frac{1}{2\Delta t}
ωn=2πfn=2πmnfN=2πmn2Δt1,则
ω
n
Δ
t
=
π
n
m
\omega_n\Delta t=\frac{\pi n}{m}
ωnΔt=mπn,并采用梯形法求积分,得到如下式子:
S
′
(
f
n
)
=
2
Δ
t
π
[
1
2
R
(
0
)
+
∑
ν
=
1
m
−
1
R
(
ν
Δ
t
)
cos
π
ν
n
m
+
1
2
R
(
m
Δ
t
)
cos
(
n
π
)
]
n
=
0
,
1
,
2
,
…
,
m
S'(f_n)=\frac{2\Delta t}{\pi}[\frac{1}{2}R(0)+\sum_{\nu=1}^{m-1}R(\nu \Delta t)\cos\frac{\pi\nu n}{m}+\frac{1}{2}R(m\Delta t)\cos(n\pi)]\\ n=0,1,2,\ldots,m
S′(fn)=π2Δt[21R(0)+ν=1∑m−1R(νΔt)cosmπνn+21R(mΔt)cos(nπ)]n=0,1,2,…,m
matlab代码实现如下:
df=1/(2*M*dt);
for n=0:M
L_sum=0;
for v=1:M-1
L_sum=R(v+1)*cos(2*pi*(n-1)*df*v*dt)+L_sum;
end
L(n+1)=2*dt/pi*(R(1)/2+L_sum+1/2*R(M+1)*cos(2*pi*n*df*M*dt));
end
3. 对粗谱进行光顺
以上代码中的L(N)即为粗谱,但该谱显示出来可能会如下图所示:
所以,此时需要对粗谱进行光顺。一般采用光顺的方法是采用窗函数,所谓的窗函数就是采用特定的系数对谱中的数据前后相邻数值进行加权平均,第一种采用的是hamming window, 如下所示:
S
(
f
n
)
=
{
0.54
S
′
(
f
0
)
+
0.46
S
′
(
f
1
)
n
=
0
0.23
S
′
(
f
n
−
1
)
+
0.54
S
′
(
f
n
)
+
0.23
S
′
(
f
n
+
1
)
n
=
1
,
2
,
…
,
m
−
1
0.46
S
′
(
f
n
−
1
)
+
0.54
S
′
(
f
n
)
n
=
m
S(f_n)=\begin{cases} 0.54S'(f_0)+0.46S'(f_1) \qquad \qquad \qquad \qquad \qquad \quad n=0 \\ 0.23S'(f_{n-1})+0.54S'(f_n)+0.23S'(f_{n+1}) \qquad n=1,2,\ldots,m-1\\ 0.46S'(f_{n-1})+0.54S'(f_n)\qquad \qquad \qquad \qquad \qquad n=m \end{cases}
S(fn)=⎩⎪⎨⎪⎧0.54S′(f0)+0.46S′(f1)n=00.23S′(fn−1)+0.54S′(fn)+0.23S′(fn+1)n=1,2,…,m−10.46S′(fn−1)+0.54S′(fn)n=m
第二种为hanning window法:
S
(
f
n
)
=
{
0.5
S
′
(
f
0
)
+
0.5
S
′
(
f
1
)
n
=
0
0.25
S
′
(
f
n
−
1
)
+
0.5
S
′
(
f
n
)
+
0.25
S
′
(
f
n
+
1
)
n
=
1
,
2
,
…
,
m
−
1
0.5
S
′
(
f
n
−
1
)
+
0.5
S
′
(
f
n
)
n
=
m
S(f_n)=\begin{cases} 0.5S'(f_0)+0.5S'(f_1) \qquad \qquad \qquad \qquad \qquad \quad n=0 \\ 0.25S'(f_{n-1})+0.5S'(f_n)+0.25S'(f_{n+1}) \qquad n=1,2,\ldots,m-1\\ 0.5S'(f_{n-1})+0.5S'(f_n)\qquad \qquad \qquad \qquad \qquad n=m \end{cases}
S(fn)=⎩⎪⎨⎪⎧0.5S′(f0)+0.5S′(f1)n=00.25S′(fn−1)+0.5S′(fn)+0.25S′(fn+1)n=1,2,…,m−10.5S′(fn−1)+0.5S′(fn)n=m
matlab实现代码如下:
%hamming window function
for i=1:M-1
S1(i+1)=0.23*L(i)+0.54*L(i+1)+0.23*L(i+2);
end
S1(1)=0.54*L(1)+0.46*L(2);
S1(M+1)=0.46*L(M)+0.54*L(M+1);
x=0:1/(2*M*dt):1/(2*dt);
Spectrum=S1;
Frequency=x*2*pi;
%hanning window function
for i=1:M-1
S2(i+1)=0.25*L(i)+0.5*L(i+1)+0.25*L(i+2);
end
S2(1)=0.5*L(1)+0.5*L(2);
S2(M+1)=0.5*L(M)+0.5*L(M+1);
x=0:1/(2*M*dt):1/(2*dt);
Spectrum=S2;
Frequency=x*2*pi;
参考资料:
随机波浪谱分析——自相关函数法 (MATLAB).
浮子式波浪能转换装置机理的频域及时域研究
快速傅里叶变换法
快速傅里叶变换法是通过对波浪时历曲线进行快速傅里叶变换,然后再将数据转换成谱数据得到谱图。以往关于快速傅里叶变换法得到的波浪谱的公式推导都未有比较明确的描述,导致我们并不清楚最后的公式如何运用,此处我将对此方法进行公式推导,以减少读者困惑。
a
i
=
2
S
η
η
(
ω
^
i
)
Δ
ω
i
⟹
S
η
η
(
ω
^
i
)
=
a
i
2
2
Δ
ω
∵
Δ
ω
=
2
π
Δ
f
,
Δ
f
=
F
s
N
,
F
s
=
1
Δ
T
∴
Δ
ω
=
2
π
N
⋅
Δ
T
⟹
S
η
η
(
ω
^
i
)
=
a
i
2
N
⋅
Δ
T
4
π
a_i=\sqrt{2S_{\eta\eta}(\hat{\omega}_i)\Delta\omega_i} \implies S_{\eta\eta}(\hat{\omega}_i)=\frac{a_i^2}{2\Delta\omega}\\ \\ \because \Delta \omega=2\pi\Delta f,\Delta f=\frac{Fs}{N},Fs=\frac{1}{\Delta T}\\ \therefore \Delta \omega=\frac{2\pi}{N \cdot \Delta T}\\ \implies S_{\eta\eta}(\hat{\omega}_i)=\frac{a_i^2N\cdot \Delta T}{4\pi}\\
ai=2Sηη(ω^i)Δωi⟹Sηη(ω^i)=2Δωai2∵Δω=2πΔf,Δf=NFs,Fs=ΔT1∴Δω=N⋅ΔT2π⟹Sηη(ω^i)=4πai2N⋅ΔT
W
(
Δ
T
⋅
i
)
W(\Delta T\cdot i)
W(ΔT⋅i)为波浪采样点,
N
N
N为采样点数量,
Δ
T
\Delta T
ΔT为采样周期,
Y
i
=
a
b
s
[
F
F
T
(
W
(
Δ
T
⋅
i
)
)
]
,
则
a
i
=
2
Y
i
N
,
当
i
=
2
∼
N
/
2
时
;
∴
S
η
η
(
ω
^
i
)
=
Δ
T
π
⋅
N
⋅
Y
i
2
,
当
i
=
2
∼
N
/
2
时
.
Y_i=abs[FFT(W(\Delta T\cdot i))],则\\ a_i=\frac{2Y_i}{N},当 i=2\sim N/2时;\\ \therefore S_{\eta\eta}(\hat{\omega}_i)=\frac{\Delta T}{\pi \cdot N} \cdot Y_i^2,当 i=2\sim N/2时.\\
Yi=abs[FFT(W(ΔT⋅i))],则ai=N2Yi,当i=2∼N/2时;∴Sηη(ω^i)=π⋅NΔT⋅Yi2,当i=2∼N/2时.
以上这种形式就和在文献中看到的相同了。
由于在matlab快速傅里叶变换中
Y
1
Y_1
Y1是零频时(即波浪的直流分量)的值,而波浪是经过归零处理的,即零频时的值应为0,所以
a
1
a_1
a1的值应为零,与上式统一起来就是
S
η
η
(
ω
^
i
)
=
Δ
T
π
⋅
N
⋅
Y
i
2
,
i
=
1
⋯
N
2
S_{\eta\eta}(\hat{\omega}_i)=\frac{\Delta T}{\pi \cdot N} \cdot Y_i^2,i=1\cdots \frac{N}{2}
Sηη(ω^i)=π⋅NΔT⋅Yi2,i=1⋯2N
具体文献可参看快速傅里叶变换法的海浪谱估计
matlab实现方式
%% Spectrum Analysis
% Code by YY-ZHU
% Modified on 6/3/2021
%% Defination
% Three methods are included:
% 1. Self-Correlation Function (SCF) method
% 2. Fast Fourier Transform (FFT) method
% 3. Maximum Entropy Method (MEM)
% The function for these three methods are named as:
% 1. Spectrum_Analysis_SCF
% 2. Spectrum_Analysis_FFT
% 3. Spectrum_Analysis_MEM
function [Spectrum,Frequency]=Spectrum_Analysis_FFT(b,Fs,Method)
T = 1/Fs; % Sampling period
L = length(b); % Length of signal
if mod(L,2)~=0
a=b(1:end-1);
L=L-1;
else
a=b;
end
Y = fft(a);
P2 = abs(Y/L); % 2-sides spectrum
P1 = P2(1:L/2+1); % fetch half of P2
P1(2:end-1) = 2*P1(2:end-1);
for i=1:L/2+1
S2(i)=(P1(i)^2)*T*L/4/pi;
%S2(i)=1/(2*pi*L)*P1(i)^2;
end
for i=1:100
S2=WindowFunction(S2,Method);
end
Frequency = 2*pi*Fs*(0:(L/2))/L;
Spectrum = S2;
其中window function如下
%% Information
% this function include two methods to smooth the spectrum
% 1. Hammming window
% 2. Hanning window
% the second argument is set as 'Hammming' or 'Hanning' to select the
% method
function [S1]=WindowFunction(P1,Method)
L=length(P1);
if Method == ['Hamming']
for i=1:L-2
S1(i+1)=0.23*P1(i)+0.54*P1(i+1)+0.23*P1(i+2);
end
S1(1)=0.54*P1(1)+0.46*P1(2);
S1(end)=0.46*P1(end-1)+0.54*P1(end);
elseif Method == ['Hanning']
for i=1:L-2
S1(i+1)=0.25*P1(i)+0.5*P1(i+1)+0.25*P1(i+2);
end
S1(1)=0.5*P1(1)+0.5*P1(2);
S1(end)=0.5*P1(end-1)+0.5*P1(end);
else
disp('wrong input');
return;
end