对于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;
Rt1(i,j)=Rt1(i,j)+conj(LFM_sample(1,h))*sample(1,h+j-1);
%在求取n < 0 的情况
for j=1:4095
for h=1:4096
if h+j >= 4097
break;
Rt2(i,j)=Rt2(i,j)+conj(LFM_sample(1,h+j))*sample(1,h);
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开始的数据点。
对于matlab我是新手,程序也是编写好长时间,总想写篇文章纪念下,所以有些地方可能没有说明白,有需要在修改。目的:利用自相关在接受来的数据中找到与本地数据相同的地方,利用的是自相关函数在原点位置的值最大。既然是在matlab中写程序为啥不用自相关函数呢?因为这个程序以后可能会在单片机上实现,所以先用matlab实验下。fs=200000;%抽样频率B=10000;f0=20000;%LFM信号的起始频率n=2048;%采样点个数T1=n/fs;%在采样频...
B=circshift(A,[p,0]);如果p是正数则实现A以行为单位,从上到下的循环移位。如果p是负数则实现从下到上的循环移位。
B=circshift(A,[0,p]);如果p是正数则实现A以列为单位,从左到右的循环移位。如果p是负数则实现从右到左的循环移位。
R^xα(f)≡0\hat R_x^\alpha (f) \equiv 0R^xα(f)≡0,对∀α≠0,R^x(τ)≠0\forall \alpha \ne 0,{\hat R_x}(\tau ) \ne 0∀α=0,R^x(τ)=0,则x(t)x(t)x(t)为纯平稳信号。
R^xα(f)≠0\hat R_x^\alpha (f) \ne 0R^xα(f)=0,当α=mT0\alpha = \frac{m}{{{T_0}}}α=T0m,则x(t)x(t)x(t)具备纯
R^xα(f)≡0\hat R_x^\alpha (f) \equiv 0R^xα(f)≡0,对∀α≠0,R^x(τ)≠0\forall \alpha \ne 0,{\hat R_x}(\tau ) \ne 0∀α=0,R^x(τ)=0,则x(t)x(t)x(t)为纯平稳信号。
R^xα(f)≠0\hat R_x^\alpha (f) \ne 0R^xα(f)=0,当α=mT0\alpha = \frac{m}{{{T_0}}}α=T0m,则x(t)x(t)x(t)具备纯
该程序采用输入矩阵的列,并使用 fft 方法计算这些列的自相关和互相关。 结果与 xcorr 函数非常相似。 该方法可用于评估重复代码序列的互相关以及其他类似调查。
nxm 矩阵输入将导致 nxm^2 矩阵输出。
包含一个等待栏以消除计算需要多长时间的神秘面纱。
转自要求:t[n]=f(n)*g(n),把g(n)翻转,向右移动n格与f(n)的乘积和。 假设f(n)长度为L,g(n)长度为P,则卷积后的有效点数为L+P-1,其余为全零。 由傅里叶变换定理:时域卷积等效于频域乘积,即 T(e^jw)=F(e^jw)G(e^jw)。用w=(2*pi/N)k,代替可得:T~[k]=F~[k]G~[k],取k=0-N-1则可得到T[k]=F[k]G[k]。
MATLAB学习笔记——自相关/互相关函数xcorr使用介绍
原文链接:https://blog.csdn.net/lvsehaiyang1993/article/details/82913443
转载请附上原文出处链接
Matlab提供了计算互相关和自相关的函数xcorr函数
1.使用方法
c = xcorr(x,y)
c = xcorr(x)
c = xcorr(x,y,‘op...
看上去语法也不难,直接运算不就好了么?可是运算出来的结果自己却搞不懂,因为自己没有多少统计的知识,于是又去巴拉数学的材料,想去搞明白xcorr函数的原理或公式。最后还是去matlab论坛找到了自己想找的答案,这里就来分析下matlab的互相关函数xcorr。
matlab中的参数都是以数组的形式存储的,标量可以看作是一维数组。我们采用序列x = [1, 3, 5]作为实验对象,经过xcorr()函...