简介:本资源面向雷达信号处理方向的学习者与工程人员,聚焦多目标场景下LFM调频连续波与CW波的脉冲压缩问题,提供一套可直接运行的Matlab仿真程序。程序支持自行设置目标数量,默认配置为2个目标,通过LFM脉冲压缩后每个目标对应出现一个波峰,便于直观观察多目标分辨效果。资源包共3个文件,包含2个m脚本与1份pdf说明文档,分别对应CW波与LFM信号的仿真实现及原理讲解,压缩包整体约104KB,体积轻量、便于快速上手。仿真同时采用时域与频域两种方法完成脉冲压缩,并对比验证两种方式得到的回波幅度结果一致,有助于读者理解匹配滤波的实现差异与等价性。目前已有1432人学习下载,适合作为雷达信号处理课程实验、脉冲压缩算法入门练习及多目标检测仿真的参考素材。1. 多目标雷达仿真的起点:为什么LFM和CW波要放在一起做脉冲压缩做雷达信号处理的同学多半遇到过这个场景:仿真里只有一个目标时,脉压结果干净漂亮,一旦把目标数加到三五个,距离维上就开始出现莫名其妙的假峰,速度维上目标之间互相“串门”,你盯着matlab的figure窗口怀疑人生。这份“多目标下LFM调频连续波和CW波的(时域、频域)脉冲压缩matlab仿真程序”,解决的正是这个从单目标到多目标的跨越问题。它把线性调频连续波(LFM)和单频连续波(CW)两种体制放在同一套仿真框架里,分别从时域和频域两条路径实现脉冲压缩,让你能直观对比不同波形、不同处理域下多目标的分辨表现。适合正在做雷达信号处理课程设计、论文仿真验证,或者想搞明白匹配滤波到底在matlab里怎么落地的开发者。关键词里的matlab、脉冲压缩、雷达信号处理、多目标识别,这四个词基本就是这份代码的全部骨架。2. 仿真框架拆解:LFM与CW波的双体制信号生成链路2.1 两种波形的数学定义与参数化建模LFM信号的核心是瞬时频率随时间线性变化,数学上写成复指数形式,调频斜率K等于带宽除以脉宽。CW波则是单一频率的连续波,靠长时间积累获得多普勒分辨率。这份仿真程序把两者的参数统一到一张配置表里,改一个采样率或脉宽,两种波形同步生效,避免了两套代码各改各的混乱。% 雷达系统参数配置(LFM与CW共用) c = 3e8; % 光速 fc = 10e9; % 载频 10GHz B = 50e6; % LFM带宽 50MHz Tp = 10e-6; % 脉冲宽度 10us K = B/Tp; % 调频斜率 fs = 100e6; % 采样率 100MHz PRF = 10e3; % 脉冲重复频率 10kHz M = 64; % 脉冲积累数 % LFM信号生成 t = -Tp/2 : 1/fs : Tp/2 - 1/fs; St_lfm = exp(1j*pi*K*t.^2); % 复包络 % CW信号生成(单频,靠多普勒分辨) St_cw = exp(1j*2*pi*fc*t); % 载频连续波这里有几个参数直接决定后面脉压的效果。采样率fs必须满足奈奎斯特采样定理,对于50MHz带宽的LFM,fs至少100MHz,代码里取的就是这个临界值。脉冲积累数M决定了多普勒维的FFT点数,M越大速度分辨率越高,但仿真时间也线性增长。调频斜率K是LFM的灵魂,它决定了距离分辨率和脉压后的主瓣宽度。我一般会把Tp和B做成可调变量,跑不同组合看分辨率变化,这是理解波形参数最直接的方式。2.2 多目标回波叠加模型多目标仿真的关键是把每个目标的时延和多普勒分别算出来,再叠加到接收信号上。时延对应距离,多普勒对应速度,两个维度独立控制,这样才能验证脉冲压缩在距离-速度二维平面上的联合分辨能力。% 多目标参数:每行一个目标 [距离(m), 速度(m/s), 幅度] targets = [3000, 150, 1.0; 3050, -80, 0.8; 5000, 200, 0.6; 8000, -120, 0.9]; Nr = length(t); % 快时间采样点数 echo = zeros(1, Nr); for k = 1:size(targets,1) R = targets(k,1); v = targets(k,2); A = targets(k,3); tau = 2*R/c; % 双程时延 fd = 2*v*fc/c; % 多普勒频率 % 时延通过频域相位搬移实现,避免整数采样点限制 echo = echo + A * ifft(fft(St_lfm) .* exp(-1j*2*pi*(0:Nr-1)*tau*fs/Nr)) ... .* exp(1j*2*pi*fd*t); end这段代码里有个容易翻车的地方:时延tau通常不是采样间隔的整数倍,直接做时域移位会引入量化误差。代码用的是频域相位搬移法,把时延转换成频域的线性相位,这样能实现亚采样点精度的时延,多目标之间的微小距离差才不会被采样栅格吃掉。多普勒项直接乘在时域上,因为仿真的是窄带信号,多普勒近似为载频偏移。四个目标的距离从3000米到8000米,速度有正有负,幅度也不同,基本覆盖了实际场景里强弱目标共存的情况。2.3 时域脉冲压缩的实现细节时域脉压就是匹配滤波,把接收信号和发射信号的共轭反转做卷积。原理简单,但matlab里实现时要注意卷积后的长度变化和能量归一化。% 时域脉冲压缩:匹配滤波 mf = conj(fliplr(St_lfm)); % 匹配滤波器冲激响应 pc_time = conv(echo, mf); % 时域卷积 pc_time = pc_time(1:Nr); % 截取有效长度 % 归一化并转dB pc_time_db = 20*log10(abs(pc_time)/max(abs(pc_time)));匹配滤波器的构造是conj(fliplr(St_lfm)),先翻转再取共轭,这是标准操作。conv之后信号长度变成Nr+Nr-1,代码截取前Nr个点,对应实际处理窗口。归一化用最大值做参考,转成dB后主瓣和旁瓣的对比一目了然。时域脉压的优点是直观,缺点是计算量大,目标数多、采样率高的时候conv会明显拖慢速度。我一般只在验证阶段用时域,正式跑大量数据切频域。3. 频域脉压与多普勒处理:从FFT到距离-速度二维图3.1 频域脉冲压缩的FFT实现频域脉压利用的是卷积定理:时域卷积等于频域相乘。把接收信号和匹配滤波器分别做FFT,点乘后再IFFT回来,计算量从O(N²)降到O(NlogN)。% 频域脉冲压缩 Nfft = 2^nextpow2(2*Nr); % FFT点数取2的幂,避免循环卷积混叠 Sf = fft(echo, Nfft); % 接收信号频谱 Hf = fft(mf, Nfft); % 匹配滤波器频谱 pc_freq = ifft(Sf .* Hf); % 频域相乘后IFFT pc_freq = pc_freq(1:Nr); % 截取有效长度 % 与时域结果对比 figure; plot(t*1e6, pc_time_db, 'b', 'LineWidth', 1.2); hold on; plot(t*1e6, 20*log10(abs(pc_freq)/max(abs(pc_freq))), 'r--', 'LineWidth', 1.2); xlabel('时间 (\mus)'); ylabel('幅度 (dB)'); legend('时域脉压', '频域脉压'); title('LFM时域与频域脉冲压缩对比'); grid on;Nfft取2的幂是为了FFT算法效率,同时要大于等于2Nr,否则频域相乘对应的是循环卷积,首尾会混叠。代码里用nextpow2(2Nr)自动算,不用手填。跑完这张对比图你会发现两条曲线几乎重合,说明两种实现等价,但频域版本在数据量大时快得多。这里有个细节:匹配滤波器的FFT也要补零到Nfft,否则长度不匹配会报错。3.2 多普勒维FFT与距离-速度二维矩阵脉冲压缩只解决了距离维,速度维要靠脉冲间的多普勒FFT。把每个脉冲的脉压结果按慢时间排列,再对慢时间做FFT,就得到距离-速度二维图。% 构建距离-多普勒矩阵 rd_matrix = zeros(Nr, M); for m = 1:M % 每个脉冲的回波(含多普勒相位) echo_m = zeros(1, Nr); for k = 1:size(targets,1) R = targets(k,1); v = targets(k,2); A = targets(k,3); tau = 2*R/c; fd = 2*v*fc/c; echo_m = echo_m + A * ifft(fft(St_lfm) .* ... exp(-1j*2*pi*(0:Nr-1)*tau*fs/Nr)) .* ... exp(1j*2*pi*fd*(m-1)/PRF); end % 频域脉压 pc_m = ifft(fft(echo_m, Nfft) .* Hf); rd_matrix(:, m) = pc_m(1:Nr); end % 慢时间FFT rd_map = fftshift(fft(rd_matrix, M, 2), 2); rd_map_db = 20*log10(abs(rd_map)/max(abs(rd_map(:)))); % 画距离-速度二维图 figure; imagesc(linspace(-PRF/2, PRF/2, M), (0:Nr-1)*c/(2*fs), rd_map_db); xlabel('多普勒频率 (Hz)'); ylabel('距离 (m)'); title('多目标距离-速度二维图'); colorbar; caxis([-40 0]);这段代码是整份仿真的核心。外层循环遍历M个脉冲,每个脉冲里再叠加所有目标的回波,多普勒相位用exp(1j2pifd(m-1)/PRF)逐脉冲累加。脉压后存入rd_matrix的对应列,最后对第二维做FFT并fftshift把零频移到中心。imagesc画出来的二维图里,每个目标是一个亮点,横坐标是多普勒频率,纵坐标是距离。四个目标在图上应该清晰可辨,如果糊成一团,多半是M太小或者PRF选得不对。3.3 CW波的多普勒处理差异CW波没有带宽,距离分辨率靠的是多普勒滤波,这点和LFM完全不同。代码里CW的处理链路单独走一条,但共用多目标模型。% CW波多普勒处理 rd_cw = zeros(1, M); for m = 1:M echo_cw = 0; for k = 1:size(targets,1) v = targets(k,2); A = targets(k,3); fd = 2*v*fc/c; echo_cw = echo_cw + A * exp(1j*2*pi*fd*(m-1)/PRF); end rd_cw(m) = echo_cw; end % 多普勒FFT doppler_spectrum = fftshift(fft(rd_cw, M)); freq_axis = linspace(-PRF/2, PRF/2, M); figure; plot(freq_axis, 20*log10(abs(doppler_spectrum)/max(abs(doppler_spectrum)))); xlabel('多普勒频率 (Hz)'); ylabel('幅度 (dB)'); title('CW波多普勒频谱'); grid on;CW波的处理简单得多,因为没有距离维,只做慢时间采样和FFT。四个目标的多普勒频率不同,在频谱上表现为四个峰。如果两个目标速度相近,CW波就分不开了,这是它的体制局限。代码把CW和LFM放在一起,就是为了让你看到这种差异:LFM靠大带宽获得距离分辨率,CW靠长相干积累获得速度分辨率,两者互补。4. 避坑与常见问题:多目标脉压仿真里那些让人抓狂的细节4.1 距离维出现假峰现象:脉压后除了真实目标位置,还冒出几个幅度较低的尖峰。原因通常是FFT点数不足导致循环卷积混叠,或者多目标叠加时幅度饱和引起非线性。解决方法是把Nfft设为至少2倍信号长度,并在叠加前检查各目标幅度之和是否超过归一化范围。我一般会在叠加后做一次max(abs(echo))检查,超过1就整体缩放。4.2 多普勒维目标模糊现象:距离-速度二维图上,一个目标在速度维上分裂成两个对称的峰。原因是多普勒频率超过了PRF/2,发生频谱混叠。解决方法是提高PRF或者降低载频,让最大多普勒频率落在[-PRF/2, PRF/2]内。仿真前先算一下fd_max = 2v_maxfc/c,和PRF/2比一比,这是血泪经验。4.3 时域和频域脉压结果不一致现象:两条曲线在主瓣处对不齐,旁瓣差异明显。原因多半是时域conv后截取位置不对,或者频域FFT点数没补零到2Nr。解决方法是统一截取中心对齐的位置,频域版本确保Nfft >= 2Nr。另外检查匹配滤波器是否用了conj(fliplr()),漏掉共轭或翻转都会导致结果完全错误。4.4 CW波频谱峰展宽现象:CW波多普勒谱的峰比理论值宽。原因是脉冲积累数M太小,频率分辨率等于PRF/M,M不够时峰自然宽。解决方法是增大M,或者降低PRF。但PRF降低又可能引起多普勒混叠,这两个参数要折中。我一般先根据速度范围定PRF,再根据分辨率要求定M。4.5 多目标幅度差异导致弱目标被淹没现象:强目标的旁瓣盖住了弱目标的主瓣,二维图上弱目标消失。原因是脉压后的旁瓣电平不够低,LFM的旁瓣通常在-13dB左右。解决方法是加窗抑制旁瓣,比如Hamming窗或Taylor窗,但窗函数会展宽主瓣,降低分辨率。代码里可以加一行St_lfm = St_lfm .* hamming(Nr)';试试效果,权衡旁瓣和分辨率。5. 二次开发与参数调优:把这套仿真改成你自己的雷达场景拿到这份代码后,最直接的改造是替换目标参数表。targets矩阵每行是[距离, 速度, 幅度],你按自己的场景填就行。比如要做近距离低速目标检测,把距离改到几百米,速度改到几十米每秒,同时把PRF调低避免多普勒混叠。改完跑一遍,看二维图上的目标是否可分辨,这是最快的验证方式。第二个改造点是波形参数。LFM的带宽B和脉宽Tp决定了距离分辨率和脉压增益,B越大分辨率越高,但采样率也要跟着提。CW波的积累时间M/PRF决定了速度分辨率,积累时间越长分辨率越高,但仿真也越慢。我一般会做一个参数扫描脚本,把B和M做成循环变量,跑一组看分辨率变化曲线,这样能快速找到适合自己场景的参数组合。第三个改造点是加窗和滤波。实际雷达里为了抑制旁瓣,发射信号会加窗,接收端也会做加窗处理。你可以在St_lfm生成后乘一个Hamming窗,或者在频域脉压前对匹配滤波器频谱加窗。加窗后主瓣展宽、旁瓣降低,具体效果跑一下对比图就清楚了。注意窗函数要归一化,否则脉压增益会变。第四个改造点是扩展成MIMO或者相控阵。这份代码是单通道的,如果你要做阵列处理,需要在多目标模型里加上导向矢量,每个阵元的回波乘以对应的相位偏移,然后做波束形成再脉压。这一步改动较大,但核心的脉压和多普勒处理逻辑可以直接复用。最后一个技巧是关于仿真速度的。多目标、多脉冲、高采样率的时候,matlab的循环会非常慢。我一般会把内层循环向量化,用矩阵运算代替for循环。比如多目标叠加可以写成echo = sum(A.' .* exp(1j*2*pi*fd.'*t) .* ...)的形式,速度能快好几倍。另外频域脉压的FFT可以用matlab的fft函数直接处理矩阵,一次算完所有脉冲,不用逐个循环。从那以后我每次跑多目标仿真前,都强制先算一遍最大多普勒频率和距离分辨率,确认参数不混叠、不模糊再开跑。这个习惯帮我省了无数次的返工。希望帮到你。本文还有配套的精品资源,点击获取
简介:本资源面向雷达信号处理方向的学习者与工程人员,聚焦多目标场景下LFM调频连续波与CW波的脉冲压缩问题,提供一套可直接运行的Matlab仿真程序。程序支持自行设置目标数量,默认配置为2个目标,通过LFM脉冲压缩后每个目标对应出现一个波峰,便于直观观察多目标分辨效果。资源包共3个文件,包含2个m脚本与1份pdf说明文档,分别对应CW波与LFM信号的仿真实现及原理讲解,压缩包整体约104KB,体积轻量、便于快速上手。仿真同时采用时域与频域两种方法完成脉冲压缩,并对比验证两种方式得到的回波幅度结果一致,有助于读者理解匹配滤波的实现差异与等价性。目前已有1432人学习下载,适合作为雷达信号处理课程实验、脉冲压缩算法入门练习及多目标检测仿真的参考素材。1. 多目标雷达仿真的起点:为什么LFM和CW波要放在一起做脉冲压缩做雷达信号处理的同学多半遇到过这个场景:仿真里只有一个目标时,脉压结果干净漂亮,一旦把目标数加到三五个,距离维上就开始出现莫名其妙的假峰,速度维上目标之间互相“串门”,你盯着matlab的figure窗口怀疑人生。这份“多目标下LFM调频连续波和CW波的(时域、频域)脉冲压缩matlab仿真程序”,解决的正是这个从单目标到多目标的跨越问题。它把线性调频连续波(LFM)和单频连续波(CW)两种体制放在同一套仿真框架里,分别从时域和频域两条路径实现脉冲压缩,让你能直观对比不同波形、不同处理域下多目标的分辨表现。适合正在做雷达信号处理课程设计、论文仿真验证,或者想搞明白匹配滤波到底在matlab里怎么落地的开发者。关键词里的matlab、脉冲压缩、雷达信号处理、多目标识别,这四个词基本就是这份代码的全部骨架。2. 仿真框架拆解:LFM与CW波的双体制信号生成链路2.1 两种波形的数学定义与参数化建模LFM信号的核心是瞬时频率随时间线性变化,数学上写成复指数形式,调频斜率K等于带宽除以脉宽。CW波则是单一频率的连续波,靠长时间积累获得多普勒分辨率。这份仿真程序把两者的参数统一到一张配置表里,改一个采样率或脉宽,两种波形同步生效,避免了两套代码各改各的混乱。% 雷达系统参数配置(LFM与CW共用) c = 3e8; % 光速 fc = 10e9; % 载频 10GHz B = 50e6; % LFM带宽 50MHz Tp = 10e-6; % 脉冲宽度 10us K = B/Tp; % 调频斜率 fs = 100e6; % 采样率 100MHz PRF = 10e3; % 脉冲重复频率 10kHz M = 64; % 脉冲积累数 % LFM信号生成 t = -Tp/2 : 1/fs : Tp/2 - 1/fs; St_lfm = exp(1j*pi*K*t.^2); % 复包络 % CW信号生成(单频,靠多普勒分辨) St_cw = exp(1j*2*pi*fc*t); % 载频连续波这里有几个参数直接决定后面脉压的效果。采样率fs必须满足奈奎斯特采样定理,对于50MHz带宽的LFM,fs至少100MHz,代码里取的就是这个临界值。脉冲积累数M决定了多普勒维的FFT点数,M越大速度分辨率越高,但仿真时间也线性增长。调频斜率K是LFM的灵魂,它决定了距离分辨率和脉压后的主瓣宽度。我一般会把Tp和B做成可调变量,跑不同组合看分辨率变化,这是理解波形参数最直接的方式。2.2 多目标回波叠加模型多目标仿真的关键是把每个目标的时延和多普勒分别算出来,再叠加到接收信号上。时延对应距离,多普勒对应速度,两个维度独立控制,这样才能验证脉冲压缩在距离-速度二维平面上的联合分辨能力。% 多目标参数:每行一个目标 [距离(m), 速度(m/s), 幅度] targets = [3000, 150, 1.0; 3050, -80, 0.8; 5000, 200, 0.6; 8000, -120, 0.9]; Nr = length(t); % 快时间采样点数 echo = zeros(1, Nr); for k = 1:size(targets,1) R = targets(k,1); v = targets(k,2); A = targets(k,3); tau = 2*R/c; % 双程时延 fd = 2*v*fc/c; % 多普勒频率 % 时延通过频域相位搬移实现,避免整数采样点限制 echo = echo + A * ifft(fft(St_lfm) .* exp(-1j*2*pi*(0:Nr-1)*tau*fs/Nr)) ... .* exp(1j*2*pi*fd*t); end这段代码里有个容易翻车的地方:时延tau通常不是采样间隔的整数倍,直接做时域移位会引入量化误差。代码用的是频域相位搬移法,把时延转换成频域的线性相位,这样能实现亚采样点精度的时延,多目标之间的微小距离差才不会被采样栅格吃掉。多普勒项直接乘在时域上,因为仿真的是窄带信号,多普勒近似为载频偏移。四个目标的距离从3000米到8000米,速度有正有负,幅度也不同,基本覆盖了实际场景里强弱目标共存的情况。2.3 时域脉冲压缩的实现细节时域脉压就是匹配滤波,把接收信号和发射信号的共轭反转做卷积。原理简单,但matlab里实现时要注意卷积后的长度变化和能量归一化。% 时域脉冲压缩:匹配滤波 mf = conj(fliplr(St_lfm)); % 匹配滤波器冲激响应 pc_time = conv(echo, mf); % 时域卷积 pc_time = pc_time(1:Nr); % 截取有效长度 % 归一化并转dB pc_time_db = 20*log10(abs(pc_time)/max(abs(pc_time)));匹配滤波器的构造是conj(fliplr(St_lfm)),先翻转再取共轭,这是标准操作。conv之后信号长度变成Nr+Nr-1,代码截取前Nr个点,对应实际处理窗口。归一化用最大值做参考,转成dB后主瓣和旁瓣的对比一目了然。时域脉压的优点是直观,缺点是计算量大,目标数多、采样率高的时候conv会明显拖慢速度。我一般只在验证阶段用时域,正式跑大量数据切频域。3. 频域脉压与多普勒处理:从FFT到距离-速度二维图3.1 频域脉冲压缩的FFT实现频域脉压利用的是卷积定理:时域卷积等于频域相乘。把接收信号和匹配滤波器分别做FFT,点乘后再IFFT回来,计算量从O(N²)降到O(NlogN)。% 频域脉冲压缩 Nfft = 2^nextpow2(2*Nr); % FFT点数取2的幂,避免循环卷积混叠 Sf = fft(echo, Nfft); % 接收信号频谱 Hf = fft(mf, Nfft); % 匹配滤波器频谱 pc_freq = ifft(Sf .* Hf); % 频域相乘后IFFT pc_freq = pc_freq(1:Nr); % 截取有效长度 % 与时域结果对比 figure; plot(t*1e6, pc_time_db, 'b', 'LineWidth', 1.2); hold on; plot(t*1e6, 20*log10(abs(pc_freq)/max(abs(pc_freq))), 'r--', 'LineWidth', 1.2); xlabel('时间 (\mus)'); ylabel('幅度 (dB)'); legend('时域脉压', '频域脉压'); title('LFM时域与频域脉冲压缩对比'); grid on;Nfft取2的幂是为了FFT算法效率,同时要大于等于2Nr,否则频域相乘对应的是循环卷积,首尾会混叠。代码里用nextpow2(2Nr)自动算,不用手填。跑完这张对比图你会发现两条曲线几乎重合,说明两种实现等价,但频域版本在数据量大时快得多。这里有个细节:匹配滤波器的FFT也要补零到Nfft,否则长度不匹配会报错。3.2 多普勒维FFT与距离-速度二维矩阵脉冲压缩只解决了距离维,速度维要靠脉冲间的多普勒FFT。把每个脉冲的脉压结果按慢时间排列,再对慢时间做FFT,就得到距离-速度二维图。% 构建距离-多普勒矩阵 rd_matrix = zeros(Nr, M); for m = 1:M % 每个脉冲的回波(含多普勒相位) echo_m = zeros(1, Nr); for k = 1:size(targets,1) R = targets(k,1); v = targets(k,2); A = targets(k,3); tau = 2*R/c; fd = 2*v*fc/c; echo_m = echo_m + A * ifft(fft(St_lfm) .* ... exp(-1j*2*pi*(0:Nr-1)*tau*fs/Nr)) .* ... exp(1j*2*pi*fd*(m-1)/PRF); end % 频域脉压 pc_m = ifft(fft(echo_m, Nfft) .* Hf); rd_matrix(:, m) = pc_m(1:Nr); end % 慢时间FFT rd_map = fftshift(fft(rd_matrix, M, 2), 2); rd_map_db = 20*log10(abs(rd_map)/max(abs(rd_map(:)))); % 画距离-速度二维图 figure; imagesc(linspace(-PRF/2, PRF/2, M), (0:Nr-1)*c/(2*fs), rd_map_db); xlabel('多普勒频率 (Hz)'); ylabel('距离 (m)'); title('多目标距离-速度二维图'); colorbar; caxis([-40 0]);这段代码是整份仿真的核心。外层循环遍历M个脉冲,每个脉冲里再叠加所有目标的回波,多普勒相位用exp(1j2pifd(m-1)/PRF)逐脉冲累加。脉压后存入rd_matrix的对应列,最后对第二维做FFT并fftshift把零频移到中心。imagesc画出来的二维图里,每个目标是一个亮点,横坐标是多普勒频率,纵坐标是距离。四个目标在图上应该清晰可辨,如果糊成一团,多半是M太小或者PRF选得不对。3.3 CW波的多普勒处理差异CW波没有带宽,距离分辨率靠的是多普勒滤波,这点和LFM完全不同。代码里CW的处理链路单独走一条,但共用多目标模型。% CW波多普勒处理 rd_cw = zeros(1, M); for m = 1:M echo_cw = 0; for k = 1:size(targets,1) v = targets(k,2); A = targets(k,3); fd = 2*v*fc/c; echo_cw = echo_cw + A * exp(1j*2*pi*fd*(m-1)/PRF); end rd_cw(m) = echo_cw; end % 多普勒FFT doppler_spectrum = fftshift(fft(rd_cw, M)); freq_axis = linspace(-PRF/2, PRF/2, M); figure; plot(freq_axis, 20*log10(abs(doppler_spectrum)/max(abs(doppler_spectrum)))); xlabel('多普勒频率 (Hz)'); ylabel('幅度 (dB)'); title('CW波多普勒频谱'); grid on;CW波的处理简单得多,因为没有距离维,只做慢时间采样和FFT。四个目标的多普勒频率不同,在频谱上表现为四个峰。如果两个目标速度相近,CW波就分不开了,这是它的体制局限。代码把CW和LFM放在一起,就是为了让你看到这种差异:LFM靠大带宽获得距离分辨率,CW靠长相干积累获得速度分辨率,两者互补。4. 避坑与常见问题:多目标脉压仿真里那些让人抓狂的细节4.1 距离维出现假峰现象:脉压后除了真实目标位置,还冒出几个幅度较低的尖峰。原因通常是FFT点数不足导致循环卷积混叠,或者多目标叠加时幅度饱和引起非线性。解决方法是把Nfft设为至少2倍信号长度,并在叠加前检查各目标幅度之和是否超过归一化范围。我一般会在叠加后做一次max(abs(echo))检查,超过1就整体缩放。4.2 多普勒维目标模糊现象:距离-速度二维图上,一个目标在速度维上分裂成两个对称的峰。原因是多普勒频率超过了PRF/2,发生频谱混叠。解决方法是提高PRF或者降低载频,让最大多普勒频率落在[-PRF/2, PRF/2]内。仿真前先算一下fd_max = 2v_maxfc/c,和PRF/2比一比,这是血泪经验。4.3 时域和频域脉压结果不一致现象:两条曲线在主瓣处对不齐,旁瓣差异明显。原因多半是时域conv后截取位置不对,或者频域FFT点数没补零到2Nr。解决方法是统一截取中心对齐的位置,频域版本确保Nfft >= 2Nr。另外检查匹配滤波器是否用了conj(fliplr()),漏掉共轭或翻转都会导致结果完全错误。4.4 CW波频谱峰展宽现象:CW波多普勒谱的峰比理论值宽。原因是脉冲积累数M太小,频率分辨率等于PRF/M,M不够时峰自然宽。解决方法是增大M,或者降低PRF。但PRF降低又可能引起多普勒混叠,这两个参数要折中。我一般先根据速度范围定PRF,再根据分辨率要求定M。4.5 多目标幅度差异导致弱目标被淹没现象:强目标的旁瓣盖住了弱目标的主瓣,二维图上弱目标消失。原因是脉压后的旁瓣电平不够低,LFM的旁瓣通常在-13dB左右。解决方法是加窗抑制旁瓣,比如Hamming窗或Taylor窗,但窗函数会展宽主瓣,降低分辨率。代码里可以加一行St_lfm = St_lfm .* hamming(Nr)';试试效果,权衡旁瓣和分辨率。5. 二次开发与参数调优:把这套仿真改成你自己的雷达场景拿到这份代码后,最直接的改造是替换目标参数表。targets矩阵每行是[距离, 速度, 幅度],你按自己的场景填就行。比如要做近距离低速目标检测,把距离改到几百米,速度改到几十米每秒,同时把PRF调低避免多普勒混叠。改完跑一遍,看二维图上的目标是否可分辨,这是最快的验证方式。第二个改造点是波形参数。LFM的带宽B和脉宽Tp决定了距离分辨率和脉压增益,B越大分辨率越高,但采样率也要跟着提。CW波的积累时间M/PRF决定了速度分辨率,积累时间越长分辨率越高,但仿真也越慢。我一般会做一个参数扫描脚本,把B和M做成循环变量,跑一组看分辨率变化曲线,这样能快速找到适合自己场景的参数组合。第三个改造点是加窗和滤波。实际雷达里为了抑制旁瓣,发射信号会加窗,接收端也会做加窗处理。你可以在St_lfm生成后乘一个Hamming窗,或者在频域脉压前对匹配滤波器频谱加窗。加窗后主瓣展宽、旁瓣降低,具体效果跑一下对比图就清楚了。注意窗函数要归一化,否则脉压增益会变。第四个改造点是扩展成MIMO或者相控阵。这份代码是单通道的,如果你要做阵列处理,需要在多目标模型里加上导向矢量,每个阵元的回波乘以对应的相位偏移,然后做波束形成再脉压。这一步改动较大,但核心的脉压和多普勒处理逻辑可以直接复用。最后一个技巧是关于仿真速度的。多目标、多脉冲、高采样率的时候,matlab的循环会非常慢。我一般会把内层循环向量化,用矩阵运算代替for循环。比如多目标叠加可以写成echo = sum(A.' .* exp(1j*2*pi*fd.'*t) .* ...)的形式,速度能快好几倍。另外频域脉压的FFT可以用matlab的fft函数直接处理矩阵,一次算完所有脉冲,不用逐个循环。从那以后我每次跑多目标仿真前,都强制先算一遍最大多普勒频率和距离分辨率,确认参数不混叠、不模糊再开跑。这个习惯帮我省了无数次的返工。希望帮到你。本文还有配套的精品资源,点击获取