Matlab:从频谱密度到方差

时间:2019-03-04 15:33:08

标签: matlab variance spectral

我试图理解时间序列的频谱密度与其方差之间的关系。据我了解,光谱密度的积分应等于方差。至少根据大多数讲义,例如these

但是,我正在努力重复这一发现。可以说我生成了一个自回归系数为0.9的简单AR(1)级数。

    T = 1000;
rho = 0.9;
dat = zeros(T,1);
for ii = 2:T
    dat(ii) = rho*dat(ii-1)+randn;
end

然后我继续计算频谱密度(autocov与信号工具箱中的xcov相同,而我没有),它是动态序列的协方差,方差在向量的中间)

lag = 20;
autocovs = autocov(dat,lag);
lags = -lag:1:lag;
wb = 0:pi/64:pi;
rT = sqrt(length(dat));
weight = 1-abs(lags)/rT;
weight(abs(lags)>rT) = 0; %bartlett weight
for j = 1:length(wb)
    sdb(j) = real(sum(autocovs'.*weight.*exp(-i*wb(j).*lags)))/(2*pi);
end
sdb = sdb;

sdb是功率密度函数,并且肯定是AR(1)的正确形状,并朝低频加权: enter image description here。但是,功率谱的总和为54.5,而模拟的AR(1)系列的方差约为5。

我想念什么?我将频谱密度理解为系列的方差如何分布在整个频谱中。我不确定我是否误解了建议或编码错误。任何好的参考文献将不胜感激。

编辑:我意识到很明显,对“ sdb”系列求和并不是整数。为了在{-pi,pi}之间进行积分,我应该求和sdb *(2 * pi / 130)或等效地sdb *(pi / 65),因为我只查看{+ pi}段,而sdb对于负值。但是,我似乎仍然得到比方差更大的数字(甚至多次重复模拟)...我是否仍缺少某些东西?上面的sdb行变为

sdb(j) = real(sum(autocovs'.*weight.*exp(-i*wb(j).*lags)))/(65);

0 个答案:

没有答案