变换域通信系统TDCS:低截获信号波形设计与MATLAB实现
2026/9/23 17:06:48 网站建设 项目流程

简介:围绕变换域通信系统(TDCS)的一份Matlab源码包,聚焦低截获(LPI)与抗截获信号设计,适合通信工程学生、安全通信研究者,以及希望实现隐蔽传输的工程师。压缩包内共12个文件,全部为.m脚本,整体仅5KB,代码结构简洁但功能层次完整:主控流程、干扰建模、伪随机序列生成、相位处理和多组调制/解调算法均包含在内,便于横向对比不同变换域策略。已有189人学习下载,可作为抗截获技术入门、课程设计或小型仿真的参考资料。通过运行和拆解这些脚本,可以直观理解TDCS以类噪声基函数替代传统载波调制的核心思想,掌握信号在变换域中的低检测概率与抗干扰特性;同时也能学习干扰环境下的调制解调实现技巧,为构建低截获、抗干扰的通信系统提供可复用的代码基础。资源虽小,但麻雀虽小五脏俱全,适合快速验证算法思路并做二次开发。

1. 低截获信号为什么绕不开 TDCS:从“不敢发”到“敢发出去”

做抗截获通信的人,迟早会撞上一个尴尬场景:射频前端已经能做到很高的灵敏度,但信号一发射出去,频谱仪上那一根根谱线就像在告诉侦收方“我在这里”。传统扩频能做到宽带,却难以灵活适应复杂电磁环境——干扰来了只能整段避让,可用带宽白白浪费。TDCS(变换域通信系统)在这类需求里脱颖而出,核心思路不是“把信号藏进噪声”,而是“先看清频谱环境,再把信号拼成噪声的样子发出去”。它把频谱感知、置零避让、伪随机相位加权融进同一个波形设计框架,最终得到的是宽带、类噪声、低功率谱密度、被截获概率很低的信号。这篇文章面向的读者是正在做抗干扰通信物理层、或者在评估低截获方案选型的工程师:你要知道TDCS的基函数怎么构造、遮蔽向量怎么用、接收端怎么把类噪声信号捞回来,更要清楚哪些参数会翻车、哪些坑会浪费半个月。

2. 变换域通信的三个基础:频谱环境感知、遮蔽向量与低截获信号成型

2.1 为什么在变换域里“绕开”干扰:选频谱拼接而不是陷波滤波

第一次接触TDCS时,很容易把它和传统自适应滤波器混为一谈。两者思路完全不同。传统抗干扰是“我发我的,你干扰你的,我在接收端想办法把干扰滤掉”;TDCS是先感知频谱,看哪些频点被占、哪些干净,然后发射端直接绕开占用的频段,只用干净频段拼出一个宽带信号发出去。这个差别决定了TDCS的本质:它把频谱环境的感知结果直接编码进发射波形,接收端不需要做复杂的干扰对消,只需要用同一个基函数做相关处理就能把数据解出来。

在整个TDCS链路里,有一个贯穿始终的对象——频谱感知结果对应的遮蔽向量。常见的做法是用FFT把环境采样变换到频域,逐频点做能量估计。实际系统中,先把工作频段切成若干子带,每个子带用N点FFT分解。然后把频点按“占用”和“空闲”二值化,形成一个0/1序列,就是遮蔽向量。置1表示“这个频点干净,可以用”,置0表示“有干扰,不用”。

这里有个关键的门限问题:怎么判定一个频点算“被干扰”?我一般会先统计一段底噪,用底噪均值加若干倍标准差作为判决线。比如均值加3σ,超过就置0。这个σ的估计方式直接影响误码性能。实践中用滑动窗口不断更新底噪估计,比一次性算整体均值稳得多,尤其是干扰是突发性的时候。

2.2 用伪随机相位做低截获处理:基函数构造与前向变换

拿到遮蔽向量之后,要把它变成可以发射的波形,这一步是TDCS最有特色的地方:基函数构造。常见做法是对遮蔽向量中置1的每个频点乘一个伪随机(PN)相位因子,再做IFFT,得到时域基函数。基函数在数学上表示为对频域幅度和随机相位的组合做逆傅里叶变换。

相位随机化的意义在于:如果直接把遮蔽向量IFFT出来,时域波形会有很大的峰值波动(高峰均比),既容易被能量检测发现,又对功放不友好。加上随机相位后,波形在时域上变得平坦,峰值因子明显下降,功率谱也趋于均匀。这一步从信号设计层面就把低截获做进去了,而不是靠发射机后端去补救。

