雷达数据处理matlab仿真:匹配滤波与MTD

这段时间看了一些雷达信号处理的博客,现在自己写一篇博客记录一下自己用matlab仿真的代码和思路。

雷达参数的定义

这段主要是对雷达的一些参数进行定义。

%% 定义雷达参数
clear;clc;
RF = 3.14e9/2;          % 射频频率
C = 3e8;            % 光速
PulseNumber = 100;      % 脉冲数
BandWidth = 3e6;    % 线性调频信号带宽
TargetNumber = 6;   % 目标数
TimeWidth = 25e-6;  % 脉冲宽度
K = BandWidth/TimeWidth;    % 线性调频信号的频率变化率
PRT = 240e-6;       % 发射信号的频率
PRF = 1/PRT;
FS = 4e7;           % 处理信号的采样频率
FT = 1/FS;
Lambda = C/RF;      % 射频信号波长
RCS = zeros(1,TargetNumber);     % 目标雷达截面积
Rmin = C*TimeWidth/2;   % 雷达所能测得的最小距离
Rmax = C*(PRT-TimeWidth)/2;     % 雷达最大测距范围
RangeWidth = Rmax - Rmin;
t = 0:FT:PRT;              % 接收一个回波的窗时间长度
N = length(t);               % 一个窗的采样点数
NoisePower = -14;      % 噪声功率-12dB
RandomTargetR = Rmin+rand(1,TargetNumber)*RangeWidth;  % 产生随机目标
DelayTime = 2*RandomTargetR/C;    % 延迟时间
MaxVelocity = PRF*Lambda/2;     % 雷达第一盲速
RandomTargetV = rand(1,TargetNumber)*MaxVelocity;   % 产生随机目标速度
deltaR = C/2/BandWidth;         % 距离分辨率

生成回波的线性调频信号

这段主要用于生成一定数量的回波信号,并把每个目标的回波信号叠加在一起。

