OFDM的MATLAB仿真

  • n2_417236
    了解作者
  • 8.1KB
    文件大小
  • 文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 4
    下载次数
  • 2022-04-09 03:23
    上传日期
1.使用Matlab实现一个OFDM系统。 OFDM系统具体参数参照LTE标准,具体为: 系统带宽:5MHz; OFDM符号长度:0.0714ms; 子载波间隔:15kHz; CP长度:OFDM符号长度的7 ; FFT点数:512; 2.选择一种降低OFDM系统峰均比的算法,在1的基础上实现,并分析其性能。
OFDM_sim.rar
  • reduce_PAPR.m
    7.8KB
  • reduce_BER.m
    7.5KB
  • OFDM.m
    6.5KB
内容介绍
clear all close all clc SNR_list = [6:0.1:8]; %单位为dB;请修改为合适的信噪比,以保证误码率在10^-3一下 % SNR_list = [16:0.1:18]; %单位为dB;请修改为合适的信噪比,以保证误码率在10^-3一下 block_length = 100; %每个信噪比仿真的LDPC码帧数,修改为100方便测试 Q = 16; % 调制阶数:16(16QAM) B = log2(Q); % 每个符号承载的比特数 K=sum((1:2:sqrt(Q)).^2)*4/sqrt(Q); % 能量计算 %星座图生成 sym_tab1=[-3 -1 +3 +1]; sym_tab2=zeros(1,Q); for (i1=0:sqrt(Q)-1) for (j1=0:sqrt(Q)-1) sym_tab2(i1*sqrt(Q)+j1+1)=sym_tab1(i1+1)+1j*sym_tab1(j1+1); end; end bit_tab2=zeros(B,Q); for (m2=1:Q) bit_tab2(:,m2)=de2bi(m2-1,B','left-msb')'; end R = 3/4; %码率:3/4 H =dvbs2ldpc(R); %校验矩阵生成 henc = fec.ldpcenc(H); %编码结构体 hdec = fec.ldpcdec(H); %解码结构体 hdec.DecisionType = 'Soft decision'; % 软输出 hdec.OutputFormat = 'Information part'; % 只输出信息位 hdec.NumIterations = 30; %最大迭代次数 hdec.DoParityChecks = 'Yes'; N = henc.BlockLength/B; % 每个LDPC帧符号个数 err_count = zeros(size(SNR_list)); BER_count = zeros(size(SNR_list)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N_fft = 512; %FFT点数=512 msg_carrier = 300; %有用信息用到的子载波数量=300,其他填零 Threshold_list = [1 0.27 0.22 0.17 0.12 0.1]; CP_no = floor(N_fft*0.07); %循环前缀长度计算,占百分之7 x_package_power = zeros(1,N_fft+CP_no); %OFDM符号中每个点的能量(包括循环前缀) PAPR = zeros(ceil(length(SNR_list)/4),4*ceil(N/msg_carrier)*block_length); %储存不同阈值下的PAPR数据 x_ofdm_pre = zeros(1, ceil(N/msg_carrier)*(N_fft+CP_no)); %进行抑制PAPR处理前的OFDM符号 x_ofdm = zeros(1, ceil(N/msg_carrier)*(N_fft+CP_no)); %添加循环前缀后的OFDM符号 buffer = zeros(1,N_fft+CP_no); %一个缓存用于抑制PAPR处理以及计算峰均比 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for snr_count = 1:length(SNR_list) snr = SNR_list(snr_count); % 计算噪声方差 snr=10^(snr/10); power_s=K; power_n=power_s/snr; const=-1/power_n; for count = 1 : block_length msg = randi([0 1],1,henc.NumInfoBits); %生成信息位 codeword = encode(henc, msg); %编码 %星座映射(比特到符号的映射) sym = 2.^(B-1:-1:0)*reshape(codeword,B,[])+1; modulatedsig = sym_tab2(uint8(sym)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 请添加你自己的代码 % OFDM调制部分 % 输入:星座映射后的符号modulatedsig % 输出:OFDM调制后的符号行向量x_ofdm carrier = zeros(1, N_fft); % 每次IFFT需要的输入,即X(k) % 这里直接用每一帧长度除以每个OFDM符号承载的信息长度向上取整作为每一帧OFDM符号的数量 % 实际系统中由于帧长度不一定是单个OFDM符号信息长度的整数倍,因此每一帧末的OFDM符号处理方式稍有不同 % 但是这里恰好满足整数倍关系而且该问题不是本次仿真的本质问题,所以此处不考虑该问题 for package_count = 1 : ceil(N/msg_carrier) carrier(1:msg_carrier) = modulatedsig(msg_carrier*(package_count-1)+1:msg_carrier*package_count); %300个子载波承载信息,其他子载波置零 x_ofdm_pre((N_fft+CP_no)*(package_count-1)+1+CP_no:(N_fft+CP_no)*package_count) = ifft(carrier,N_fft); %进行512点IFFT % 添加循环前缀 x_ofdm_pre((N_fft+CP_no)*(package_count-1)+1:(N_fft+CP_no)*(package_count-1)+CP_no) = x_ofdm_pre((N_fft+CP_no)*package_count-CP_no+1:(N_fft+CP_no)*package_count); %======================限幅法抑制PAPR====================% buffer = x_ofdm_pre((N_fft+CP_no)*(package_count-1)+1:(N_fft+CP_no)*package_count); %以下用buffer进行处理 Threshold = Threshold_list(ceil(snr_count/4)); %取出本次仿真的阈值,每个阈值仿真两次 x_package_power = abs(buffer); %获得信号的幅度 index = find(x_package_power > Threshold); %找到大于阈值的信号 buffer(index) = Threshold.*exp(1i.*angle(buffer(index))); %对大于阈值的信号进行处理,保留相位信息,幅度信息置为阈值 x_package_power = abs(buffer); %获得处理后信号的幅度 x_ofdm((N_fft+CP_no)*(package_count-1)+1:(N_fft+CP_no)*package_count) = buffer; %将处理后的信息作为调制后的信号发送 %======================================================% x_package_power = x_package_power.^2; %计算单个OFDM符号中每个点的能量,即x(n)^2 %利用上面得到的每个点的能量,计算峰均比,单位为dB if(mod(snr_count,4) ~=0) PAPR(ceil(snr_count/4),(mod(snr_count,4)-1)*block_length+ceil(N/msg_carrier)*(count-1)+package_count) = 10*log10(max(x_package_power)./mean(x_package_power)); else PAPR(ceil(snr_count/4),(3*block_length+ceil(N/msg_carrier)*(count-1)+package_count)) = 10*log10(max(x_package_power)./mean(x_package_power)); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % receivedsig = awgn(x_ofdm, snr, 10*log10(K)); % AWGN信道 receivedsig = awgn(x_ofdm, SNR_list(snr_count), 'measured'); % AWGN信道 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 请添加你自己的代码 % OFDM解调部分 % 输入:被噪声污染的信号receivedsig % 输出:OFDM解调后的行向量信号r_ofdm re_y = zeros(1, N_fft); % 每次FFT需要的输入,即接收到的OFDM符号(去除保护间隔) re_Y = zeros(1, ceil(N/msg_carrier)*N_fft); % 每次FFT得到的结果 r_ofdm = zeros(1,N); %从FFT结果中提取出的信号 for package_count = 1 : ceil(N/msg_carrier) %与发送端相同,接收端也不考虑非整数倍的问题 re_y = receivedsig((N_fft+CP_no)*(package_count-1)+1+CP_no:(N_fft+CP_no)*package_count); %去除保护间隔,获得FFT的输入 re_Y(N_fft*(package_count-1)+1:N_fft*package_count) = fft(re_y, N_fft); %进行512点的FFT % 只选取承载了信息的子载波作为最终解调得到的信号 % r_ofdm(msg_carrier*(package_count-1)+1:msg_carrier*package_count) = re_Y(N_fft*(package_count-1)+1:N_fft*(package_count-1)+msg_carrier); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % r_ofdm = receivedsig; % for debug; % 解映射 % 符号概率计算 for (m1=1:Q) t=r_ofdm-sym_tab2(m1); t=t.*conj(t); sym_prob(m1,:)=exp(t*const); end %归一化符号概率计算 for (n1=1:N) sym_prob(:,n1)=sym_prob(:,n1)/sum(sym_prob(:,n1)); end %比特概率计算 bit_prob=bit_tab2*sym_prob; % 对数似然比计算 llr = real(log((1-bit_prob)./(bit_prob+eps))); llr = reshape(llr,1,[]); decodedmsg = decode(hdec, llr); %解码 err=nnz(sign(decodedmsg)-1+2*msg); %误码率计算 if(err) % 错误统计 err_count(snr_count) = err_count(snr_count) + err; end end % 误码率计算 BER_count(snr_count) = err_count(snr_count)/(block_length*henc.NumInfoBits); %%%%%%%%test%%%%%%%% snr_count BER_count(snr_count) %%%%%%%%test%%%%%%%% end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 绘制峰均比CCDF曲线 figure; [ x_PAPR, y_CCDF ] = CCDF_PAPR(PAPR(1,:)); semilogy(x_PAPR,y_CCDF,'r-o'); hold on; x_PAPR = 0;y_CCDF = 0; [ x_PAPR, y_CCDF ] = CCDF_PAPR(PAPR(2,:)); semilogy(x_PAPR,y_CCDF,'k-o'); x_PAPR = 0;y_CCDF = 0; [ x_PAPR, y_CCDF ] = CCDF_PAPR(PAPR(3,:)); semilogy(x_PAPR,y_CCDF,'b-o'); x_PAPR = 0;y_CCDF = 0; [ x_PAPR, y_CCDF ] = CCDF_PAPR(PAPR(4,:)); semilogy(x_PAPR,y_CCDF,'y-o'); x_PAPR = 0;y_CCDF = 0; [ x_PAPR, y_CCDF ] = CCDF_PAPR(PAPR(5,:)); semilogy(x_PAPR,y_CCDF,'g-o'); x_PAPR = 0;y_CCDF = 0; [ x_PAPR, y_CCDF ] = CCDF_PAPR(PAPR(6,:)); semilogy(x_PAPR,y_CCDF,'c-o'); xlabel('PAPR_0 (dB)'); ylabel('CCDF'); legend('不限幅','阈值 = 0.27','阈值 = 0.22','阈值 = 0.17','阈值 = 0.12','阈值 = 0.1'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
评论
    相关推荐
    • 蛙跳算法MATLAB程序
      基本蛙跳算法MATLAB程序。用MATLAB编写的基础算法
    • 遗传算法Matlab程序
      应用数字群算法设计数字滤波器的matlab程序,遗传算法是最近几年流行的优化算法
    • Q算法MATLAB仿真
      移动机器人路径规划MATLAB仿真,使用Q-Learning算法
    • PSO 算法matlab程序
      这个程序就是最基本的粒子群优化算法程序,用Matlab实现。
    • 遗传算法MATLAB应用
      老师上课的参考书 主要是关于遗传算法的一些MATLAB应用,十分有意思 希望大家能喜欢
    • 遗传算法MATLAB实现
      遗传算法MATLAB实现,附WORD说明算法
    • 遗传算法matlab
      matlab程序下的遗传算法
    • 遗传算法matlab
      遗传算法是自然选择和群体学基础上的非数值优化方法。提供了些matlab实例计算
    • 遗传算法matlab
      matlab是科学计算常用的工具,遗传算法也是一种目前比较流行的一种算法,利用matlab写的遗传算法代码,供大家参考。
    • 遗传算法matlab代码
      遗传算法matlab代码,能够正常运行,对于刚开始接触遗传算法的人员有很好的帮助