仿照自相关函数的写法,加上了相位因子。
但这种方法弊端:1、处理的点数太多
2、检测效果拉跨
输入序列如下图示:(两个固定pri的信号一个从1开始间隔为5,一个从3开始间隔为8
经过mypri之后的图:
代码如下:
clear
clc
x_range=50;
x=zeros(1,x_range);
pri_1=5;
pri_2=8;
x(1:pri_1:x_range)=x(1:pri_1:x_range)+1;
x(3:pri_2:x_range)=x(3:pri_2:x_range)+1;
t_n=[];
for p=1:length(x)
if x(p)~=0
t_n=cat(2,t_n,p);
end
end
% D=fft(x);%用fft分析信号会得到什么信息呢?
% stem(D);
% C=C_tau(x,t_n);%改的多加了一个参数。
C=mypri_1(x);
stem(abs(C(26:49)));%画出从tau=1开始画图
stem(abs(C(x_range+1:x_range*2-1)));
% function C = mypri_plus(x,t_n) %一个失败品。
% x_length=length(x);
% C=zeros(1,length(x));
% for ii=1:5 %第i级计算,,这咋有点不像pri了
% diff=[];
% for p=1:length(t_n)-ii
% diff(p)=t_n(p+ii)-t_n(p);%记录tn的值
% end
% tau_min=min(diff);
% tau_max=max(diff);
% tau_1=[];
% tau_1(1)=diff(1);
% for p=2:diff
% if diff(1)~=diff(p)
% tau_1=cat(2,tau_1,diff(p));
% end
% end
% % C=zeros(1,length(tau_1));
% for tau = tau_1
% % for i = 1:length(tau_1)
% % if tau == tau_1(i)
% % aa=i;
% % end
% % end
% for i =1:x_length-tau
% C(tau)=C(tau)+x(i)*x(i+tau);
% end
% end
% end
% end
function C = mypri_1(x)
len=length(x);
C=zeros(1,2*len-1);
for tau = -(len-1):len-1
% tau_range= 2-len:2*len-1
if tau>=0
range_min=1;
range_max=len-tau;%这些范围指的是:当tau确定时,在这些范围内,
%计算x(t)*x(t+tau)才有意义(不为零)。
else
range_min=1-tau;
range_max=1;
end
aa=tau+(len);%列表的索引不能为负值,故进行平移
if tau>=0
for i =1:range_max
C(aa)=C(aa)+x(i)*x(i+tau)*exp(1i*2*pi*i/tau);
end
elseif tau<0
for i =range_min:len
C(aa)=C(aa)+x(i)*x(i+tau)*exp(1i*2*pi*i/tau);
end
end
end
end