前向变换有几个工程细节。FFT点数不能太小,至少256以上才有足够的频谱分辨率。PN序列的生成要保证同一符号内不同频点的相位相互独立,否则频域依然会有可辨识的相关峰。最关键的一点是:发射端和接收端必须共享同一组PN相位序列,连种子都必须一致。接收端拿到同样的遮蔽向量后,用相同种子恢复基函数,再做解调。

2.3 把频谱感知量化成可用频点:遮蔽向量在LPI设计里的双重角色

遮蔽向量在TDCS里承担两个角色。第一个是发射端选频的开关:哪些频点可以参与发射,哪些必须弃用。第二个是接收端解调的参照:接收端要恢复基函数,必须知道发射端的遮蔽向量是什么。换句话说,遮蔽向量本身是一种元信息——它不直接携带业务数据,但决定了业务数据以什么频谱组合方式发出去。

正因为这样,遮蔽向量本身的抗截获特性也很重要。如果每次信号都固定用某几个频段,侦收方只要多次统计就能反推出频谱使用规律,抗截获就无从谈起。实际系统里我会给遮蔽向量再加一层伪随机化:在PN种子不变的前提下,对遮蔽向量本身做随机的子载波选择,配合周期性的更新,让信号对外展现的频谱占位模式呈随机游走状。

这套组合下来,TDCS对外呈现的信号特征是:宽带、类噪声、低功率谱密度、频谱占位随机。这三者合在一起,就是工程上通常说的LPI(低截获概率)信号的定义。加上变换域处理天然规避窄带干扰,TDCS在军事通信、无人机数据链、应急抗干扰通信里都是很常见的备选方案。

3. 用 MATLAB 把 TDCS 发射机搭起来:从频谱感知到基函数生成的代码骨架

3.1 工程环境与最小参数表:先定分辨率与符号长度

动手写代码之前,先把参数定下来。这里给一套我在仿真阶段常用的参数组合,适合验证TDCS核心链路,也适合拷到自己工程里改。

参数名符号数值备注
FFT点数N256频率分辨率直接决定可感知干扰的最小宽度
子载波间隔Δf15 kHz每个频点对应带宽
总带宽B3.84 MHz256 × 15 kHz,对齐常规宽带通信带宽
PN序列长度L_pnN每个频点对应一个相位
数据符号映射MQPSK复杂度低,适合验证LPI链路
干扰频点数J24覆盖约360 kHz窄带干扰
底噪门限系数β3(均值+3σ)过高丢频点,过低误判干扰

这套参数的逻辑是:FFT点数决定频谱切多细,子载波间隔决定每个频点多宽,两者相乘是总带宽。PN序列和FFT点数同长,保证每个频谱点有独立随机相位。QPSK是最简单的数据映射方式,先跑通链路再去升级OFDM类多载波叠加。

3.2 频谱感知模块:用 FFT 幅度做门限判决,输出遮蔽向量

频谱感知是TDCS链路里第一个需要工程化的模块。输入是一段时域采样信号,输出是N点遮蔽向量。核心步骤:FFT、幅度归一化、门限判决。

function [mask, spectrum_db] = spectral_sensing(waveform, n_fft, noise_floor_db, threshold_sigma) % 输入: waveform - 时域采样, 长度需 >= n_fft % n_fft - FFT点数, 对应频率分辨率 % noise_floor_db - 底噪均值(dB), 用来算门限 % threshold_sigma - 门限系数, 一般取2.5~3.5 % 输出: mask - 遮蔽向量, 1=可用频点, 0=置零 % spectrum_db - 平滑后的频谱幅度(dB) segment = waveform(1:n_fft); window = hann(n_fft); spectrum = fft(segment .* window, n_fft); spectrum_db = 20 * log10(abs(spectrum) + 1e-12); % 滑动平均平滑频谱, 避免单点毛刺误判 avg_window = 32; kernel = ones(1, avg_window) / avg_window; spectrum_smoothed = conv(spectrum_db, kernel, 'same'); % 门限: 底噪均值 + threshold_sigma * 标准差 noise_std = std(spectrum_smoothed(spectrum_smoothed < noise_floor_db + 10)); threshold = noise_floor_db + threshold_sigma * noise_std; % 遮蔽向量: 超过门限置0 (被干扰), 否则置1 (可用) mask = double(spectrum_smoothed < threshold); % 保护: 连续置0段太短(<4个频点)则恢复为1, 避免频段碎片化 idx = find(mask == 0); if ~isempty(idx) diff_idx = diff(idx); split_pos = find(diff_idx ~= 1); seg_start = [1, split_pos+1]; seg_end = [split_pos, length(idx)]; for k = 1:length(seg_start) seg = idx(seg_start(k):seg_end(k)); if length(seg) < 4 mask(seg) = 1; end end end end