%% 生成回波的FMCW
fd = 2*RandomTargetV/Lambda;        % 目标多普勒频率
td = -TimeWidth/2:FT:TimeWidth/2;
Ssignal = exp(1j*2*pi*RF*td+1j*pi*K*td.^2);            % 发射信号
referSignal = exp(1j*pi*K*td.^2);                   % 定义参考信号,用于比较混频滤波前后中频的波形是否一致,从而验证混频滤波是否有效
matriData = zeros(PulseNumber,N);
referData = zeros(PulseNumber,N);                   % 参考
DelayNumber = round(DelayTime*FS);
len = length(td);
% 每个目标的第i个回波放在同一行
for i = 1:PulseNumber
    freqMove = exp(fd'*(1j*2*pi*((i-1)*PRT+td)));       % 不同目标的多普勒相移
    MovePulse = freqMove.*repmat(Ssignal,TargetNumber,1);   % 经过多普勒相移后不同目标的第i个回波
    referMove = freqMove.*repmat(referSignal,TargetNumber,1);   % 参考
    SystemNoise = normrnd(0,sqrt(10^(NoisePower/10)),1,N)+1j*normrnd(0,sqrt(10^(NoisePower/10)),1,N);   % 生成均值为0,方差为10^(NoisePower/10)且服从正态分布的随机高斯白噪声
    % 将不同目标的回波叠加在一起
    for j = 1:TargetNumber
        tempPulse = matriData(i,DelayNumber(j)+1:DelayNumber(j)+len);
        matriData(i,DelayNumber(j)+1:DelayNumber(j)+len) = tempPulse + MovePulse(j,:);
        referPulse = referData(i,DelayNumber(j)+1:DelayNumber(j)+len);  % 参考
        referData(i,DelayNumber(j)+1:DelayNumber(j)+len) = referPulse + referMove(j,:); % 参考
    end
    matriData(i,:) = matriData(i,:)+SystemNoise;
    referData(i,:) = referData(i,:)+SystemNoise;
end
figure('Name','回波信号');
for i = 1:5 
    subplot(6,1,i);plot(real(matriData(i,:)));
end

运行结果

混频

这里是根据自己的理解写的,一开始不太确定混频的效果,所以写了这么一段代码来对比混频前后的波形,确定混频之后的波形是否是自己想要的。

% 低通滤波器
function outputSignal = radar_LPF(Wn,inputSignal)
    Rp = 0.6;
    Rs = 35;
    N = 6;
    [b,a]=ellip(N,Rp,Rs,Wn/pi,'z');
    outputSignal = filter(b,a,inputSignal);
    grid on
end
%% 测试混频滤波是否有效
FLocal = exp(1j*2*pi*RF*t);    % 本振信号,用于混频,从而将射频信号转换为中频信号
subplot(616);plot(real(FLocal));title('本振信号');
originPulse = real(matriData(1,:));
fftOrigin = fftshift(fft(originPulse));
mixPulse = originPulse.*real(FLocal);
fftmix = fftshift(fft(mixPulse));
len = length(originPulse);
xValue = ((1:len)-(len-1)/2)/len*FS;
figure('Name','混频测试');
subplot(511);plot(xValue,abs(fftOrigin));title('原回波信号频谱');
subplot(512);plot(xValue,abs(fftmix));title('混频后的信号频谱');
output = radar_LPF(0.29*pi,mixPulse);
fftoutput = fftshift(fft(output));
subplot(513);plot(xValue,abs(fftoutput));title('滤波后信号频谱');
subplot(514);plot(real(output));title('时域的输出信号');
subplot(515);plot(real(referData(i,:)));title('参考的线性调频信号');

%% 将接收到的回波与本振进行混频
% 经过上述测试可知,混频有效,所以下面一次对每个波形进行混频滤波,滤波器频率为BandWidth
for i =1:PulseNumber
    mixSignal = matriData(i,:).*real(FLocal);             % 混频
    matriData(i,:) = radar_LPF(2*BandWidth/FS*2*pi,mixSignal);  % 滤波
end
% figure3 和 figure4 再次比对混频滤波的有效性
figure('Name','前六个参考线性调频信号');
for i =1:6
    subplot(6,1,i);plot(real(referData(i,:)));
end
figure('Name','前六个混频滤波后的回波信号');
for i =1:6
    subplot(6,1,i);plot(real(matriData(i,:)));  
end

匹配滤波与脉冲积累

匹配滤波用来进行脉冲压缩,从而获得更大的距离分辨率,脉冲积累理论上是可以降低检测难度,但代码里面没有体现,只是使得压缩之后的波形更明显了。

%% 接下来对中频信号进行匹配滤波和脉冲积累得到距离
filter = fliplr(conj(referSignal));     % 匹配滤波器
filtSignal = zeros(PulseNumber,N);
for i = 1:PulseNumber
    tempSignal = conv(filter,matriData(i,:));   % 长度为 1001+9601-1 = 9701
    len = length(filter);
    filtSignal(i,:) = tempSignal(len:end);
end
figure('Name','匹配滤波后的波形');
for i = 1:5
    subplot(6,1,i);plot(abs(filtSignal(i,:)));
end
TotalFilteSignal = zeros(1,N);      % 脉冲积累后的波形
TotalFilteSignal(1,:) = sum(abs(filtSignal));
Range = (1:N)/FS*C/2;
subplot(6,1,6);plot(Range,TotalFilteSignal);xlabel('range/m');
figure('Name','距离图');
maxValue = max(TotalFilteSignal);
image(255*TotalFilteSignal/maxValue);
colorbar;


MTD

对慢时间轴做FFT,从而获得目标的运动速度。

%% 进行MTD,得到速度
MTD = abs(fft(filtSignal,[],1));
maxValue = max(max(MTD));
Speed = linspace(0,PRF,PulseNumber)*Lambda/2;
figure('Name','Image颜色图');
image(Range,Speed,255*MTD/maxValue);
figure('Name','三维图');
mesh(Range,Speed,255*MTD/maxValue);


最终结果完美吻合!!!起飞!

参考

知乎链接
csdn链接
csdn链接

  • 3
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值