【通信系统仿真设计】基于MATLAB的直接序列扩频通信系统仿真
基于MATLAB的直接序列扩频通信系统仿真
前⾔
直接扩频序列调制是⽤速率很⾼的伪噪声码序列与信息码序列模⼆相加(波形相乘)后得到复合码序列,⽤复合码序列去控制载波相位,从⽽获得直接扩频序列信号的。直接扩频通信具有低截获概率、抗⼲扰能⼒强以及易于实现码分多址等优点,在抗⼲扰通信及民⽤移动通信中都得到了⼴泛的应⽤。
⽂章迭代更新
⽂章进⾏了⼤改
发现了为什么振幅是0.2和0.4时,系统⽆法正常⼯作的原因。因为bitMultiple函数把运算结果格式转换成了int8,导致精度⼤量失真!当时转换格式是为内存空间与运⾏速度做打算,结果今天发现做了负优化!修改后,发现载波振幅对于系统的误码率曲线⼏乎⽆影响。
另外,解调函数也做了修改,会根据输⼊⾃动计算判决阈值,解决了之前⼈为设定阈值
的局限,阈值采⽤正态分布解算法,详见demodulate函数内注释。
新版修改了以下函数:
1. bitMultiple
2. demodulate
3. 新增arrayGroupSum函数
2022/1/25:
修改了以下函数,解决M序列⽣成bug
1. MseqGen
2. Oct2Bin
仿真流程图
关键技术细节
1. 仿真中,⽤户码元使⽤双极性(1和-1)码。
2. 代码的最后通过还原信号与码元做对⽐,计算误码率,来评价通信质量的好坏。
3. 为了研究信噪⽐对误码率的影响,代码中⽤了多线程,针对不同的信噪⽐进⾏解调去扰解扩,计算不同信噪⽐下的误码率。
4. 为了研究载波振幅对信噪⽐——误码率曲线的影响,增加了振幅的迭代。
扩频解扰解扩部分
1. 采⽤64阶的walsh码矩阵,由walsh函数产⽣。
2. 两个⽤户使⽤同⼀扩频矩阵的不同相位(实际上是不同⼀⾏)进⾏扩频。
3. 扩频时,⾸先对⽤户码元按照扩频增益,进⾏周期延拓,然后点乘扩频码,实现扩频。
4. 解扩时,⾸先对输⼊的去扰后的码按扩频时⼀样的相位对应点乘扩频码,然后进⾏判决。
加扰去扰部分
1. 加扰采⽤的是5阶的M序列,反馈系数为67(⼋进制)。
2. 加扰同样采⽤点乘,输⼊码元1:1地点乘加扰码。
3. 因为加扰码具有很⾼的⾃相关性,所以去扰时只需执⾏加扰时⼀样的操作即可。
加扰原理图
调制解调部分
1. 调制采⽤BPSK(⼆进制移相键控)调制。
2. 调制所使⽤的载波为正弦波,通过对其等间隔采样形成离散样值。
3. 调制时,⼀个加扰后的码元对应相乘⼀串正弦波的周期采样值,把相乘结果汇总后就是调制后的结果
4. 解调时,把⼀个码元所对应的⼀串正弦波的周期采样值与载波采样值进⾏点乘,根据点乘结果中,正数、负数还是零多,判决这是什
么码元。
调制原理图
解调原理图
⾼斯信道部分
1. 使⽤matlab⾃带的函数awgn(input,snr(dB),inputPower)。
2. 只要传⼊需要加⾼斯噪声的信号,信噪⽐还有输⼊信号的功率,即可返回添加了⾼斯⽩噪声的信号。实验结果
扩频增益为10时,walsh矩阵为64阶时,不同振幅下信噪⽐误码率曲线
扩频增益为20时,walsh矩阵为64阶时,不同振幅下信噪⽐误码率曲线
以上两次实验结果显⽰,载波振幅对于系统性能⽆明显影响,这是⽂章改版前的⼀个很⼤的错误!在此笔者向各位读者道歉。
误码率随信噪⽐的变化曲线
观察以上曲线可以发现,随着信噪⽐的上升,误码率以近似于抛物线的形式在不断下降,并最终等于0,
这⾜以证明本次直接序列扩频系统仿真符合预期结果。
源代码
可以修改的参数
1. 轮回次数。通过修改轮回次数,获得更好的曲线,或者更快的代码运⾏速度,代码运⾏参考速度:i7-4790:实测速率9.8秒/轮回
@1280*2&1280码元20&10扩频增益。
2. ⽤户1的码元数量与扩频增益、⽤户2的码元数量与扩频增益。修改时注意两⽤户的码元必须是walsh码阶数的增数倍,同时要保证:
⽤户1的码元数量 * ⽤户1的扩频增益=⽤户2的码元数量 * ⽤户2的扩频增益。
3. walsh码的阶数。但walsh码阶数必须⼤于扩频增益。
4. ⽤户1扩频相位、⽤户2扩频相位。注意相位必须在1到64之间取值,两个⽤户的取值不能⼀样。
5. M序列阶数与返回系数。反馈系数取值有相关要求,详见百度,作为参数传⼊时要以⼋进制表⽰。
6. 半个载波周期的采样点数。
7. 最⼩最⼤信噪⽐,以及其尝试步进。
8. 最⼩最⼤载波振幅,以及其尝试步进。
!下载链接!
核⼼代码
主函数
main.m
%{
本函数是整个仿真的主函数,⽤于研究在移动通信时,信噪⽐对误码率的影响
⾸先⽣成随机双极性码,然后经过扩频,加扰,BPSK调制,加⾼斯⽩噪声,混合
然后模拟接收端的解调,去扰,解扩,判决。
通过⽐较接收端判决输出与原来的码元,计算出误码率,⾸先通信系统的仿真
以及误码率-信噪⽐的变化曲线的绘制.
2019/11/22(以上)
在当前版本中,添加了对信噪⽐&误码率曲线随BPSK调制载波振幅变化⽽变化
的相关研究功能。因为实际发现,之前的代码中曲线会在-20d B到0d B处出现平缓现象,
实际排查发现是载波的振幅导致的。振幅研究结果发现:振幅⼩于0.4时,系统⽆法正常
⼯作!其误码率曲线在后期随着信噪⽐的增加呈现反常膨胀!
^-^想要得到抛物线,只有在载波振幅为1的时候。^-^,不然随着振幅的增加,曲线曲线趋于平缓的信噪⽐范围会越⼤;
modulate同时发现⼤于0.6的曲线会近似相交于某⼀点,交点前同等信噪⽐下振幅⾼的误码率低,但在交点后
***同等的信噪⽐下振幅⼩的误码率反⽽低***
在本版本中,walsh矩阵的所有码元都被⽤于扩频,没有使⽤前⼀版的矩阵截取⽅法,
规避了⿁魅版的⾮严格正交问题,但前⾯的截取版本恰恰说明⾮严格正交对本系统影响曲线
的影响并不是很⼤,但却可以使得系统能在更低的误码率下⼯作。
⾄此,代码已经经历10次版本迭代。
2019/12/1(以上)
第⼆次答辩,仍出现部分平滑问题,并且⽼师说系统性能太好了,与实际系统不符,并且
曲线不应该受振幅的影响,基于此再对代码做修改,计算了输⼊信号的平均功率,作为第3
个参数传给awgn,否则awgn会把输⼊信号的功率视为0d BW!现在曲线基本重合。但0.2与0.4
的问题仍未解决!
⾄此,程序第11次版本迭代
2019/12/2(以上)
第⼗⼆次迭代。
发现了为什么振幅是0.2和0.4时,系统⽆法正常⼯作的原因,是因为
bitMultiple函数把运算结果格式转换成了int8,导致精度⼤量失真!当时转换格式是为
内存空间与运⾏速度做打算,结果今天发现做了负优化!修改后,发现载波振幅对于系统
的误码率曲线⼏乎⽆影响。
另外,解调函数也做了修改,会根据输⼊⾃动计算判决阈值,解决了之前⼈为设定阈值
的局限,阈值采⽤正态分布解算法,详见demodulate函数内注释。
2020/7/1(以上)
i7-4790:实测速率9.8秒/轮回@1280*2&1280码元20&10扩频增益
第⼗三次迭代。
解决加扰函数只使⽤了M序列第⼀⾏的问题。
2022/1/21(以上)
i7-12700K:实测速率2.4秒/轮回@1280*2&1280码元20&10扩频增益
%}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论