不使用内置函数实现Matlab自相关函数:代码问题排查求助
自相关函数计算代码问题排查与修正
原代码的核心问题
- 求和变量未重置:
sum_1在每次tau循环开始前没有归零,导致后续延迟的自相关结果累计了之前所有tau的计算值,完全偏离预期。 - 循环索引范围错误:内层
t的范围tau:length(U)-1会遗漏部分有效配对,同时U(t+1-tau)的索引逻辑混乱。正确的配对应该是U(t)与U(t-tau)(对应延迟tau的自相关),此时t的有效范围应为tau:length(U),保证t-tau不小于1。 - 冗余的
sum()调用:U(t).*U(t+1-tau)是单个元素的乘积,外层套sum()属于无意义操作,既浪费性能又容易误导逻辑。 - 未预分配数组内存:
r在循环中动态赋值会触发Matlab多次内存扩容,降低运行效率,尤其当数据量较大时影响明显。
修正后的代码实现
i = 1:199; U = sin(0.3*i); N = length(U); r = zeros(1, N); % 提前预分配内存,提升效率 for tau = 1:N sum_1 = 0; % 每次计算新的tau时重置求和变量 % 遍历所有有效配对:U(t) 和 U(t-tau) for t = tau:N sum_1 = sum_1 + U(t) * U(t - tau); end % 可选:根据自相关定义选择是否归一化 % 无偏估计归一化:r(tau) = sum_1 / (N - tau + 1); % 归一化到[-1,1]:r(tau) = sum_1 / ((N - tau + 1) * var(U)); r(tau) = sum_1; % 未归一化版本 end
额外提示
Matlab内置了xcorr函数可以直接计算自相关,比如r_unbiased = xcorr(U, 'unbiased');能得到无偏估计的自相关结果,你可以用这个内置函数验证自己的实现是否正确。
内容的提问来源于stack exchange,提问作者Валера Слободянюк
相关产品推荐
相关产品推荐

