通信扩展——扩频技术(超级详细,附带Matlab代码)

目录

  • 1.前言
  • 2.扩频基础
    • [2.1 什么是扩频](#2.1 什么是扩频)
    • [2.2 扩频的原理是什么](#2.2 扩频的原理是什么)
    • [2.3 扩频理论支持](#2.3 扩频理论支持)
    • [2.4 扩频的种类有哪些](#2.4 扩频的种类有哪些)
    • [2.5 扩频的技术特点](#2.5 扩频的技术特点)
    • [2.6 扩频应用的领域](#2.6 扩频应用的领域)
  • [3. 扩频码的选择](#3. 扩频码的选择)
  • [4. 扩频工程的实现流程](#4. 扩频工程的实现流程)
  • [5. 扩频仿真实现](#5. 扩频仿真实现)
  • [6. 总结](#6. 总结)

1.前言

在我第一次接触到扩频这个知识点是在几年前,领导让添加扩频功能从而提高抗干扰能力,当时对扩频的通信理解不太深刻,扩频为什么可以提高抗干扰能力?什么是扩频?扩频的方式都有哪些?它的优点和缺点都有哪些?它的主要应用在哪些领域?从物理方面和数学方面怎么去理解?哈哈一系列问题冒了出来,因为扩频不是自己主要的工作内容,所以在工作之余对其进行了学习,进行了理解,如果有错误、不恰当和不完整的地方,欢迎留言指正交流,大家相互交流共同进步!

2.扩频基础

2.1 什么是扩频

扩频通信是一种通过人为地将传输信号的频谱宽度扩展至远大于其原始信息所需的最小带宽,并在接收端利用相应的解扩技术恢复原始信息的通信技术。简单来说就是,发射端将基带信号扩展,接收端再将扩展的信号恢复为原始的基带信号。

(1)扩频码解释

扩频的原理通俗解释:

matlab 复制代码
一扩频
给定参数
原始数据符号	:二进制1
扩频因子		:10
扩频码			:10	11	01	10	11

方法1:
确定映射规则:
采用:二进制0--->+1,二进制1--->-1
数据符号转为双极性表示:
数据符号1--->d= -1
扩频码10	11	01	10	11--->双极性序列:
c=[-1,+1,-1,-1,+1,-1,-1,+1,-1,-1]
进行扩频(逐码相乘)
si=d*ci=(-1)*ci
计算得到:
s=[+1,-1,+1,+1,-1,+1,+1,-1,+1,+1]
转换为二进制将双极性序列转为二进制(+1--->0,-1---1)
s=[0 1 0 0 1 0 0 1 0 0]

方法2:
从模2加法角度验证:数据1与扩频码1011011011逐渐异或:
1+1=0;
1+0=1;
1+1=0;
1+1=0;
1+0=1;
1+1=0;
1+1=0;
1+0=1;
1+1=0;
1+1=0
结果和方法1对齐

二 解扩
接收信号为扩频序列,以双极性形式进行表示:
r=s=[+1,-1,+1,+1,-1,+1,+1,-1,+1,+1]
本地生成相同的扩频码(双极性)
c_local=[-1,+1,-1,-1,+1,-1,-1,+1,-1,-1]
接收信号与本地扩频码的互相关:
corr=i=09ri.c_locali
逐项计算:
(+1)*(-1)=-1
(-1)*(+1)=-1
(+1)*(-1)=-1
(+1)*(-1)=-1
(-1)*(+1)=-1
(+1)*(-1)=-1
(+1)*(-1)=-1
(-1)*(+1)=-1
(+1)*(-1)=-1
(+1)*(-1)=-1
累加和:corr= -10
根据相关结果进行判决:
corr>0,判决数据0
corr<0,判决数据1
此处corr=-10<0,故判决为二进制1,数据恢复成功。

(2)图形法解释

具体如下图所示:

2.2 扩频的原理是什么

扩频通信最初开发应用是在军事领域,通过扩展信号的频带宽度达到安全通信的目的。我们都熟悉窄带信号容易被同频带内的信号阻塞(干扰或者淹没),当窄带信号固定(频率不随时间变化)时,容易被敌人截获。那么如果将同一个基带信号的频带变宽,信号能量不变的情况下,那么信号的包络幅度会降低,从而隐藏在噪声中,这样就不容易被截取和干扰了。

2.3 扩频理论支持

扩频通信的理论基础是香农定理:
C = B ∗ l o g 2 ( 1 + S N ) C=B*log_2 {(1+ \dfrac{S}{N})} C=B∗log2(1+NS)

其中,C是信道容量(比特/秒),B是信道带宽(Hz),S/N是信噪比。

在 S/N 很低(信号远小于噪声)的恶劣条件下,要维持信道容量 C 不变,唯一的途径就是极大地增加带宽 B,扩频通信正是主动将基带信号的频谱扩展到一个远大于其信息带宽的频带上进行传输。这看似"浪费"频谱,实则通过牺牲带宽资源,换取了对抗干扰、隐蔽、多址接入等宝贵性能,这种"带宽换性能"的思想是扩频通信的灵魂。带宽增加,对系统的抗噪声性能要求较低。

主要步骤:

(1)频谱扩展 :原始信息信号(带宽Bm,功率Pm )与一个高速率的伪随机码(Pseudo-Noise Code, PN Code)进行调制,伪随机码的速率Rc远高于信息速率Rm,其码片(Chip)宽度Tc远小于信息比特宽度Tb,扩展因子Gp=Tb/Tc=Rc/Rm>>1,称为处理增益。结果是信号功率被分散到一个极宽的频带(带宽Bc=1/Tc )上,其功率谱密度(单位频率内的功率)变得极低,甚至可能低于环境噪声底。这使得信号具有低截获概率,仿佛"隐藏"在噪声中。

(2)相关解扩 :接收机使用一个与发射端完全同步的相同伪随机码副本,对接收到的宽带信号进行"反扩展"。对于有用信号 ,本地伪随机码与接收信号中的伪随机码完全相关,将其"压缩"回原来的窄带信息信号,功率重新集中,谱密度恢复为高水平。对于窄带干扰 ,在解扩过程中,会被本地伪随机码"扩展"成宽带信号,其功率谱密度被大大降低,落入信息带宽内的干扰能量极小。对于宽带噪声 ,始终是宽带的,解扩不改变其谱密度。

解扩后,对窄带信息信号进行滤波,只取出中心频带 (Bm ) 内的信号与噪声。此时,信号功率基本无损恢复,而大部分干扰能量被滤除,从而显著提高了输出信噪比。

2.4 扩频的种类有哪些

(1)直接序列扩频

直接用高速伪随机序列与信息比特进行模二加,每个信息比特(或符号)被分割成多个更短的脉冲,称为"码片",从而将信号频谱扩展到与伪随机码速率相对应的带宽上。发射端原始窄带信号x 高速伪码= 宽带扩频信号。接收端接收到的宽带信号x 同步的相同伪码= 恢复的窄带信号+ 被扩宽的宽带噪声/干扰。
关键特点:

抗窄带干扰能力强,解扩时,有用信号被压缩回窄带,而窄带干扰被扩频码"打散"成宽带干扰,大部分被后续的窄带滤波器滤除。隐蔽性好,信号功率谱密度极低,近似于背景噪声。可实现码分多址,不同用户使用不同、正交或准正交的扩频码,可在同一频段同时通信。存在"远近效应",近处的强信号会淹没远处的弱信号,需要精确的功率控制。

直接序列扩频就像用一套特定的复杂密码(PN码)对一封信(信息)进行加密,使其看起来像一堆乱码(宽带低谱密度信号)。只有拥有相同密码本(同步的PN码)的人才能解密出原信

(2)跳频扩频

载波频率在一组预先设定的频点上,按照伪随机码序列快速地、不连续地跳变。信号在任一时刻是窄带的,但在一个较长的时间周期内观察,其频谱是宽带的。发射端信息调制在一个载波上,但该载波的频率在伪码控制下快速跳变。

接收端本地振荡器的频率与发射端同步跳变,从而始终能"跟上"信号,将其下变频到固定中频进行解调。
关键特点

抗频率选择性衰落和定频干扰,如果某个频点被干扰或严重衰落,只会损失在该频点传输的少量信息,通过编码可以恢复。它与DSSS的"硬抗"不同,FHSS是通过"躲避"来抗干扰。但是,对快跳频的同步要求高。

跳频分为分慢跳频和快跳频,慢跳频在一个频率上停留的时间间隔内传送多个信息符号。快跳频在一个信息符号的持续时间内,载波频率多次跳变。

就像两个人在一个嘈杂的派对上,按照事先约定好的随机顺序,在不同房间之间快速穿梭并低声交谈。偷听者即使在一个房间听到只言片语,也无法获得完整对话。

(3)跳时扩频

将时间轴分成许多小时隙,信息在伪随机码控制的、不连续的时隙内突发传输。大部分时间不发射信号,从而降低了信号的占空比,在时域上实现了"稀疏"传输。发射端仅在伪码指定的、非常短的时间内发射脉冲信号。接收端只在对应的时隙打开接收窗口接收信号。
关键特点

低平均功率,高瞬时功率,有利于降低被截获概率,并可与其它信号时分共享频谱。通常不单独使用:因为其本身抗干扰能力有限,且对定时同步要求极高。常与其他扩频方式结合,形成混合扩频,如时频跳变。

(4)线性调频扩频

在单个信息符号的持续时间内,让载波频率从一个值线性地扫频到另一个值(例如从低到高,称为"上啁啾")。信号带宽等于扫频的宽度。发射端用线性变化的频率对信息进行调制。接收端通过匹配滤波器(如脉冲压缩滤波器,对特定啁啾速率敏感)来检测信号。匹配滤波器将分散在扫频带宽内的信号能量压缩到一个很窄的时间脉冲内,提高了输出信噪比。
关键特点

处理增益高,实现相对简单。抗多径干扰,对特定设计的啁啾波形,匹配滤波器能区分主径和多径回波。多普勒容限,对目标相对运动引起的频率偏移不敏感。

(5)混合扩频

将上述两种或多种基本扩频方式结合起来,以取长补短,获得更优越的性能。

DS/FH:最常见的一种混合方式。先用伪码进行直接序列扩频,再进行载波频率跳变。结合了DSSS的抗窄带干扰能力和FHSS的抗频率选择性衰落及抗跟踪干扰能力,是军用抗干扰通信的经典方案。

DS/TH:结合了直扩和跳时,进一步降低了信号的检测概率。

FH/TH:在时域和频域上同时"跳动",增加了信号的不确定性。

2.5 扩频的技术特点

我们知道通信资源是很宝贵的,理论上带宽越窄越好,但是扩频反而扩展信号的带宽,这不是反其道而行吗?所以扩频通信的技术有优点也有缺点,这些要根据自己的需求进行决策选择。扩频的技术特点如下:

(1)我们可以通过计算扩频前后基带信号的带宽比值得到扩频增益,由于扩频前基带信号的带宽是固定的,所以扩频的增益越大,扩频后信号占用的带宽越大。

(2)基带信号经过扩频后,虽然带宽扩大,但是它的信号总体能量没有变化。由于能量没有改变但是带宽增大,所以信号的幅值会降低。

(3)强大的抗干扰能力,这是扩频通信最著名的特点。其本质是在接收端通过解扩,将有用信号能量"收集"起来,同时将干扰信号能量"稀释"掉。

(4)抗多径干扰,在直序扩频中,如果多径延迟大于一个码片宽度,接收端的伪码相关器会将大部分多径信号视为不相关的噪声处理掉,从而有效抑制多径。

(5)抗人为干扰,军事上,敌方难以在极宽的频带上施放与伪码同步的全频段干扰。跳频系统则通过"打一枪换一个地方"的方式躲避干扰。

(6)低截获概率与隐蔽性,扩频后,信号功率被"涂抹"在极宽的频带上,导致其功率谱密度极低,常常可以淹没在背景热噪声之下。非目标接收机(如侦察设备)很难通过常规的频谱扫描发现它的存在,看起来就像"背景噪声微微升高了一点"。

(7)抗侦测,即使被检测到,由于不知道确切的伪随机码图案,也无法解调出信息,从而实现了通信保密。

(8) 天然的多址接入能力(CDMA),不同用户可以使用不同的、准正交的扩频码在同一时间、同一频段内进行通信。接收机通过本地匹配的扩频码,只能解出与之相关的用户信号,而将其他用户的信号视为宽带干扰(其影响被处理增益Gp抑制)。

(9)精确的定时与测距能力,伪随机码具有尖锐的自相关特性。接收机通过调整本地伪码的相位,与接收信号进行相关运算,寻找相关峰值。峰值的位置精确对应了信号的传播时延。

扩频通信的卓越性能并非"免费午餐",它带来了以下代价和挑战:

(1)带宽效率极低,这是为获取上述优点付出的根本代价。它占用了远大于信息速率所需的带宽。例如,一个1kbps的数据流,用1Mcps的伪码扩频后,占用约1MHz带宽,带宽效率仅1bps/Hz,远低于高阶调制的传统系统。

(2)复杂的同步系统,扩频接收机必须在伪码相位、载波频率和符号定时上,与接收信号建立并维持精确的同步。这是系统正常工作的前提,也是最复杂、最脆弱的部分。

(3) 远近效应问题(尤指CDMA),在同一个频段内,如果距离接收机很近的移动台信号很强,而远处的移动台信号很弱,强信号会淹没弱信号,因为接收端的处理增益不足以抑制来自近处的强干扰。

(4)较高的实现复杂度与成本,高速处理,直序扩频需要生成和处理速率极高的伪码序列。快速跳频,跳频系统需要高速、高稳定度的频率合成器。同步电路,同步模块非常复杂。

总结与权衡

扩频通信是一种典型的 "资源转换"技术,它牺牲了"带宽效率",换来了抗干扰、低截获、多址、测距等一系列独特的、至关重要的性能。

2.6 扩频应用的领域

扩频通信在多个领域都有应用,概括如下:

(1)直接序列

CDMA蜂窝网络(如IS-95, WCDMA)、Wi-Fi(802.11b/g/n的部分标准)、GPS、北斗等卫星导航系统、蓝牙(部分模式)。

(2)跳频扩频

蓝牙(经典蓝牙使用FHSS)、早期军事通信、部分无线局域网标准(如HomeRF)、抗干扰数据链。

(3)跳时扩频

主要作为辅助手段,与其他扩频(如TH-UWB, 跳时超宽带)或多址技术结合使用。

(4)线性调频扩频

雷达系统(是主要应用领域)、声纳、部分卫星通信和物联网。

3. 扩频码的选择

扩频码的选择不是随意的是有一定要求的,扩频码的性能直接决定了整个扩频系统的抗干扰能力、多址容量、保密性、捕获与跟踪速度等关键指标。扩频码主要分为两大类:伪随机序列和正交/准正交码。M序列和GOLD序列都是伪随机序列,WALSH码属于正交码。

3.1伪随机序列

伪随机序列具有类似白噪声的统计特性,但它是确定的、可重复生成的。其核心特性包括:

  • 尖锐的自相关特性:在同步时自相关值很大,不同步时自相关值很小,用于信号的同步与捕获。
  • 低互相关特性:不同序列之间互相关值很小,用于区分不同用户的信号。
  • 长周期:确保序列不会在短时间内重复,增强抗干扰和保密性。
  • 平衡性:序列中"0"和"1"的数量大致相等。
    (1)M序列
      M序列是最长线性反馈移位寄存器序列,是最基本、也是最经典的伪随机序列。生成方式由n级线性反馈移位寄存器在特定抽头反馈下产生,周期为 P = 2^n - 1。
    优点:
      结构简单,易于生成和复制。具有理想的二值自相关函数, 零时延自相关值为P,非零时延自相关值为-1。这是其最重要的优点,使其在同步和测距(如GPS的C/A码)中表现优异,平衡性好。
    缺点:
      可用数量少,n级寄存器产生的M序列数量由本原多项式数量决定,数量约为 Φ(2^n - 1)/n,相对其周期来说非常有限。例如,n=10,M序列只有60个。这限制了其在需要大量码字系统(如大型CDMA网络)中的应用。
    (2)GOLD序列
      Gold序列是为了克服M序列数量少的缺点。生成方式为, 将两个周期相同、且互相关特性好的优选M序列进行模2加(异或)得到。一个n级寄存器可以产生 2^n + 1 个Gold序列(包括两个原始M序列)。
    优点:
      数量远多于M序列: 这是其最大优势。例如,n=10时,Gold序列有1025个,而m序列只有60个,非常适合于码分多址(CDMA)系统。
      互相关特性可控且一致, Gold序列的三值互相关函数 (-1, -t(n), t(n)-2),其最大值 t(n) 有理论上限,且所有序列对之间的互相关值都落在这三个值上,性能可预测。
    缺点:
      自相关性弱于m序列,Gold序列的非同步自相关值不是理想的-1,而是一个较小的负数。这意味着它的同步捕获性能略逊于纯M序列。
    平衡性不均, 并非所有Gold序列都具有完美的平衡性,有些序列中"0"比"1"多一个。

3.2正交码

这类码的核心特点是在理想同步条件下,不同码字之间的互相关为零。它们主要用于信道化,即在同一个频段上为多个用户提供完全正交的通道,避免多址干扰。

(1)WALSH码

生成方式为 通过哈达玛矩阵的递推产生。
优点:

完全正交, 在时间严格对齐(同步) 时,不同Walsh码之间的互相关为0,这是其最核心的优势。生成简单,数量多, 长度为N的Walsh码族包含N个正交码。
缺点:

对同步极其敏感,一旦不同用户的信号存在时延(异步),正交性会被严重破坏,导致严重的多址干扰。自相关性差,非同步自相关和互相关性能都很不理想。

3.3小结

扩频码的选择是扩频系统设计的关键。M序列和Gold序列因其良好的伪随机特性,主要用于抗干扰、保密、区分基站/用户(多址)和同步。而Walsh码和OVSF码因其正交性,主要用于同步条件下的正交信道划分,以最大化系统容量。理解每种码的数学特性和工程折衷,是设计高效、可靠扩频系统的基础。

4. 扩频工程的实现流程

发射端:信源输入后,对信源进行编码,主要作用是将原始信息转换为数字信号。对编码后的信源进行信道编码,主要作用是通过添加纠错码,提高抗干扰的能力。然后,对信道编码数据进行扩频调制,利用高速伪随机码(PN码)扩展信号频谱。最后进行载波调制,将扩频信号调制到射频载波,通过无线信道进行传输发送。

接收端:通过接收无线信道发射的数据后,进行载波解调,主要是恢复基带信号,利用同步捕获手段,获取伪随机码同步,通过使用本地PN码进行解扩,然后进行信道解码纠正传输中的错误,最后进行信源解码恢复原始信息。

发射端和接收端,解扩流程图如下:

5. 扩频仿真实现

Matlab仿真代码如下:

matlab 复制代码
matlab
%% 直接序列扩频(DSSS)系统仿真 - MATLAB 2016兼容
clear all; close all; clc;

%% 1. 参数设置
Fs = 100e3;              % 采样频率 100 kHz
fc = 10e3;               % 载波频率 10 kHz
Rb = 1e3;                % 比特率 1 kbps
Rc = 10e3;               % 扩频码片率 10 kcps
N = 100;                 % 数据比特数
SNR_dB = 0;              % 信噪比(dB)
PN_Length = 15;          % PN序列长度(使用m序列)

%% 2. 生成数据信号
data_bits = randi([0 1], 1, N);          % 随机生成数据比特
data_bipolar = 2*data_bits - 1;          % 转换为双极性码

% 数据信号波形
Tb = 1/Rb;                               % 比特周期
samples_per_bit = round(Fs * Tb);        % 每比特采样数
data_signal = repelem(data_bipolar, samples_per_bit);

% 时间轴
t_total = N * Tb;
t = linspace(0, t_total, length(data_signal));

%% 3. 生成PN序列(扩频码)
% 生成m序列(反馈抽头[15 14])
pn_register = ones(1, 15);              % 初始化移位寄存器
pn_sequence = zeros(1, PN_Length*N);    % PN序列

for i = 1:PN_Length*N
    % 反馈计算
    feedback = mod(pn_register(15) + pn_register(14), 2);
    % 输出
    pn_sequence(i) = pn_register(15);
    % 移位
    pn_register(2:15) = pn_register(1:14);
    pn_register(1) = feedback;
end

pn_bipolar = 2*pn_sequence - 1;         % 转换为双极性码

% 扩频码波形
Tc = 1/Rc;                              % 码片周期
samples_per_chip = round(Fs * Tc);      % 每码片采样数
pn_signal = repelem(pn_bipolar(1:length(data_signal)/samples_per_bit*samples_per_chip), ...
                   samples_per_chip);

% 调整PN序列长度匹配数据信号
if length(pn_signal) > length(data_signal)
    pn_signal = pn_signal(1:length(data_signal));
elseif length(pn_signal) < length(data_signal)
    pn_signal = [pn_signal, pn_signal(1:length(data_signal)-length(pn_signal))];
end

%% 4. 扩频过程
spread_signal = data_signal .* pn_signal;

%% 5. BPSK调制
carrier = cos(2*pi*fc*t);
modulated_signal = spread_signal .* carrier;

%% 6. 加入噪声
signal_power = mean(modulated_signal.^2);
noise_power = signal_power / (10^(SNR_dB/10));
noise = sqrt(noise_power) * randn(size(modulated_signal));
received_signal = modulated_signal + noise;

%% 7. BPSK解调
demodulated_signal = received_signal .* carrier;

% 低通滤波器设计
lpFilt = designfilt('lowpassfir', 'PassbandFrequency', fc/2, ...
                   'StopbandFrequency', fc, 'PassbandRipple', 1, ...
                   'StopbandAttenuation', 60, 'SampleRate', Fs);
filtered_signal = filter(lpFilt, demodulated_signal);

%% 8. 解扩过程
despread_signal = filtered_signal .* pn_signal;

%% 9. 积分清除检测
% 匹配滤波器实现
integrated_signal = zeros(1, N);
for i = 1:N
    start_idx = (i-1)*samples_per_bit + 1;
    end_idx = i*samples_per_bit;
    integrated_signal(i) = sum(despread_signal(start_idx:end_idx));
end

% 判决
decoded_bits = integrated_signal > 0;

%% 10. 性能分析
% 计算误码率
bit_errors = sum(decoded_bits ~= data_bits);
BER = bit_errors / N;

% 处理增益计算
processing_gain_theory = 10*log10(Rc/Rb);
processing_gain_measured = 10*log10(var(spread_signal)/var(data_signal));

%% 11. 频谱分析
NFFT = 2^nextpow2(length(data_signal));
f = Fs * linspace(0, 1, NFFT/2+1);

% 原始数据信号频谱
data_spectrum = fft(data_signal, NFFT);
data_spectrum_mag = abs(data_spectrum(1:NFFT/2+1));

% 扩频后信号频谱
spread_spectrum = fft(spread_signal, NFFT);
spread_spectrum_mag = abs(spread_spectrum(1:NFFT/2+1));

% 调制后信号频谱
modulated_spectrum = fft(modulated_signal, NFFT);
modulated_spectrum_mag = abs(modulated_spectrum(1:NFFT/2+1));

%% 12. 可视化结果
figure('Position', [100, 100, 1200, 800]);

% 子图1: 时域信号
subplot(4,3,1);
plot(t(1:min(1000, length(t))), data_signal(1:min(1000, length(data_signal))));
title('原始数据信号');
xlabel('时间(s)'); ylabel('幅度');
grid on;

subplot(4,3,2);
plot(t(1:min(1000, length(t))), pn_signal(1:min(1000, length(pn_signal))));
title('PN序列信号');
xlabel('时间(s)'); ylabel('幅度');
grid on;

subplot(4,3,3);
plot(t(1:min(1000, length(t))), spread_signal(1:min(1000, length(spread_signal))));
title('扩频后信号');
xlabel('时间(s)'); ylabel('幅度');
grid on;

% 子图2: 调制信号
subplot(4,3,4);
plot(t(1:min(1000, length(t))), modulated_signal(1:min(1000, length(modulated_signal))));
title('BPSK调制信号');
xlabel('时间(s)'); ylabel('幅度');
grid on;

subplot(4,3,5);
plot(t(1:min(1000, length(t))), received_signal(1:min(1000, length(received_signal))));
title('接收信号(含噪声)');
xlabel('时间(s)'); ylabel('幅度');
grid on;

subplot(4,3,6);
plot(t(1:min(1000, length(t))), despread_signal(1:min(1000, length(despread_signal))));
title('解扩后信号');
xlabel('时间(s)'); ylabel('幅度');
grid on;

% 子图3: 频谱分析
subplot(4,3,7);
plot(f/1000, 20*log10(data_spectrum_mag/max(data_spectrum_mag)));
title('原始数据信号频谱');
xlabel('频率(kHz)'); ylabel('功率(dB)');
grid on;

subplot(4,3,8);
plot(f/1000, 20*log10(spread_spectrum_mag/max(spread_spectrum_mag)));
title('扩频后信号频谱');
xlabel('频率(kHz)'); ylabel('功率(dB)');
grid on;

subplot(4,3,9);
plot(f/1000, 20*log10(modulated_spectrum_mag/max(modulated_spectrum_mag)));
title('BPSK调制信号频谱');
xlabel('频率(kHz)'); ylabel('功率(dB)');
grid on;

% 子图4: 相关性和误码
subplot(4,3,10);
pn_corr = xcorr(pn_bipolar(1:100), pn_bipolar(1:100));
plot(-99:99, pn_corr);
title('PN序列自相关函数');
xlabel('延迟'); ylabel('相关值');
grid on;

subplot(4,3,11);
stem(1:N, data_bits, 'b', 'LineWidth', 1.5); hold on;
stem(1:N, decoded_bits, 'r', 'LineWidth', 1);
title(['数据比特对比, BER = ', num2str(BER)]);
xlabel('比特序号'); ylabel('比特值');
legend('发送比特', '接收比特');
grid on;

% 子图5: 眼图分析
subplot(4,3,12);
% 生成眼图
eye_diagram_signal = despread_signal(1:min(5*samples_per_bit, length(despread_signal)));
offset = 0;
for i = 1:min(5, floor(length(eye_diagram_signal)/samples_per_bit))
    start_idx = (i-1)*samples_per_bit + 1;
    end_idx = i*samples_per_bit;
    plot(1:samples_per_bit, eye_diagram_signal(start_idx:end_idx), 'b');
    hold on;
end
title('解扩后信号眼图');
xlabel('样点'); ylabel('幅度');
grid on;

%% 13. 性能指标输出
fprintf('========== DSSS系统性能指标 ==========\n');
fprintf('数据比特数: %d\n', N);
fprintf('误码数: %d\n', bit_errors);
fprintf('误码率: %.4f\n', BER);
fprintf('理论处理增益: %.2f dB\n', processing_gain_theory);
fprintf('实测处理增益: %.2f dB\n', processing_gain_measured);
fprintf('扩频因子: %.0f\n', Rc/Rb);
fprintf('信噪比: %.1f dB\n', SNR_dB);
fprintf('=====================================\n');

%% 14. 扩频系统抗干扰性能分析
% 添加窄带干扰测试
figure('Position', [100, 100, 800, 600]);

% 生成窄带干扰
jammer_freq = 12e3;  % 干扰频率
jammer_signal = 0.5 * cos(2*pi*jammer_freq*t);  % 窄带干扰

% 测试不同干扰强度下的误码率
jammer_powers = linspace(-20, 10, 20);
BER_with_jammer = zeros(size(jammer_powers));

for j = 1:length(jammer_powers)
    % 计算干扰信号功率
    jammer_power = 10^(jammer_powers(j)/10);
    jammer = sqrt(jammer_power) * jammer_signal;
    
    % 加入干扰的信号
    jammed_signal = modulated_signal + noise + jammer(1:length(modulated_signal));
    
    % 解调和解扩
    jammed_demod = jammed_signal .* carrier;
    jammed_filtered = filter(lpFilt, jammed_demod);
    jammed_despread = jammed_filtered .* pn_signal;
    
    % 检测
    jammed_bits = zeros(1, N);
    for i = 1:N
        start_idx = (i-1)*samples_per_bit + 1;
        end_idx = i*samples_per_bit;
        jammed_bits(i) = sum(jammed_despread(start_idx:end_idx)) > 0;
    end
    
    % 计算误码率
    BER_with_jammer(j) = sum(jammed_bits ~= data_bits) / N;
end

% 绘制抗干扰性能曲线
subplot(2,1,1);
plot(jammer_powers, BER_with_jammer, 'b-o', 'LineWidth', 2);
title('DSSS系统抗窄带干扰性能');
xlabel('干扰功率(dB)'); ylabel('误码率(BER)');
grid on;
set(gca, 'YScale', 'log');

% 对比未扩频系统的抗干扰性能(理论分析)
% 未扩频系统在窄带干扰下性能严重下降
theory_BER_without_spreading = 0.5 * erfc(sqrt(10.^(SNR_dB/10) ./ (1 + 10.^(jammer_powers/10))));

subplot(2,1,2);
plot(jammer_powers, BER_with_jammer, 'b-o', 'LineWidth', 2); hold on;
plot(jammer_powers, theory_BER_without_spreading, 'r--', 'LineWidth', 2);
title('扩频与未扩频系统抗干扰性能对比');
xlabel('干扰功率(dB)'); ylabel('误码率(BER)');
legend('DSSS扩频系统', '未扩频系统', 'Location', 'best');
grid on;
set(gca, 'YScale', 'log');

%% 15. 多用户CDMA仿真(扩展功能)
fprintf('\n========== 多用户CDMA仿真 ==========\n');

num_users = 3;  % 用户数量
user_data = cell(1, num_users);
user_pn = cell(1, num_users);
user_signals = zeros(num_users, length(t));

% 为每个用户生成不同的PN序列
for u = 1:num_users
    % 生成不同的m序列(使用不同的初始状态)
    pn_reg = ones(1, 15);
    pn_reg(1:5) = round(rand(1,5));  % 随机初始化前5位
    user_pn_sequence = zeros(1, PN_Length*N);
    
    for i = 1:PN_Length*N
        feedback = mod(pn_reg(15) + pn_reg(14), 2);
        user_pn_sequence(i) = pn_reg(15);
        pn_reg(2:15) = pn_reg(1:14);
        pn_reg(1) = feedback;
    end
    
    user_pn_bipolar = 2*user_pn_sequence - 1;
    user_pn{u} = repelem(user_pn_bipolar(1:length(data_signal)/samples_per_bit*samples_per_chip), ...
                        samples_per_chip);
    
    % 调整长度
    if length(user_pn{u}) > length(data_signal)
        user_pn{u} = user_pn{u}(1:length(data_signal));
    end
    
    % 生成用户数据
    user_data_bits = randi([0 1], 1, N);
    user_data_bipolar = 2*user_data_bits - 1;
    user_data_signal = repelem(user_data_bipolar, samples_per_bit);
    user_data{u} = user_data_bits;
    
    % 扩频和调制
    user_spread = user_data_signal .* user_pn{u};
    user_signals(u,:) = user_spread .* carrier;
end

% 合并多用户信号
combined_signal = sum(user_signals, 1);

% 添加噪声
combined_noisy = combined_signal + noise;

% 用户1的解调
user1_demod = combined_noisy .* carrier;
user1_filtered = filter(lpFilt, user1_demod);
user1_despread = user1_filtered .* user_pn{1};

% 检测用户1的数据
user1_decoded = zeros(1, N);
for i = 1:N
    start_idx = (i-1)*samples_per_bit + 1;
    end_idx = i*samples_per_bit;
    user1_decoded(i) = sum(user1_despread(start_idx:end_idx)) > 0;
end

% 计算多用户干扰下的误码率
user1_BER = sum(user1_decoded ~= user_data{1}) / N;
fprintf('用户1在多用户干扰下的误码率: %.4f\n', user1_BER);
fprintf('=====================================\n');

6. 总结

上述主要对扩频做了一个简要的总结,如果有不妥之处,希望大家指正交流。

相关推荐
微小冷2 小时前
Rust异步编程详解
开发语言·rust·async·await·异步编程·tokio
A9better2 小时前
C++——不一样的I/O工具与名称空间
开发语言·c++·学习
清水白石0082 小时前
《为什么说 deque 是 Python 滑动窗口的“隐藏神器”?深入解析双端队列的高效之道》
开发语言·python
杜子不疼.2 小时前
Ascend_C自定义算子开发
c语言·开发语言
WooaiJava2 小时前
流式TTS音频播放项目 - 面试问答(后端)
java·开发语言
新缸中之脑2 小时前
开发AI代理必备的8个Python 库
开发语言·人工智能·python
暴走十八步2 小时前
PHP+vscode开启调试debug
开发语言·vscode·php
郝学胜-神的一滴2 小时前
Python 列表 vs 数组:深入解析与最佳选择指南
开发语言·python·程序人生
杜子不疼.2 小时前
基于ATVC模板库的Ascend C Vector算子快速开发指南
c语言·开发语言·mfc