这段代码里容易被忽略的工程点是滑动平均窗口avg_window的大小取32。窗口太大,窄带干扰会被抹平到看不出门限差异;窗口太小,单点毛刺容易误判。在3.84 MHz带宽、256点FFT的组合下,avg_window取32相当于对8个频点做平均,既能平滑底噪波动,又不会把窄带干扰完全抹掉。门限系数在仿真时用3,到外场测试我会调到2到2.5之间——实际底噪波动比仿真大,σ估计本身有偏差,留余量更稳。

频谱感知输出的mask是一串0和1。这个数组在后续基函数构造里会被反复引用。拿到mask之后先别急着生成基函数,把它可视化出来看一眼——如果可用频点碎片化严重(大量1和0交替出现),后面的波形质量会受牵连。

3.3 基函数生成与前向变换:相位随机化、IFFT与低截获信号的组装

拿到遮蔽向量,下一步把它变成可发射的基函数。这里拆成三步:第一步,遮蔽向量里置1的频点乘上随机相位;第二步,对乘完相位的频域序列做IFFT;第三步,把IFFT结果归一化,作为发射波形基函数。

function [basis, phase_map] = generate_tdcs_basis(mask, seed, n_fft, symbol_len, oversample) % 输入: mask - 频谱感知输出的遮蔽向量 % seed - 伪随机相位种子, 收发两端必须一致 % n_fft - FFT点数 % symbol_len - 每个TDCS符号的采样点数 % oversample - 过采样倍数(2或4), 提高时域分辨率 % 输出: basis - 归一化时域基函数 % phase_map - 每个频点的随机相位, 接收端重构用 rng(seed); freq_domain = zeros(1, n_fft); active_idx = find(mask == 1); for idx = active_idx phase = (rand - 0.5) * 2 * pi; % [-pi, pi) 均匀随机相位 freq_domain(idx) = exp(1j * phase); end % 共轭对称扩展到负频率, 保证IFFT后是实信号 for idx = active_idx idx_conj = n_fft - idx + 2; % MATLAB索引从1开始 if idx_conj >= 1 && idx_conj <= n_fft freq_domain(idx_conj) = conj(freq_domain(idx)); end end % 过采样: 频域中间补零, 等效时域插值 freq_padded = zeros(1, n_fft * oversample); freq_padded(1:n_fft/2) = freq_domain(1:n_fft/2); freq_padded(end-n_fft/2+1:end) = freq_domain(end-n_fft/2+1:end); % IFFT回时域 time_wave = ifft(freq_padded, n_fft * oversample); % 归一化到单位功率 power = mean(abs(time_wave).^2); basis = time_wave / sqrt(power); % 裁剪到符号长度 basis = basis(1:symbol_len); phase_map = angle(freq_domain); end

这里有一个特别值得注意的工程点:共轭对称扩展。如果只对正频率部分赋随机相位,不做负频率共轭对称处理,IFFT出来的时域波形就是复信号。实际射频链路要发射的是实信号,所以必须把负频率部分补成对应正频率的共轭。共轭对称做完之后,时域波形呈现类噪声特性。

另一个容易忽略的是过采样。不做的话,256点IFFT直接出来的时域波形点数太少,DA转换之后频谱会混叠。常见做法是在频域正负部分之间补零,等效时域插值。oversample取2或4都可以,取4时域分辨率更高,但计算量和存储也上去了。仿真阶段取2就够,到真实射频前端联调再上调。

基函数生成完就可以调制数据了。一个TDCS符号的调制方式:把QPSK符号直接乘在时域基函数上,再用循环前缀做保护间隔。符号之间相位连续性问题在TDCS里比OFDM好处理,因为基函数本身是类噪声的,时间同步偏移对相关接收的影响相对较小。

4. 组帧与同步:让接收机能找到信号、认得出波形

4.1 数据帧结构设计:前导、捕获序列与循环前缀的分工

