资讯动态

m序列与Walsh码:CDMA扩频序列的正交性原理与工程实践

发布时间:2026/10/24 18:34:21 来源:尧图企业网站定制
简介这份文档面向通信、电子与信号处理方向的学习者系统梳理扩频通信中两类核心序列——m序列与Walsh码的生成原理与应用要点帮助读者理解码分多址系统中扩频码的设计逻辑。压缩包内为1个doc文件大小约355KB内容涵盖m序列的线性移位寄存器结构与反馈系数选择、Walsh码基于Hadamard矩阵的排列转换方法并附有walshf1等生成函数的实现代码便于对照理解矩阵变换过程。文中还延伸讨论了Gold序列的模2加构造方式以及多径与异步到达导致正交性下降、多址干扰难以完全消除的实际问题。已有636人学习该资料适合作为扩频序列入门与课程复习的参考也可为CDMA相关实验提供算法思路与代码借鉴。1. 从一场“多人同时说话”的饭局说起m序列和Walsh码到底是什么想象一桌人同时聊天如果大家各说各的、音量还一样大结果就是谁也听不清——这就是无线通信里最头疼的“多址干扰”。扩频序列要解决的就是让每个人用一套独特的“说话节奏”即使同时开口接收方也能把每句话单独拎出来。m序列和Walsh码就是两套最经典的“节奏方案”前者像一段极长、极难预测的伪随机口哨后者像一组彼此严格错开的正交节拍。搞懂这两者你就摸到了CDMA系统里“码分多址”这四个字的门槛也才能明白为什么工程上既要追求正交、又不得不接受“正交并不彻底”这个现实。2. 先拆开看两种序列各自的脾气从哪来2.1 m序列用移位寄存器“摇”出来的最长伪随机串m序列的全称是最长线性移位寄存器序列名字已经把它的出身说清楚了——它由 n 级线性移位寄存器产生周期是 2^n - 1。通俗地说你可以把它想成一排 n 个灯泡每个时钟节拍整体往左挪一格最右边新补进来的那一位由前面若干位的“异或”结果决定。哪些位参与异或就是所谓的反馈系数反馈系数选得对序列才会跑到最长周期选错了周期就短一截。打个比方这就像一台老式摇奖机摇臂的连接方式反馈系数决定了小球能跑出多少种不重复的组合起始时小球摆的位置初始状态只决定你从哪一颗开始看。所以同一组反馈系数下换一个起始状态得到的只是同一条长序列的某个平移版本而不是另一条新序列。m序列最值钱的地方在于它的统计特性自相关函数在零延迟处是一个尖峰偏离零点后迅速掉到很低的水平不同 m 序列之间的互相关也普遍偏低。这让它非常像一段真正的随机噪声却又完全可复现——接收端只要知道反馈系数和起始状态就能一模一样地再摇一遍。正因如此m序列常被用作伪随机噪声序列在扩频系统里承担“把窄带信号摊到宽频带上”的角色。用一段极简的 Python 示意能更直观看到“移位 反馈”这个动作# 以 4 级寄存器、反馈抽头为第 4 位和第 3 位为例仅示意结构 def m_sequence(seed, taps, length): reg list(seed) # 初始状态决定序列起点 out [] for _ in range(length): out.append(reg[-1]) # 当前最右位输出 fb 0 for t in taps: # 反馈系数决定哪些位参与异或 fb ^ reg[t] reg [fb] reg[:-1] # 整体右移新位补到最左 return out这段代码里taps就是反馈系数的位置集合seed是起始状态length是你要取多长。真正决定“是不是 m 序列”的是taps的选取——选对了输出长度达到 2^n - 1 才开始重复选错了周期会明显变短。实际工程里不会手算抽头而是查本原多项式表这一点初学者最容易忽略。2.2 Walsh码从Hadamard矩阵里“排”出来的正交节拍Walsh码的出身完全不同。它来自 Hadamard 矩阵——一个只由 1 和 -1 构成的方阵任意两行之间做内积结果都是零也就是严格正交。但 Hadamard 矩阵的行序并不是拿来就能用的需要按“符号交变次数”重新排列排完之后才得到 Walsh 矩阵。这个重排动作就是把数学上的正交矩阵翻译成工程上“按频率高低排队”的序列。为什么非要重排因为 Walsh 序列在 CDMA 前向链路里是按编号分配给不同物理信道的编号 W0 到 W63 对应 64 阶 Walsh 序列码片速率 1.2288 Mc/s。如果行序混乱相邻编号的序列交变次数忽高忽低会给系统设计带来麻烦按交变次数排好之后序列的“翻转频率”随编号单调变化分配和调度都更规整。正交带来的好处非常直接理论上只要各信道用的 Walsh 序列彼此正交多址干扰可以被压到零。这就是码分多址的底气——大家在同一频段、同一时刻发靠“正交的码”把彼此分开而不是靠时间片或频率段。项目正文里给出的生成函数核心就是三段排列先用hadamard生成原始矩阵再按 Paley 序重排得到Hp接着按 Walsh 序重排得到Wg最后再做一个逆序得到Hm。函数返回的X Wg就是 N 阶 Walsh 序列矩阵。这里有个容易看漏的细节函数开头Nceil(log2(N))意思是无论你传进来什么阶数它都会向上取到 2 的整数次幂——因为 Hadamard 矩阵的阶数必须是 2 的幂传 60 进去实际会按 64 处理。N ceil(log2(N)); % 阶数向上取到 2 的幂这是硬约束 H hadamard(2^N); % 先生成原始 Hadamard 矩阵 % 后续按 Paley 序、Walsh 序、逆序三次重排 % Hp 为 Paley 序Wg 为 Walsh 序即最终输出Hm 为逆 Walsh 序参数上要盯住两点一是输入阶数会被悄悄“向上取整”调试时如果发现矩阵维度和你预期不符先回头检查这里二是三个中间矩阵Hp、Wg、Hm各自对应一种排序工程上真正拿去扩频的是Wg另外两个更多是变换核用来在几种排序之间换算。3. 为什么正交不等于万事大吉理想与现实的落差3.1 正交性在纸面上能消掉多址干扰把 Walsh 码的正交性说透只需要一个类比两个人分别用两把齿形完全互补的钥匙去开同一把锁只要齿形严格互补两把钥匙的“作用”互不干扰。数学上就是任意两条 Walsh 序列逐位相乘再求和等于零。于是当多个信道同时发送时接收端用对应的 Walsh 序列做一次相关运算其他信道的贡献理论上被乘成了零只剩自己要的那一路。这也是为什么 64 阶 Walsh 序列能支撑 64 个前向物理信道每个信道分一条序列编号 W0 到 W63码片速率 1.2288 Mc/s彼此正交容量看起来是“白送”的。m序列在这里扮演的是另一层角色——它负责把信号摊开到宽频带上Walsh 码负责在摊开之后把不同用户区分开两者一个管“扩”一个管“分”。3.2 多径和异步到达让正交性打了折扣现实很快泼来冷水。多径信号经过不同路径到达延迟和衰减都不一样异步到达的副本与同步到达的原始信号已经不再严格对齐正交的前提——逐位对齐——被破坏了。来自其他小区的信号同样既不同步也不正交干扰照样漏进来。所以工程上 Walsh 码能“消除或抑制”多址干扰但抑制不到零。项目正文里那句评注说得很实在如果 Walsh 真的完全正交多用户检测这门学问就没必要研究了。这句话点破了整个领域的现实——正交是设计目标不是物理保证。理解这一点你才不会在仿真里看到误码率降不下去时一头雾水。提示评估 Walsh 码方案时别只看理想正交下的容量数字要把多径时延扩展和其他小区干扰一起算进去否则结论会偏乐观。3.3 生成函数里的三次重排各自解决什么问题回到那段生成代码三次重排不是炫技。Paley 序解决的是“从 Hadamard 原始行序到一种有规律序”的过渡Walsh 序按交变次数排队让序列编号和翻转频率挂钩方便信道分配逆 Walsh 序则是把排序再翻回去用于变换核的闭环。三个矩阵Hp、Wg、Hm加上对应的变换矩阵Ep、Eg、Em构成了一套可逆的排序工具链。对使用者来说最需要记住的是不同排序下“第几条序列”指的不是同一条物理波形。如果你从别处拿到一组按 Paley 序编号的序列直接塞进按 Walsh 序设计的系统里正交性还在但编号对不上信道映射就全乱了。这是移植代码时最常见的翻车点之一。4. 别把这几组概念搅在一起常见易混点拆解4.1 m序列与Gold序列一个是“单摇”一个是“双摇相加”易混点在于两者都常被叫作伪随机序列名字里还都带“序列”。为什么混因为 Gold 序列确实是用一对周期和速率相同的 m 序列优选对模 2 加得到的血缘上就是 m 序列的扩展。怎么区分m 序列由单个移位寄存器产生周期 2^n - 1Gold 序列由一对 m 序列优选对逐位模 2 加得到好处是同一对优选对能派生出整族互相关可控的序列适合多用户场景。记法上可以想成“m 序列是单摇奖机Gold 是两台摇奖机的结果再叠加”。4.2 Walsh码与m序列一个管正交分区一个管伪随机扩频易混点在于两者都出现在扩频系统里初学者容易以为随便挑一个就能扩频。为什么混因为它们在系统里经常同时出现角色却被混为一谈。怎么区分Walsh 码的核心卖点是严格正交用来在同步条件下区分不同信道m 序列的核心卖点是长周期、低自相关旁瓣、难预测用来做伪随机扩频和扰码。一个偏“分”一个偏“扩”职责不同不能互换。4.3 正交与不相关数学上不是一回事易混点在于“正交”和“不相关”常被当成同义词。为什么混因为在零均值且等概率取 ±1 的序列里两者数值上经常表现一致。怎么区分正交是内积为零这个确定性的代数关系不相关是统计意义上的协方差为零。Walsh 序列是确定性正交m 序列的互相关是统计意义上的低值两者不是同一层次的保证。把 m 序列的低互相关直接说成“正交”在严格讨论里是站不住的。4.4 阶数与序列条数64阶不等于只有64条可用易混点在于“64 阶 Walsh 序列”被理解成“总共 64 条序列”。为什么混因为 W0 到 W63 的编号确实只到 63。怎么区分64 阶 Walsh 矩阵是 64×64行数就是 64所以确实对应 64 条序列这一点没错但要注意阶数必须是 2 的幂传 60 会被ceil(log2())抬到 64此时你拿到的仍是 64 条而不是 60 条。调试时矩阵维度对不上多半是这里被悄悄改了。4.5 理论正交与实际正交仿真和现网差在哪易混点在于仿真里误码率曲线漂亮就以为现网也能照搬。为什么混因为仿真常默认各用户符号级同步、单径信道。怎么区分现网存在多径时延扩展、小区间异步、定时偏差正交性被逐步侵蚀。判断一套参数能不能用要看它在“非同步 多径”条件下的表现而不是理想正交下的容量上限。5. 什么时候该用哪一套边界判断与一个具体取舍把边界说清楚比背定义有用。Walsh 码适合“同步条件较好、需要严格区分信道”的场合典型就是前向链路里按编号分配物理信道一旦同步被破坏、多径严重它的正交红利就快速缩水。m序列适合“需要长周期伪随机、低自相关旁瓣”的场合比如扩频和扰码但它本身不提供严格正交多用户区分不能单靠它。Gold 序列则落在中间地带——用一族互相关可控的序列换取多用户场景下的灵活性。序列类型核心特性典型角色主要局限m序列周期 2^n - 1自相关旁瓣低伪随机扩频、扰码不提供严格正交Walsh码严格正交阶数为 2 的幂前向信道区分依赖同步多径下正交退化Gold序列由 m 序列优选对模 2 加得到多用户互相关可控互相关非零需优选对举个具体取舍某实验室做一套多用户仿真 Demo前向链路要分 64 个逻辑信道同时又要模拟多径。合理的做法是 Walsh 码负责信道划分、m序列负责扩频然后在信道模型里显式加入时延扩展观察正交退化后的误码率。如果只跑理想单径曲线会好看到失真后面一上多径就全盘翻车。反过来什么时候别用当系统里各用户根本不同步、且多径时延接近甚至超过一个码片周期时硬堆 Walsh 码的正交假设没有意义此时更该考虑互相关可控的序列族或者直接上多用户检测。另一个别用的场景是把 m 序列当正交码去做信道划分——它的低互相关是统计意义上的不是代数正交多用户一多干扰会明显抬头。我自己踩过的坑是早期做仿真时图省事默认所有用户符号级对齐Walsh 正交性完美结果容量算出来漂亮得离谱后来把多径和定时偏差加进去同一套参数直接崩掉。从那以后我每次评估扩频方案都强制先把“非同步 多径”这两个条件打开再跑一遍确认退化幅度在可接受范围内才继续。希望这套思路能帮到你少走一段我走过的弯路。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