在信号处理领域中,我们经常会用到自相关函数和互相关函数,例如利用自相关函数在语音信号处理中提取基音频率,又例如常利用互相关函数提取两接收信号之间的时间延迟。一般是用线性相关函数,但用FFT方法可快速计算线性相关和循环相关。循环相关比线性相关的计算量更小,那么是否能用循环相关获取延迟量呢?在某些情况下是可以使用的!
当相关函数的峰值结构衰减很快时,可以从循环相关中提取峰值,从而得到延迟量。
当相关函数的峰值结构衰减很慢时,就不能从循环相关中提取峰值了,从而得到延迟量。
案例1、从delaydatal.txt文件读入两通道数据,分别设为x和y。它们之间的延迟量为54个样点,以xcorr、快速线性相关和循环相关计算延迟量,比较它们的结果,程序如下:
clear all; clc; close all;
xx=load('delaydata1.txt');% 读入数据
x=xx(:,1); % 设为x
y=xx(:,2); % 设为y
N=length(x); % 数据长度
[Rxy,lags]=xcorr(y,x); % 用xcorr计算线性相关
% 快速计算线性相关
X=fft(x,2*N); % FFT
Y=fft(y,2*N); % FFT
Sxy=Y.*conj(X);
sxy=ifftshift(ifft(Sxy));% IFFT,调整序列排列
Cxy=sxy(2:end); % 只取2*N-1点
subplot 211;
line([lags],[Rxy],'color',[.6 .6 .6],'linewidth',3); hold on
plot(lags,Cxy,'k'); axis([-100 100 -50 200]);
box on; title('(a) 两种方法得到x和y的线性相关')
xlabel('样点'); ylabel('相关函数幅值')
legend('xcorr','快速线性相关','Location','northwest')
% 计算循环相关
Xc=fft(x); % FFT
Yc=fft(y); % FFT
Scxy=Yc.*conj(Xc);
scxy=ifftshift(ifft(Scxy));% IFFT,调整序列排列
Ccxy=scxy(2:end); % 只取N-1点
lagc=-N/2+1:N/2-1; % 设置延迟序列
subplot 212; plot(lagc,Ccxy,'k');
axis([-100 100 -50 200]); title('(b) x和y的循环相关')
xlabel('样点'); ylabel('相关函数幅值')
set(gcf,'color','w')
运行结果如下:
在本程序中用两种方法计算线性相关:用xcorr函数和FFT得到上图,可以看出这两种方法得到的相关函数很好地重叠在一起,且计算出延迟量为54个样点。而通过FFT计算得的循环相关函数,也可以看出也能很好地反映出延迟量为54个样点。
delaydatal.txt文件的数据是振动信号,周期性不强,所以可以用循环相关法提取延迟量。
案例2、从delaydata3.txt文件读入两通道数据,分别设为x和y。它们是矩形脉冲,两序列之间的延迟量为14个样点,以xcorr线性相关和循环相关计算延迟量,并比较它们的结果。程序如下:
clear all; clc; close all;
xx=load('delaydata3.txt');% 读入数据
x=xx(:,1); % 设为x
y=xx(:,2); % 设为y
N=length(x); % 数据长度
fs=1000; % 采样频率
Xc=fft(x); % FFT
Yc=fft(y); % FFT
Scxy=Yc.*conj(Xc); % 计算循环相关
scxy=ifftshift(ifft(Scxy));
Ccxy=scxy(2:end); % 循环相关函数
lagc=-N/2+1:N/2-1; % 延迟量刻度
subplot 211; plot(lagc,Ccxy,'k');
title('(a) x和y的循环相关');
xlabel('样点'); ylabel('相关函数幅值')
[Rxy,lags]=xcorr(y,x); % 计算线性相关
%[maxr,locr]=max(Rxy);
% locr=locr-1000;
subplot 212; plot(lags,Rxy,'k');
title('(b) x和y的线性相关')
xlabel('样点'); ylabel('相关函数幅值')
set(gcf,'color','w')
运行结果如下:
从图中可看到y对x有14个样点的延迟量。用循环相关法计算得到的相关系数中有几个数值相同的峰值,不可能找最大峰值来获取延迟量;而通过线性相关仍可以观察到它们之间的延迟关系,进一步计算的话能提取到延迟量为14个样点。
通过上面2个案例得出结论:当信号是周期性的时,就不能从循环相关函数中获取延迟量,这也说明了要从循环相关函数中获取延迟量是有条件的。
实验数据下载链接如下:
https://mp.csdn.net/mp_download/manage/download/UpDetailed
https://download.csdn.net/download/qq_42233059/86406504
参考文献:MATLAB数字信号处理85个实用案例精讲——入门到进阶;宋知用(编著)
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
信号
处理第二式——
计算
两个序列的时间
延迟
一、
计算
算
法
二、代码实现1.非周期
信号
计算
时间
延迟
2.读入数据总结
提示:以下是本篇文章正文内容。
一、
计算
算
法
计算
两个序列的时间
延迟
通常使用如下两种算
法
:快速
线性相关
算
法
和
循环
相关
算
法
设两个有限长序列x(n),n=0,.,N-1
和
y(n),n=0,1…,M- 1,
相关
长度L=N+M-1
(1)快速
线性相关
算
法
实现
①为防止
循环
卷积发生混叠,首
波束形成的基本部分是
计算
阵列元素之间波到达时间的差异。 波束形成文献主要使用两种方
法
: 简单几何或矢
量
点积。 本此介绍使用两种方
法
如何
计算
到达阵列元素的平面波前与任意参考点之间的时间差。 当光源被认为距阵列很远时,通常假定为平面波。
基本几何
计算
延迟
下面的左图显示了沿x轴放置的单个麦克风。 这反映了一维数组的单个元素位置(右图)。 在这种设置中,平面波到达的角度是从y轴测
量
的; 角度为0°是宽边平面波,角度为±90°是端射。
所有
延迟
测
量
均参考单个点(在这种情况下为轴原点)进行。
要在不增加噪声功率的情况下对
信号
求导。MATLAB® 提供的
函数
diff会放大噪声,对于高阶导数会恶化不精确性。要解决此问题,请改用微分滤波器。
分析地震时建筑物楼层的位移。找到速度
和
加速度作为时间的
函数
。
加载文件 earthquake。该文件包含以下变
量
:
drift:楼层位移,以厘米为单位进行测
量
t:时间,以秒为单位进行测
量
Fs:采样率,等于 1 kHz
load('earthquake.mat')
.........
matlab·练习·用互
相关
法
估算
信号
时延值
一、题目内容
某接收机在接收一正弦
信号
s1时,发现接收到|的实际
信号
s2
延迟
了D秒。要想获得
延迟
前的
信号
,就要求出
延迟
值,在接收到的实际
信号
后加上
延迟
值。要求:模拟产生
信号
s1
和
s2,并通过采取一定的算
法
,估计时间
延迟
值D,并绘图显示。
提示:可令s1=sin(wt), s2=sin(w(t-D)), 给定一个具体的D值,画出正弦
信号
,再通过算
法
估计D’值,将估计值D’与 给定D值进行比较,两者误差越小,算
法
就越好。
二、算
法
概述
寻找两
信号
相关
性最强时的值作
https://github.com/rtlsdrblog/kerberossdr/blob/master/_signalProcessing/hydra_signal_processor.py
这部分是最重要的部分,它里面包含几个重要的算
法
,采样时间同步,相位同步,以及调用了空间谱估
计算
法
。
# KerberosSDR Signal Processor