来自 MATLAB 中自相关的 PSD

信息处理 信号分析 噪音 功率谱密度 自相关 随机过程
2022-02-15 14:05:03

我正在尝试模拟由方程式定义的简单随机过程:

1vdbdt+Γ0b=σR(t),
在哪里R(t)是零均值白噪声(时间相关的增量),并且v,Γ0σ都是真正的正参数。我正在使用 Euler-mayurama 方案对此进行模拟,即
b(t+Δt)=b(t)vΓ0b(t)Δt+vσΔtN(0,1),
N(0,1)是标准正态随机数,对于有限区间t[0,T]. 我正在尝试使用 Wiener-Khintchine 定理计算功率谱密度
S[f]=e2πfτb(t)b(t+τ)dτ,
从自相关函数b(t)b(t+τ). 从分析上讲,我可以计算出它,它给了我
S[f]=vσ2Γ02vΓ0(vΓ0)2+(2πf)2,
但是当我尝试计算相同的数值时,我的函数看起来完全不同。我是否正确执行此操作?(见下面的 Matlab 代码)

%% Autocorrelation test
close all; clear all; clc;

% Inputs
dt = 1e-3;
T = 2;
tv = 0:dt:T;
Lt = length(tv);

v = 3.5;
Gamma0 = 20.3;
sigma = 0.75;
a = v*Gamma0;

% Frequency spectrum properties
Fs = 1/dt; % (Hz) sampling frequency, based on Ben's paper

sims = 1; % number of simulations
U_Walks = zeros(Lt,sims);
for nn = 1:sims
    b = zeros(Lt,1);
    for ii = 1:Lt-1
        b(ii+1) = b(ii) - v*Gamma0*b(ii)*dt + ...
            v*sqrt(sigma)*sqrt(dt).*normrnd(0,1);
    end
    Rxx(:,nn) = xcorr(b);
    U_Walks(:,nn) = b;
    disp(nn);
end

%% Stats
LR = length(Rxx);
N = 2^nextpow2(LR);
Y = fft(Rxx,N); % Taking only one side of the y-axis symmetric FFT
Y = Y(1:N/2+1);
mY = (Y).^2/N;
F = Fs*(0:(N/2))/N; % calculating the frequency range for the x-axis

S_f = 10*log10(mY);

S_f_analytic = 10*log10((v*sigma/2/Gamma0.*(2*a./(a^2 + (2*pi*F).^2))));

%% PLOTS
close all;

figure('units','normalized','outerposition',[0 0 1 1])
set(gcf,'Color','w');
plot(F,S_f,'r',F,S_f_analytic,'b','LineWidth',3);
legend('Numeric','Analytic');
title(['PSD']);
xlabel('f (Hz)'); ylabel('S[f] (dB)');
set(gca,'FontSize',20);
1个回答

您的代码/方法中有两个错误。第一个是术语Δt在你的第二个公式中;它应该被替换为Δt. 第二个是根据估计的自相关计算功率谱。您所做的是将 FFT 的结果平方Y以获得mY,但这是不正确的。首先,Y是复值,其次,自相关的傅里​​叶变换是功率谱,所以不需要对 FFT 的结果求平方,只需要计算其幅度即可。

总之,更换行

v*sqrt(sigma)*sqrt(dt).*normrnd(0,1);

经过

v*sqrt(sigma)*dt.*normrnd(0,1);

mY = (Y).^2/N;

经过

mY = abs(Y)/N;

这应该会给你想要的结果,如下图所示:

在此处输入图像描述