我正在尝试在matlab中编写cyclic autocorrelation function代码,如下所示:
t=0:(N-1);
t=t*Te;
i_alpha=0;
tau=-N2*Te:Te:N2*Te;
alpha=-1/2:1/N:1/2;
Ryy_cl=zeros(length(alpha),length(tau));
for alpha=alpha/Te
ind_tau=0;
i_alpha=i_alpha+1;
for k=tau
ind_tau=ind_tau+1;
if k>0
% Ryy_cl(i_alpha,ind_tau)=1/length(sig_bin_syl_mod(1:end- k))*sum((sig_bin_syl_mod(1:end-k)).*sig_bin_syl_mod(k+1:end)).*exp(1i*2*pi*alpha*t(1+k:length(sig_bin_syl_mod(1:end))));
Ryy_cl(i_alpha,ind_tau)=(1/N)*sum((sig_bin_syl_mod(1:end-k)).*sig_bin_syl_mod(k+1:end)).*exp(-1i*2*pi*alpha*t(1:end-k));
else
Ryy_cl(i_alpha,ind_tau)=(1/N)*sum((sig_bin_syl_mod(1-k:end)).*sig_bin_syl_mod(1:end+k)).*exp(-1i*2*pi*alpha*t(1-k:end));
end
end
end
我遇到了错误,并没有真正显示出我的期望。根据以下公式,我该如何解决?
答案 0 :(得分:0)
您提供的代码不完整,因此很难自信地重现您的错误。特别是,您尚未定义信号(sig_bin_syl_mod),采样增量(Te)或信号长度(N)。
根据我选择Te的方式,我会得到不同的错误。最简单的方法是选择Te = 1.但这是不现实的。 1 MHz采样率将具有Te = 1.0e-6。
当Te不是整数时,您可以看到一个问题是tau不是整数,但是您将k分配给tau,然后使用k作为索引。
所以你的代码有基本的问题。
现在我要直接回答你的问题。重写代码,将上面的产品分解为单独的步骤,以便您可以更轻松地调试它。
首先,不要试图一次性获得所有tau和alpha的CA.专注于使单个循环频率alpha和所有tau的功能正确。 我已经在cyclostationary.wordpress.com上汇总了很多关于如何做到这一点的有用帖子。
其次,将修正后的单字母代码放入循环中。然后尝试提高效率。
顺便说一下,估计循环自相关的一种非常有效的替代方法是首先构造循环周期图(参见我的网站),然后对其进行逆傅里叶变换。这利用了FFT的强大功能。
最后,与Quora的链接讨论了不同的“循环自相关”。您正在尝试进行循环平稳信号处理,但该链接仅处理DFT / FFT及其循环移位。请参阅我的网站,了解您感兴趣的循环自相关的定义和属性。
乍得