├── LICENSE ├── README.md └── src ├── MseqGen.m ├── Oct2Bin.m ├── arrayGroupSum.m ├── bitMultiple.m ├── compare.m ├── deScarmbling.m ├── deSpreadSpectrum.m ├── deTurb.m ├── demodulate.m ├── genBipolar.m ├── getPalces.m ├── main.m ├── myModulate.m ├── powerCnt.m ├── scarmbling.m ├── selfCopy.m ├── spreadSpectrum.m ├── testModulate.m ├── testScarmbling.m ├── testSpreadSpectrum.m ├── testTurb.m ├── tripleGen.m ├── value2Bipolar.m └── walsh.m /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 2-Clause License 2 | 3 | Copyright (c) 2022, highskyno1 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 20 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 2users-CDMA-simulation 2 | 基于MATLAB的直接序列扩频通信系统仿真 3 | 4 | 这是一篇CSDN博文的代码,文章链接:https://blog.csdn.net/weixin_41476562/article/details/103418040 5 | -------------------------------------------------------------------------------- /src/MseqGen.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/MseqGen.m -------------------------------------------------------------------------------- /src/Oct2Bin.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/Oct2Bin.m -------------------------------------------------------------------------------- /src/arrayGroupSum.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/arrayGroupSum.m -------------------------------------------------------------------------------- /src/bitMultiple.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/bitMultiple.m -------------------------------------------------------------------------------- /src/compare.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/compare.m -------------------------------------------------------------------------------- /src/deScarmbling.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/deScarmbling.m -------------------------------------------------------------------------------- /src/deSpreadSpectrum.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/deSpreadSpectrum.m -------------------------------------------------------------------------------- /src/deTurb.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/deTurb.m -------------------------------------------------------------------------------- /src/demodulate.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/demodulate.m -------------------------------------------------------------------------------- /src/genBipolar.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/genBipolar.m -------------------------------------------------------------------------------- /src/getPalces.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/getPalces.m -------------------------------------------------------------------------------- /src/main.m: -------------------------------------------------------------------------------- 1 | %{ 2 | 本函数是整个仿真的主函数,用于研究在移动通信时,信噪比对误码率的影响 3 | 首先生成随机双极性码,然后经过扩频,加扰,BPSK调制,加高斯白噪声,混合 4 | 然后模拟接收端的解调,去扰,解扩,判决。 5 | 通过比较接收端判决输出与原来的码元,计算出误码率,首先通信系统的仿真 6 | 以及误码率-信噪比的变化曲线的绘制. 7 | 2019/11/22(以上) 8 | 在当前版本中,添加了对信噪比&误码率曲线随BPSK调制载波振幅变化而变化 9 | 的相关研究功能。因为实际发现,之前的代码中曲线会在-20dB到0dB处出现平缓现象, 10 | 实际排查发现是载波的振幅导致的。振幅研究结果发现:振幅小于0.4时,系统无法正常 11 | 工作!其误码率曲线在后期随着信噪比的增加呈现反常膨胀! 12 | ^-^想要得到抛物线,只有在载波振幅为1的时候。^-^,不然随着振幅的增加,曲线曲线趋于平缓的信噪比范围会越大; 13 | 同时发现大于0.6的曲线会近似相交于某一点,交点前同等信噪比下振幅高的误码率低,但在交点后 14 | ***同等的信噪比下振幅小的误码率反而低!!!*** 15 | 在本版本中,walsh矩阵的所有码元都被用于扩频,没有使用前一版的矩阵截取方法, 16 | 规避了鬼魅版的非严格正交问题,但前面的截取版本恰恰说明非严格正交对本系统影响曲线 17 | 的影响并不是很大,但却可以使得系统能在更低的误码率下工作。 18 | 至此,代码已经经历10次版本迭代。 19 | 2019/12/1(以上) 20 | 第二次答辩,仍出现部分平滑问题,并且老师说系统性能太好了,与实际系统不符,并且 21 | 曲线不应该受振幅的影响,基于此再对代码做修改,计算了输入信号的平均功率,作为第3 22 | 个参数传给awgn,否则awgn会把输入信号的功率视为0dBW!现在曲线基本重合。但0.2与0.4 23 | 的问题仍未解决! 24 | 至此,程序第11次版本迭代 25 | 2019/12/2(以上) 26 | 第十二次迭代。 27 | 发现了为什么振幅是0.2和0.4时,系统无法正常工作的原因,是因为 28 | bitMultiple函数把运算结果格式转换成了int8,导致精度大量失真!当时转换格式是为 29 | 内存空间与运行速度做打算,结果今天发现做了负优化!修改后,发现载波振幅对于系统 30 | 的误码率曲线几乎无影响。 31 | 另外,解调函数也做了修改,会根据输入自动计算判决阈值,解决了之前人为设定阈值 32 | 的局限,阈值采用正态分布解算法,详见demodulate函数内注释。 33 | 2020/7/1(以上) 34 | i7-4790:实测速率9.8秒/轮回 @1280*2&1280码元20&10扩频增益 35 | 第十三次迭代。 36 | 解决加扰函数只使用了M序列第一行的问题。 37 | 2022/1/21(以上) 38 | i7-12700K:实测速率 2.4秒/轮回 @1280*2&1280码元20&10扩频增益 39 | Module函数名改名为myModule,防止与Matlab内建函数重名的bug 40 | 修改testModulate函数,增加row码元长度,防止码元与扩频码被交换的bug 41 | 2022/4/28(以上) 42 | i7-12700K:实测速率 0.91秒/轮回 @1280*2&1280码元20&10扩频增益 12线程 43 | 修复解调模块阈值解算的Bug,改为利用"norminv"解算阈值, 44 | 可见运行速度显著提高,同时改为var计算方差,感谢网友的提醒。 45 | 2022/12/17(以上) 46 | %} 47 | clear variable; 48 | close all; 49 | 50 | mulTimes = 5; %轮回次数 51 | 52 | walshOrder = 64; %walsh码的阶数,必须大于扩频增益 53 | 54 | N1 = 1280*2; %用户1码元数量 55 | N2 = 1280; %用户2码元数量 56 | 57 | user1SPgain = 10; %用户1的扩频增益 58 | user2SPgain = 20; %用户2的扩频增益 59 | 60 | %记录两个用户的walsh相位,注意相位必须在1到64之间取值 61 | %两个用户的取值不能一样 62 | user1Phase = 2; %用户1的相位 63 | user2Phase = 16; %用户2的相位 64 | 65 | %加扰使用的m序列的参数 66 | mOrder = 5; %级数5级 67 | feedBack = 67;%反馈系数67 68 | 69 | %调整时,半个周期的采样点数 70 | samplePiont = 4; 71 | 72 | %生成需要使用的walsh码 73 | walshCode = walsh(walshOrder); 74 | 75 | %针对低性能电脑做优化,采取以时间换取空间的思路 76 | maxSnr = 40; %尝试的最大信噪比 77 | minSnr = -20; %尝试的最小信噪比 78 | div = 1; %信噪比的尝试步进 79 | maxTime = (maxSnr-minSnr)/div; %尝试次数 80 | timesUser1Acc = zeros(mulTimes,maxTime); 81 | timesUser2Acc = zeros(mulTimes,maxTime); 82 | 83 | %生成双极性码片 84 | user1 = genBipolar(N1); 85 | user2 = genBipolar(N2); 86 | 87 | %扩频 88 | spread1 = spreadSpectrum(user1,walshCode,user1SPgain,user1Phase); 89 | spread2 = spreadSpectrum(user2,walshCode,user2SPgain,user2Phase); 90 | 91 | %加扰 92 | Mseq1 = MseqGen(mOrder,feedBack); %用户1加扰用的m序列 93 | Mseq1 = Mseq1(:); 94 | Mseq2 = MseqGen(mOrder,feedBack); %用户2加扰用的m序列 95 | Mseq2 = Mseq2(:); 96 | user1scarm = scarmbling(spread1,Mseq1); 97 | user2scarm = scarmbling(spread2,Mseq2); 98 | 99 | maxAmp = 1.2; %尝试的最大载波振幅 100 | minAmp = 0.2; %尝试的最小载波振幅 101 | divAmp = 0.2; %载波振幅的尝试步进 102 | maxTimesAmp = floor((maxAmp-minAmp)/divAmp); %振幅尝试次数 103 | 104 | ampRecords1 = zeros(maxTimesAmp,maxTime); 105 | ampRecords2 = zeros(maxTimesAmp,maxTime); 106 | 107 | for amp = 1:maxTimesAmp %测试不同的载波振幅下的曲线 108 | 109 | fprintf('目前正在第%d个振幅\n',amp); 110 | 111 | %调制BPSK 112 | %生成载波,两用户使用同一个载波 113 | carrier = (minAmp + divAmp*(amp-1))*sin(0:(pi/samplePiont):(2*pi-2*pi/samplePiont)); 114 | user1modulate = myModulate(user1scarm,carrier); 115 | user2modulate = myModulate(user2scarm,carrier); 116 | 117 | %计算载波功率 118 | power = powerCnt(carrier); 119 | for times = 1:mulTimes 120 | 121 | fprintf('目前正在第%d个轮回\n',times); 122 | 123 | user1Acc = zeros(1,maxTime); 124 | user2Acc = zeros(1,maxTime); 125 | 126 | parfor index = 1:maxTime 127 | snr = minSnr + (index-1)*div; %加在发送信号上的高斯噪声的信噪比(dBW) 128 | 129 | %通过高斯信道,添加高斯噪声 130 | user1send = awgn(user1modulate,snr,power); 131 | user2send = awgn(user2modulate,snr,power); 132 | 133 | %接收方 134 | receive = user1send + user2send; %收到混合起来的信号 135 | 136 | %解调 137 | demodulateRes = demodulate(receive,carrier); 138 | 139 | %去扰 140 | user1Descarm = deScarmbling(demodulateRes,Mseq1); 141 | user2Descarm = deScarmbling(demodulateRes,Mseq2); 142 | 143 | %解扩 144 | user1deDS = deSpreadSpectrum(user1Descarm,walshCode,user1SPgain,user1Phase); 145 | user2deDS = deSpreadSpectrum(user2Descarm,walshCode,user2SPgain,user2Phase); 146 | 147 | %计算误码率 148 | [~,user1Accuracy] = compare(user1,user1deDS); 149 | [~,user2Accuracy] = compare(user2,user2deDS); 150 | user1Acc(index) = 1-user1Accuracy; 151 | user2Acc(index) = 1-user2Accuracy; 152 | end 153 | timesUser1Acc(times,:) = user1Acc; 154 | timesUser2Acc(times,:) = user2Acc; 155 | end 156 | %总结统计多次实验的结果 157 | for i = 1:maxTime 158 | user1Acc(i) = mean(timesUser1Acc(:,i)); 159 | user2Acc(i) = mean(timesUser2Acc(:,i)); 160 | end 161 | ampRecords1(amp,:) = user1Acc; 162 | ampRecords2(amp,:) = user2Acc; 163 | end 164 | 165 | %误码率随信噪比的变化曲线 166 | figure(1); 167 | X1 = (minSnr:div:maxSnr-div); 168 | semilogy(X1,ampRecords1(5,:),'b'); 169 | xlabel('信噪比(dB)'); 170 | ylabel('误码率'); 171 | title('误码率随信噪比的变化曲线'); 172 | hold on; 173 | semilogy(X1,ampRecords2(5,:),'g'); 174 | legend('用户1(扩频增益10)','用户2(扩频增益20)'); 175 | 176 | %用户1振幅不同的误码率随信噪比的变化曲线 177 | figure(2); 178 | for i = 1:maxTimesAmp 179 | semilogy(X1,ampRecords1(i,:)); 180 | hold on; 181 | end 182 | xlabel('信噪比(dB)'); 183 | ylabel('误码率'); 184 | title('用户1振幅不同的误码率随信噪比的变化曲线'); 185 | legend('0.2','0.4','0.6','0.8','1.0'); 186 | 187 | %用户2振幅不同的误码率随信噪比的变化曲线 188 | figure(3); 189 | for i = 1:maxTimesAmp 190 | semilogy(X1,ampRecords2(i,:)); 191 | hold on; 192 | end 193 | xlabel('信噪比(dB)'); 194 | ylabel('误码率'); 195 | title('用户2振幅不同的误码率随信噪比的变化曲线'); 196 | legend('0.2','0.4','0.6','0.8','1.0'); 197 | -------------------------------------------------------------------------------- /src/myModulate.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/myModulate.m -------------------------------------------------------------------------------- /src/powerCnt.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/powerCnt.m -------------------------------------------------------------------------------- /src/scarmbling.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/scarmbling.m -------------------------------------------------------------------------------- /src/selfCopy.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/selfCopy.m -------------------------------------------------------------------------------- /src/spreadSpectrum.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/spreadSpectrum.m -------------------------------------------------------------------------------- /src/testModulate.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/testModulate.m -------------------------------------------------------------------------------- /src/testScarmbling.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/testScarmbling.m -------------------------------------------------------------------------------- /src/testSpreadSpectrum.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/testSpreadSpectrum.m -------------------------------------------------------------------------------- /src/testTurb.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/testTurb.m -------------------------------------------------------------------------------- /src/tripleGen.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/tripleGen.m -------------------------------------------------------------------------------- /src/value2Bipolar.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/value2Bipolar.m -------------------------------------------------------------------------------- /src/walsh.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highskyno1/2users-CDMA-simulation/a2f7cb493b1b147a6ba2cb545880e67f0d51e7ed/src/walsh.m --------------------------------------------------------------------------------