基函数只是物理层的最小单元,要组成一个能实际工作的数据链路,还得把基函数组装成帧。TDCS的帧结构设计比OFDM多一层约束:接收端必须知道当前帧用的是哪一版遮蔽向量和哪一组PN种子,才能重构基函数。所以TDCS帧结构里除了常规的前导和导频,还要有专门携带“变换域配置信息”的部分。

我常用的帧结构是“前导 -> 捕获序列 -> 配置字段 -> 数据块 -> 保护间隔”五段。前导是一段固定已知的短序列,用来做粗同步和AGC收敛。捕获序列用TDCS基函数调制一组已知符号,接收端靠它完成精同步和信道估计。配置字段用最低速率编码携带遮蔽向量索引和PN种子号,相当于一个极低速率控制信道。后面的数据块才是真正的高速业务数据。

这种帧结构设计有个直观好处:即使遮蔽向量在每次频谱感知后都变化,接收端只要先解出配置字段拿到种子号,就能恢复出和发射端一致的基函数,后续数据块就能正常解调。代价是配置字段要占一点速率,但和整个低截获链路获得的收益相比完全值得。

4.2 同步处理策略:在类噪声波形里做延迟相关

同步是TDCS接收机里最容易出问题的地方。原因很简单:TDCS信号本身是类噪声的,自相关性不如传统训练序列好,粗同步时如果直接用匹配滤波找峰值,输出的相关峰会淹没在噪声里。工程上更稳的做法是用延迟相关做粗同步,再用本地重构基函数做精同步。

延迟相关的思路:发射端在帧头放两段完全相同的捕获序列,接收端用接收信号和它的延迟版本做共轭相乘,在窗口内做相关累加。由于噪声没有这种自我重复的结构,累加结果会把噪声抑制掉,只剩信号部分形成明显平台。粗同步找到平台起始位置后,再用本地重构出来的基函数做精相关,把定时偏移锁定到采样点级别。

这个方案在TDCS里有天然优势:TDCS基函数本身是收发两端共享的,接收端重构基函数的成本就是一次IFFT,用本地基函数做精同步能获得相当陡峭的相关峰。我的经验是:粗同步用延迟相关,精同步用匹配滤波,两层配合,即使在信噪比很低时也能把同步偏差控制在几个采样点以内。同步做完,解调才有意义。检查同步是否成功,直接看精相关峰的高度——低于某个门限就重新回到捕获阶段,不要硬着头皮往下解。

5. 接收端解调与干扰对抗效果评估:怎么验证低截获真的有效

5.1 接收机链路:重构基函数、匹配相关与数据恢复

接收端第一步和发射端很像:根据配置字段里的种子号和遮蔽向量索引,重新生成时域基函数。生成方法和发射端完全一致,唯一要求是PN序列生成算法和种子必须对齐。这一步错了,后面解调全部白费。所以TDCS系统的PN序列生成算法在设计阶段就要定死,不能出现仿真一个版本、实测另一个版本的问题。

拿到本地基函数之后,解调核心操作就是匹配相关。接收信号乘以本地基函数共轭,在一个符号周期内做累加,累加结果就是数据符号的估计值。这个过程本质是把接收信号投影到已知基函数的子空间里,由于发射信号和基函数强相关,而干扰和噪声与基函数不相关,相关累加天然把干扰抑制掉了。

function [est_bits, corr_metric] = tdcs_demodulate(recv_signal, basis_local, symbol_len, data_len) % 输入: recv_signal - 接收时域信号(已从精同步位置对齐) % basis_local - 接收端重构的本地基函数 % symbol_len - 一个TDCS符号的采样点数 % data_len - 数据符号个数 % 输出: est_bits - 解调bit流 % corr_metric - 每个符号的相关累加值, 反映信号质量 data_start = length(recv_signal) - symbol_len * data_len; data_block = recv_signal(data_start+1:end); est_bits = zeros(1, data_len * 2); corr_metric = zeros(1, data_len); for i = 1:data_len seg = data_block((i-1)*symbol_len+1 : i*symbol_len); corr = sum(seg .* conj(basis_local)); corr_metric(i) = abs(corr) / (norm(seg) * norm(basis_local) + 1e-12); % QPSK判决: 按实部虚部象限映射2bit if real(corr) > 0 est_bits((i-1)*2+1) = 1; else est_bits((i-1)*2+1) = 0; end if imag(corr) > 0 est_bits((i-1)*2+2) = 1; else est_bits((i-1)*2+2) = 0; end end end

