📄 adptive_bitpow_allocate_systems.c
字号:
mxArray * bit_source = NULL;
mxArray * bit_maxnum_ofdmsig = NULL;
mxArray * gama = NULL;
mxArray * bitalloctvector = NULL;
mxArray * poweralloctpower = NULL;
mxArray * spow1 = NULL;
mxArray * b = NULL;
mxArray * k = NULL;
mxArray * spow2 = NULL;
mxArray * mm = NULL;
mxArray * nn = NULL;
mxArray * HHk = NULL;
mxArray * ofdm_demodulation_out1 = NULL;
mxArray * sig_temp = NULL;
mxArray * Hk = NULL;
mxArray * passchan_ofdm_symbol1 = NULL;
mxArray * ofdm_cp_out1 = NULL;
mxArray * ofdm_modulation_out1 = NULL;
mxArray * map_out1 = NULL;
mxArray * count_begin = NULL;
mxArray * counter = NULL;
mxArray * fd = NULL;
mxArray * var_pow = NULL;
mxArray * trms = NULL;
mxArray * delay = NULL;
mxArray * num = NULL;
mxArray * ofdm_symbol_num = NULL;
mxArray * l = NULL;
mxArray * loop_num = NULL;
mxArray * total_bit_num1 = NULL;
mxArray * error_bit_ofdm1 = NULL;
mxArray * total_bit_num = NULL;
mxArray * error_bit_ofdm = NULL;
mxArray * snr = NULL;
mxArray * i = NULL;
mxArray * groupnumber = NULL;
mxArray * groupsize = NULL;
mxArray * kk = NULL;
mxArray * ber_snr_reallocatpow = NULL;
mxArray * ber_snr_persjr_ofdm = NULL;
mxArray * groupnumber1 = NULL;
mxArray * Pe = NULL;
mxArray * SNR_dB = NULL;
mxArray * delta_f = NULL;
mxArray * t_interval = NULL;
mxArray * bandwidth = NULL;
mxArray * N_carrier = NULL;
mxArray * cp_length = NULL;
mxArray * t0 = NULL;
mxArray * ans = NULL;
mclCopyArray(&m);
/*
* %%%新方案,接收端先进行合并,将受到jamming影响的子载波去除
* % clear all
* % clc
* format long
*/
mlfFormat(_mxarray0_, NULL);
/*
* %本次仿真载频为2GHz,带宽1MHz,子载波数64个,cp为8
* %子载波间隔为15.625kHz
* %一个ofdm符号长度为64us,cp长度为8us
* %系统调制级别定为QPSK
* %最大doppler频率为50Hz,信道是慢变的
* %多径信道为4径,功率延迟谱服从负指数分布~exp(-t/trms),trms=(1/5)*tmax=1.2us时长,各径延迟取为delay=[0 3e-6 6e-6]
* t0=clock;
*/
mlfAssign(&t0, mlfClock());
/*
* cp_length=16;%cp长度为16
*/
mlfAssign(&cp_length, _mxarray2_);
/*
* N_carrier=64;%OFDM子载波个数
*/
mlfAssign(&N_carrier, _mxarray3_);
/*
* bandwidth=1000000;%系统带宽为1MHz
*/
mlfAssign(&bandwidth, _mxarray4_);
/*
* t_interval=(1/bandwidth)*N_carrier/(cp_length+N_carrier);%采样间隔64/72us,加上循环前缀后,采样率增加
*/
mlfAssign(
&t_interval,
mclMrdivide(
mclMtimes(
mclMrdivide(_mxarray5_, mclVv(bandwidth, "bandwidth")),
mclVv(N_carrier, "N_carrier")),
mclPlus(mclVv(cp_length, "cp_length"), mclVv(N_carrier, "N_carrier"))));
/*
* delta_f=bandwidth/N_carrier;%Hz
*/
mlfAssign(
&delta_f,
mclMrdivide(
mclVv(bandwidth, "bandwidth"), mclVv(N_carrier, "N_carrier")));
/*
* % SNR_dB=[0 4 8 12 16 20 24 28 32 35];%Eb/N0
* % SJR_dB=[-10 -5 -3 0 3 5 10 15 20 25];%符号信干比
* %SNR_dB=[8 12 16 20 24 28 32 35];
* SNR_dB=[10];
*/
mlfAssign(&SNR_dB, _mxarray6_);
/*
* Pe=1e-3;
*/
mlfAssign(&Pe, _mxarray7_);
/*
* groupnumber1=[4 16 32];
*/
mlfAssign(&groupnumber1, _mxarray8_);
/*
* ber_snr_persjr_ofdm=zeros(length(groupnumber1),length(SNR_dB));
*/
mlfAssign(
&ber_snr_persjr_ofdm,
mlfZeros(
mlfScalar(mclLengthInt(mclVv(groupnumber1, "groupnumber1"))),
mlfScalar(mclLengthInt(mclVv(SNR_dB, "SNR_dB"))),
NULL));
/*
* ber_snr_reallocatpow=zeros(length(groupnumber1),length(SNR_dB));
*/
mlfAssign(
&ber_snr_reallocatpow,
mlfZeros(
mlfScalar(mclLengthInt(mclVv(groupnumber1, "groupnumber1"))),
mlfScalar(mclLengthInt(mclVv(SNR_dB, "SNR_dB"))),
NULL));
/*
* for kk=1:length(groupnumber1)
*/
{
int v_ = mclForIntStart(1);
int e_ = mclLengthInt(mclVv(groupnumber1, "groupnumber1"));
if (v_ > e_) {
mlfAssign(&kk, _mxarray10_);
} else {
/*
* groupsize=N_carrier/groupnumber1(kk);
* groupnumber=groupnumber1(kk);
* for i=1:length(SNR_dB)%每个SNR点上仿真若干次
* snr=10^(SNR_dB(i)/10);
* error_bit_ofdm=0;
* total_bit_num=0;%发送总比特数统计
* error_bit_ofdm1=0;%for 二次功率分配
* total_bit_num1=0;%for 二次功率分配
* loop_num=10; %共仿真1000次
*
* for l=1:loop_num
* ofdm_symbol_num=120;%每次仿真产生10个ofdm符号,则每次仿真共有200×64个星座映射符号;QPSK调制下,1个星座映射符号包含2个bit
* %%%%信道参数%%%%%%
* num=6;
*
* delay=[0 1e-6 2e-6 3e-6 4e-6 6e-6];
* trms=1.5e-6;
* var_pow=10*log10(exp(-delay/trms));%各径功率衰减,以dB形式给出
* fd=50;%最大doppler频率为50Hz
* %t_interval=0.8889e-6;%采样间隔64/72us,加上循环前缀后,采样率增加
* counter=1000000;%200000000;%各径信道的采样点间隔,应该大于信道采样点数。由以上条件现在信道采样点数
* count_begin=(l-1+100000000)*5*counter;%每次仿真信道采样的开始位置
* %%%%%%以上为信道参数%%%%%%
* %%%%以下过程为了得到准确的信道信息%%%%%%
* map_out1=rand(2*N_carrier,ofdm_symbol_num)>0.5;
* map_out1=map_module(map_out1,2);
* ofdm_modulation_out1=sqrt(N_carrier)*ifft(map_out1,N_carrier);
* ofdm_cp_out1=insert_cp(ofdm_modulation_out1,cp_length);
* [passchan_ofdm_symbol1,Hk]=multipath_chann(ofdm_cp_out1,num,var_pow,delay,fd,t_interval,counter,count_begin,cp_length);
* sig_temp=cut_cp(passchan_ofdm_symbol1,cp_length);
* ofdm_demodulation_out1=fft(sig_temp,N_carrier)/sqrt(N_carrier);
* HHk=ofdm_demodulation_out1./map_out1;
* [nn,mm]=size(ofdm_cp_out1);
* spow2=0;
* for k=1:nn
* for b=1:mm
* spow2=spow2+real(ofdm_cp_out1(k,b))^2+imag(ofdm_cp_out1(k,b))^2;
* end
* end
* %spow1=spow2/(nn*mm);%信号平均能量
* spow1=1;
* %%%%以上过程为了得到准确的信道信息%%%%%%
*
*
*
*
* %%%%%%%%%以下为不做二次功率分配,原参考文献方法%%%%%%%%%%%%
* [poweralloctpower,bitalloctvector,gama]=bitandpoweralloct2(N_carrier,groupnumber,HHk,snr,Pe,ofdm_symbol_num);%自适应分配比特和功率
*
* bit_maxnum_ofdmsig=groupsize*max(sum(bitalloctvector));
* bit_source=zeros(bit_maxnum_ofdmsig,ofdm_symbol_num);
* bit_num_ofdmsig=zeros(1,ofdm_symbol_num);
* map_out=zeros(N_carrier,ofdm_symbol_num);
*
* for nn=1:ofdm_symbol_num
* for v=1:1:groupnumber
* map_flag=bitalloctvector(v,nn);
* sourcebit=zeros(1,bitalloctvector(v,nn)*groupsize);
* for w=1:1:groupsize
* if bitalloctvector(v,nn)>6
* input=zeros(1,bitalloctvector(v,nn));
* elseif bitalloctvector(v,nn)<1
* input=[];
* else
* input=(rand(1,bitalloctvector(v,nn)))>0.5;
* end
* sourcebit(1,1+(w-1)*bitalloctvector(v,nn):(w-1)*bitalloctvector(v,nn)+bitalloctvector(v,nn))=input;
* %按照map_flag指示完成各种星座映射,input为输入比特块
* end
*
* bit_source((v-1)*groupsize*map_flag+1:(v-1)*groupsize*map_flag+groupsize*map_flag,nn)=sourcebit';
* bit_num_ofdmsig(nn)=bit_num_ofdmsig(nn)+bitalloctvector(v,nn)*groupsize;
* if length(sourcebit)==0
* map_out((v-1)*groupsize+1:(v-1)*groupsize+groupsize,nn)=zeros(groupsize,1);
* else
* %map_out((v-1)*groupsize+1:(v-1)*groupsize+groupsize,nn)=sqrt(poweralloctpower(v,nn))*map_module(sourcebit',bitalloctvector(v,nn));
* map_out((v-1)*groupsize+1:(v-1)*groupsize+groupsize,nn)=map_module_adp(sourcebit',bitalloctvector(v,nn));
* end
* end
* end
* map_out1=zeros(size(map_out));
* %%%%%%%%以下根据功率分配值做分配功率%%%%%%%%%%
* for nn=1:ofdm_symbol_num
* for v=1:groupnumber
* if poweralloctpower(v,nn)~=0
* for w=1:groupsize
* map_out1((v-1)*groupsize+w,nn)=sqrt(poweralloctpower(v,nn))*map_out((v-1)*groupsize+w,nn);
* end
* end
* end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -