对于matlab我是新手,程序也是编写好长时间,总想写篇文章纪念下,所以有些地方可能没有说明白,有需要在修改。
目的:利用自相关在接受来的数据中找到与本地数据相同的地方,利用的是自相关函数在原点位置的值最大。既然是在matlab中写程序为啥不用自相关函数呢?因为这个程序以后可能会在单片机上实现,所以先用matlab实验下。
fs=200000;%抽样频率
B=10000;
f0=20000;%LFM信号的起始频率
n=2048;%采样点个数
T1=n/fs;%在采样频率为fs的时候,采样n个点需要的时间
k=B/T1;%调频斜率
t1=linspace(0,T1-1/fs,n);
y=exp(1j*(pi*k*t1.^2+2*pi*f0*t1));
figure;
plot(t1,y);
title('LFM信号时域');
xlabel('t/s');
ylabel('幅度');
%造一个 10 000点数据的信号,其中有2048点LFM信号的数据
position_rand=randi(8000);%随机生成一个1-8000中的一个数
rand_sample1=zeros(1,position_rand);
rand_sample2=y;
rand_sample3=zeros(1,10000-length(rand_sample2)-length(rand_sample1));
rand_sample=[rand_sample1,rand_sample2,rand_sample3];%组合成一万个点
T=length(rand_sample)/fs;
t=linspace(0,T-1/fs,length(rand_sample))*fs;
figure;
stem(t,rand_sample);
title('信号时域');
ylabel('幅度');
LFM_sample=[y,zeros(1,2048)];%生成4096个点,其中2048是由前面的LFM组成,另外2048个点都是0
Rt1=zeros(4,4096);
Rt2=zeros(4,4095);
cal_number=floor(length(rand_sample)/2048)-1;
%cal_number是取rand_sample的次数
for i=1:cal_number
% sample1=rand_sample(1,(1:2048)+(i-1)*2048);
% sample2=rand_sample(1,(2049:4096)+(i-1)*2048);
sample=rand_sample(1,(1:4096)+(i-1)*2048);
for j=1:4096
for h=1:4096
if h+j-1 >= 4097
break;
else
Rt1(i,j)=Rt1(i,j)+conj(LFM_sample(1,h))*sample(1,h+j-1);
end
end
end
%在求取n < 0 的情况
for j=1:4095
for h=1:4096
if h+j >= 4097
break;
else
Rt2(i,j)=Rt2(i,j)+conj(LFM_sample(1,h+j))*sample(1,h);
end
end
end
end
Rt=[Rt2,Rt1];
i=-4095:4095;
subplot(2,2,1)
stem(i,Rt(1,:));
title('1-4096点互相关匹配');
subplot(2,2,2)
stem(i,Rt(2,:));
title('2049-6144点互相关匹配');
subplot(2,2,3)
stem(i,Rt(3,:));
title('4097-8192点互相关匹配');
下面是两次进行运行的结果
可以看出来在图1中的三个图,我选中了500那个点,是三个图中幅值最大的点,第501个点就是LFM开始的数据点。
可以看出来在图2中的三个图,我选中了904那个点,是三个图中幅值最大的点,第904+2048*2+1=5001个点就是LFM开始的数据点。
至于在图1 中的第二个图和图2 中的第二个图,是因为也是存在部分匹配的现象,因为我每次只能取所有的点中的4096个点,这意味着如果有些时候,我只会取到部分的LFM信号点,而这些信号点也是和本地的数据存在匹配的,所以存在一个峰。但是只有全部匹配的时候会出现一个最高的峰。
这次就很明显知道LFM的位置,但是你可以观察到图3 中的第三个图片有个峰,但是这个峰值的幅度好像没有刚才那几个的大?想想是为什么?
还是因为我取点的问题,因为10,000个点,每次做4096点相关,做一次相关,平移2048个点。所以我只能做3次相关,剩下的点就不够在做一次相关了(10000 = 4096 + 2048*2 + 1808)。现在的LFM的位置是7247 + 1。所以我在第三次,必然取不到所有的点,所以赋值就不会很高。