匹配相关输出的corr_metric是一个很实用的观测量。它反映当前符号里有多少能量来自“我们想要的基函数”而不是噪声和干扰。当corr_metric整体下降时,通常有三种可能:同步偏移、PN种子不对、干扰强到把基函数特征淹没。排查同步问题时,先看一眼corr_metric的统计值,再去看误码率,能省很多时间。

5.2 低截获与抗截获评估:三组量化指标与仿真对照

TDCS号称低截获,但评估是否真的低截获,不能靠感觉,要看指标。工程上常用三组指标评估低截获性能:功率谱密度是否低于噪声基底、时域波形峰均比(PAPR)是否足够低、循环谱或高阶统计量里是否存在可辨识的特征频率。

功率谱密度低是最直接的指标。把TDCS发射波形功率谱和同带宽噪声做对比,频谱图上应该几乎重合。如果有明显的离散谱线或周期性包络,截获接收机用窄带检测就能发现。峰均比对应信号包络起伏,PAPR超过10 dB的信号对能量检测来说是明显目标。PN相位随机化后PAPR一般能压到7到8 dB左右,和OFDM比低了3到4个dB。

循环谱特征最容易被忽略。时域波形看起来像噪声,但如果帧结构里有周期性重复字段(比如每帧都有的前导),循环谱在帧重复频率处就会产生可检测的谱线。避免办法有两个:一是加扰,把所有重复字段做数据相关的随机化;二是用非等间隔帧周期,让帧结构本身不呈现周期性。这两点在设计TDCS帧结构时就应该考虑进去。仿真里验证就是跑蒙特卡洛,同时导出波形做频谱和循环谱分析。误码率和低截获指标都达标,才算完成一版可用的TDCS物理层方案。

6. 检查与验证的五个技巧:把仿真里验证过的 TDCS 方案往外场迁移

第一个技巧是把门限系数β放在可观测的循环里扫。TDCS性能受遮蔽向量影响极大,遮蔽向量又完全由门限系数决定。β太小把噪声误判成干扰,白白丢掉可用频点;β太大让干扰漏进来。我一般会跑一个β从1.5到4.5、步长0.5的扫参循环,每次记录误码率和有效频点数,画出曲线再定。这个曲线还能反过来指导频谱感知模块的自动增益控制,底噪变化时β要能跟着联动,不能設死。

第二个技巧是PN相位随机化时不要对全部频点随机化,留一小组导频频点固定相位。TDCS全随机相位的抗截获特性好,但接收端信道估计只能靠数据块里的已知符号,始终带点不确定性。固定一小簇频点相位做导频,信道估计方差明显下降,误码率在高阶调制时会改善半dB到1dB。代价是导频频点不具备相位随机性,但数量少、位置随机,对整体低截获性能影响很小。

第三个技巧是循环前缀长度选择和OFDM不同。OFDM的循环前缀要覆盖多径时延扩展,TDCS结构类似,但基函数是宽带类噪声信号,多径对它造成的正交性损失比OFDM小。所以TDCS循环前缀可以比OFDM短一些,省下来的时间增加数据符号数量,速率提升还是有感的。在时延扩展小于2μs的场景,循环前缀取OFDM方案一半就够。

第四个技巧是接收端AGC要对准TDCS的类噪声波形而不是导频幅度。TDCS信号时域包络在随机相位作用下接近高斯分布,如果用导频功率设AGC,噪声段和数据段幅度会不匹配。正确做法是用延迟相关输出的平台区估计信号功率,再按这个功率归一化匹配相关输出。这个改动在仿真里看不出差别,但到实机上信噪比在0 dB以下时会直接影响同步稳定性。

第五个技巧是帧间隔随机化。循环谱特征问题,工程上最简单的化解方式就是让每帧起始时间在预设窗口内随机抖动。发射端和接收端通过配置字段里的帧序号同步这个抖动,既不影响捕获,又能把循环谱里的周期特征抹掉。这个技巧几乎不占实现成本,但对低截获性能改善很大。

TDCS参数调优,最终一定要回到频谱占用模式和峰值统计量两件事。我见过不少次仿真误码率很好看的方案,拿到外场一测才发现循环谱特征被侦收设备抓得死死的。仿真跑通误码率只是完成第一阶段,真正上线前,一定要把发射波形导出来,用频谱仪和信号分析仪做一遍循环谱分析。等这一步也过了,手上这套TDCS链路才是真正能拿出去扛事的方案。希望这些内容和代码骨架能帮到你,后续有具体参数上的问题再拿出来细调。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询