继续看中频程序。

升级了一版。

如何升级?请看程序!

此时注释的重要性就体现出来了。

%%%%%%%%%%%           DS_CDMA系统中频信号仿真文件                %%%%%%%%%%%

%%%%%%%%%%%%%          File: DS_CDMA_IF_sim2.m                   %%%%%%%%%%

%%%%%%           date: 2018-12-11             author: 仿真工匠        %%%%%

%%%                         程序说明

%%% 本程序进行DS_CDMA系统基带信号理论仿真,进行多用户下的误码率性能测试。

%%% 调制方式采用BPSK,扩频码采用M序列。去除部分自编函数!

%%%                       仿真环境

% 软件版本:R2015b

%------------------            程序主体             -----------------------%

symbol_rate = .0;                         % 符号率

bit_rate   = symbol_rate * 2;                   % bit rate

IPOINT =  4;                                    % 单个符号内的采样点数

fre_sample = IPOINT*symbol_rate;                % 采样频率

fre_carrier = ;                           % 载波频率

num_symbol   = 100;                             % 符号数

ebn0 = 20;                                      % Eb/No

% 设置不同的信噪比得到不同的误码率

%********************      滤波器设置              ************************

irfn   = 12;                                     % 滤波器阶数

alfs   =  0.5;                                   % 滚降因子

[xh]  = func_hrollfcoef(irfn,IPOINT,symbol_rate,alfs,1);

% 发射机平方根滚降滤波器

[xh2] = func_hrollfcoef(irfn,IPOINT,symbol_rate,alfs,0);

% 接收机平方根滚降滤波器

%*******************  Spreading code initialization **********************

num_users  = 3;                  % 系统用户数  设置值为1-16

stage = 5;                       % number of stages

ptap1 = [1 5];                   % position of taps for 1st

ptap2 = [2 5];                   % position of taps for 2num_symbol

regi1 = [1 1 1 1 1];                 % initial value of register for 1st

regi2 = [1 1 1 1 1];                 % initial value of register for 2num_symbol

%******************** Generation of the spreading code ********************

M_code = func_mseq(stage,ptap1,regi1,num_users);   % 生成M序列

code = M_code * 2 - 1; % 双极性变换

clen = length(code);

%**************************** START CALCULATION ***************************

nloop = 100;                             % simulation number of times

noe   = 0;

nod   = 0;

for ii=1:nloop

%*************************     发射机      ********************************

%%%%%%%%%%%%%%%%  基带成型

source_data = randi([0 1],num_users,num_symbol*2) ;

[ich, qch]  = func_qpskmod(source_data,num_users,num_symbol,2);

% QPSK modulation

[ich1,qch1] = func_spread(ich,qch,code);                 % spreading

[ich2,qch2] = func_compoversamp2(ich1,qch1,IPOINT);      % over sampling

[ich3,qch3] = func_compconv2(ich2,qch2,xh);              % filter

% 单个用户信号的频谱展示 测试误码率时需注释

%     figure(1)

%     plot(abs(fft(ich3(1,:))))

%     title('单个用户信号的频谱展示')

%     figure(1)

%     plot(10*log10(abs(fft(ich3(1,:)))))

%     title('单个用户信号的功率谱展示')

if num_users == 1                  % transmission

ich4 = ich3;

qch4 = qch3;

ich4 = sum(ich3);

qch4 = sum(qch3);

%%%%%%%%%%%%%%%%  载波调制

time =[1:length(ich4)];

rcos_msg_source_carrier = ich4.*cos(2*pi*fre_carrier.*time/fre_sample);

%*******************             信道           ***************************

spow = sum(rot90(ich3.^2)) / num_symbol;

attenuation = sqrt(0.5 * spow * symbol_rate / bit_rate * 10^(-ebn0/10));

[ich5,qch5] = func_comb2(rcos_msg_source_carrier,qch4,attenuation);

% Add White Gaussian Noise (AWGN)

%********************          接收机         *****************************

%%%%%%%%%%%%%%%%  载波去除

for ii= 1:num_users

rcos_msg_ich5(ii,:) = ich5(ii,:) .*cos(2*pi*fre_carrier.*time/fre_sample);

%%%%%%%%%%%%%%%%  信号解扩

ich6 = conv2(rcos_msg_ich5,xh2);          % filter

sampl = irfn * IPOINT + 1;

ich7  = ich6(:,sampl:IPOINT:IPOINT*num_symbol*clen+sampl-1);

% despreading

[hn,vn] = size(ich7);

[hc,vc] = size(code);

vn      = fix(vn/vc);

iout    = zeros(hc,vn);

for ii=1:hc

iout(ii,:) = rot90(flipud(rot90(reshape(ich7(ii,:),vc,vn)))*rot90(code(ii,:),3))>=0;

%************************        BER          ***************************

noe2 = sum(sum(abs((ich+1)/2-iout)));

nod2 = num_users * num_symbol ;

noe  = noe + noe2;

nod  = nod + nod2;

fprintf('%d\t%e\n',ii,noe2/nod2);

%**********************      误码率文件     *************************

ber = noe / nod;

fprintf('%s\t%s\t\t%s\t\t%s\n','ebn0','noe','nod','ber');

fprintf('%d\t%d\t%d\t%e\n',ebn0,noe,nod,ber);

fid = fopen('DSCDMA_BER.dat','a');

fprintf(fid,'%d\t%e\t%f\t%f\t\n',ebn0,noe/nod,noe,nod);

fclose(fid);

%%%%%%%%%%%%%%%%%%%%%%%      结论      %%%%%%%%%%%%%%%%%%%%%%%%%%%%

% DS_CDMA系统中频信号理论仿真结果正确。

% 多用户下仿真结果正确。5阶M序列可以使用!

% 2018-12-12

你们认为好的同学也可以介绍给老师,毕竟老师认识的不是很全面,非常优秀的同学,有可能在小庄蛋会被埋没,希望老师能够给他们点石成金。

同学们,帮杨哥的文章,点一下广告,然后再转发一下好吗,我希望我的学生都非常优秀,小杨他们确实很努力,大家自觉以后帮朋友们点赞。他们涉及到学生的文章都转发和点赞以及点广告。点好看的不是点赞。拜托了,各位,我们一个团体一起进步,我相信随着老师。执教经历的越来越多,我们的团队会越来越大,那我们的能量就越来越多,聚集的能量越来越多,以后我们能办成更多的事,人心齐,泰山移,兄弟们的技术这句话。

未完,待续!

修订记录

介绍使用matlab仿真工具和其各种类型的算法,讲解高校涉及matlab的相关课程,免费提供通信类、导航类的产品级物理层算法、数据统计分析算法、图像处理算法、AI算法。义务为各高校的MATLAB学习社团和生物医学领域的科研人员做技术支持。

值得您关注!

希望同学们转发并且宣传,本人只会实实在在的教书育人。

算法工匠

讲解高校电子及通信相关专业的课程,交流人文历史及教育心得,介绍和推广信号处理算法、通信算法和大数据算法。帮助学生了解信号处理和通信涉及的仿真知识并介绍算法在实际工作中的运用。提供matlab仿真程序供交流使用。大数据算法侧重生物医学领域,义务帮助医务人员进行数据统计分析。

如果你觉得我是努力教学的老师,愿意看我的文章,愿意和我分享您的经验和建议,请扫描公众号的二维码,关注我。

介绍和推广matlab仿真的文章及源代码,介绍和共享相关资料。为各高校和研究机构的MATLAB学习爱好者提供技术支持,义务为生物医学领域的科研人员做数据分析。