adptive_bitpow_allocate_systems.c
来自「好东西」· C语言 代码 · 共 1,150 行 · 第 1/5 页
C
1,150 行
* end
* total_bit_num=total_bit_num+sum(bit_num_ofdmsig);
*
*
* ofdm_modulation_out=sqrt(N_carrier)*ifft(map_out1,N_carrier);%作64点逆FFT运算,完成ofdm调制,前面乘系数sqtr(64)是为了保持ifft前后的符号能量不变
*
* ofdm_cp_out=insert_cp(ofdm_modulation_out,cp_length);%插入循环前缀
* %%%%%%%%以下计算噪声方差%%%%%%%%%%
*
* map_flag=sum(bit_num_ofdmsig)/(N_carrier*ofdm_symbol_num);
* % sgma=sqrt(spow1/(2*snr)/map_flag);
* if map_flag==0
* sgma=sqrt(spow1/(2*snr));
* else
* %sgma=sqrt(spow1/(2*snr)/map_flag);%sgma如何计算,与当前SNR和信号平均能量有关系
* sgma=sqrt(spow1/(2*snr));
* end
*
*
* [passchan_ofdm_symbol,Hk]=multipath_chann(ofdm_cp_out,num,var_pow,delay,fd,t_interval,counter,count_begin,cp_length);
*
* passnoise_ofdm_symbol=add_noise(sgma,passchan_ofdm_symbol);%加入随机高斯白噪声,receive_ofdm_symbol为最终接收机收到的ofdm符号块
*
*
* cutcp_ofdm_symbol=cut_cp(passnoise_ofdm_symbol,cp_length);%去除循环前缀
*
* ofdm_demodulation_out=fft(cutcp_ofdm_symbol,N_carrier)/sqrt(N_carrier);%作128点FFT运算,完成ofdm解调
* %receive_ofdm_symbol=ofdm_demodulation_out;
* receive_ofdm_symbol=ofdm_demodulation_out./HHk;
* receive_ofdm_symbol1=zeros(size(receive_ofdm_symbol));
* for nn=1:ofdm_symbol_num
* for v=1:groupnumber
* if poweralloctpower(v,nn)~=0
* for w=1:groupsize
* receive_ofdm_symbol1((v-1)*groupsize+w,nn)=receive_ofdm_symbol((v-1)*groupsize+w,nn)/sqrt(poweralloctpower(v,nn));
* end
* end
* end
* end
* receive_bit_sig=de_map_module_adp(receive_ofdm_symbol1,bitalloctvector,groupsize,groupnumber,bit_num_ofdmsig);
*
*
* %以下过程统计接收信号中的错误比特数
* [mn,nn]=size(bit_source);
* err_num=sum(sum(rem(bit_source+receive_bit_sig,2)));
* error_bit_ofdm=error_bit_ofdm+err_num;
* %%%%%%%%%以上为不做二次功率分配,原参考文献方法%%%%%%%%%%%%
*
*
*
*
*
*
* %%%%%%%%%%%以下为做功率二次分配的方法%%%%%%%%%%%%%%%%
* [poweralloctpower,bitalloctvector,gama]=bitandpoweralloct2(N_carrier,groupnumber,HHk,snr,Pe,ofdm_symbol_num);%自适应分配比特和功率
* %[poweralloctpower,bitalloctvector,gama]=reallocat_power(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
* end
* total_bit_num1=total_bit_num1+sum(bit_num_ofdmsig);
*
*
* ofdm_modulation_out=sqrt(N_carrier)*ifft(map_out1,N_carrier);%作64点逆FFT运算,完成ofdm调制,前面乘系数sqtr(64)是为了保持ifft前后的符号能量不变
* ofdm_cp_out=insert_cp(ofdm_modulation_out,cp_length);%插入循环前缀
* %%%%%%%%以下计算噪声方差%%%%%%%%%%
*
* map_flag=sum(bit_num_ofdmsig)/(N_carrier*ofdm_symbol_num);
* % sgma=sqrt(spow1/(2*snr)/map_flag);
* if map_flag==0
* sgma=sqrt(spow1/(2*snr));
* else
* %sgma=sqrt(spow1/(2*snr)/map_flag);%sgma如何计算,与当前SNR和信号平均能量有关系
* sgma=sqrt(spow1/(2*snr));
* end
*
*
*
* [passchan_ofdm_symbol,Hk]=multipath_chann(ofdm_cp_out,num,var_pow,delay,fd,t_interval,counter,count_begin,cp_length);
*
* passnoise_ofdm_symbol=add_noise(sgma,passchan_ofdm_symbol);%加入随机高斯白噪声,receive_ofdm_symbol为最终接收机收到的ofdm符号块
*
*
* cutcp_ofdm_symbol=cut_cp(passnoise_ofdm_symbol,cp_length);%去除循环前缀
*
* ofdm_demodulation_out=fft(cutcp_ofdm_symbol,N_carrier)/sqrt(N_carrier);%作128点FFT运算,完成ofdm解调
* %receive_ofdm_symbol=ofdm_demodulation_out;
* receive_ofdm_symbol=ofdm_demodulation_out./HHk;
* receive_ofdm_symbol1=zeros(size(receive_ofdm_symbol));
* for nn=1:ofdm_symbol_num
* for v=1:groupnumber
* if poweralloctpower(v,nn)~=0
* for w=1:groupsize
* receive_ofdm_symbol1((v-1)*groupsize+w,nn)=receive_ofdm_symbol((v-1)*groupsize+w,nn)/sqrt(poweralloctpower(v,nn));
* end
* end
* end
* end
* receive_bit_sig=de_map_module_adp(receive_ofdm_symbol1,bitalloctvector,groupsize,groupnumber,bit_num_ofdmsig);
*
*
* %以下过程统计接收信号中的错误比特数
* [mn,nn]=size(bit_source);
* err_num=sum(sum(rem(bit_source+receive_bit_sig,2)));
* error_bit_ofdm1=error_bit_ofdm1+err_num;
* %%%%%%%%%%%以上为做功率二次分配的方法%%%%%%%%%%%%%%%%
* end%for l=1:loop_num
*
* ber_snr_persjr_ofdm(kk,i)=error_bit_ofdm/total_bit_num;
* ber_snr_reallocatpow(kk,i)=error_bit_ofdm1/total_bit_num1;
* fre_eff_persnr(kk,i)=total_bit_num/(loop_num*ofdm_symbol_num*(1/bandwidth)*N_carrier)/bandwidth;
* fre_eff_persnr_reallocatpow(kk,i)=total_bit_num1/(loop_num*ofdm_symbol_num*(1/bandwidth)*N_carrier)/bandwidth;
*
* save bitalloc_data.mat ber_snr_persjr_ofdm ber_snr_reallocatpow fre_eff_persnr fre_eff_persnr_reallocatpow;
* end%for i=1:length(SNR_dB)
*
* end %for kk
*/
for (; ; ) {
mlfAssign(
&groupsize,
mclMrdivide(
mclVv(N_carrier, "N_carrier"),
mclIntArrayRef1(mclVv(groupnumber1, "groupnumber1"), v_)));
mlfAssign(
&groupnumber,
mclIntArrayRef1(mclVv(groupnumber1, "groupnumber1"), v_));
{
int v_0 = mclForIntStart(1);
int e_0 = mclLengthInt(mclVv(SNR_dB, "SNR_dB"));
if (v_0 > e_0) {
mlfAssign(&i, _mxarray10_);
} else {
for (; ; ) {
mlfAssign(
&snr,
mclMpower(
_mxarray6_,
mclMrdivide(
mclIntArrayRef1(mclVv(SNR_dB, "SNR_dB"), v_0),
_mxarray6_)));
mlfAssign(&error_bit_ofdm, _mxarray11_);
mlfAssign(&total_bit_num, _mxarray11_);
mlfAssign(&error_bit_ofdm1, _mxarray11_);
mlfAssign(&total_bit_num1, _mxarray11_);
mlfAssign(&loop_num, _mxarray6_);
{
int v_1 = mclForIntStart(1);
int e_1
= mclForIntEnd(mclVv(loop_num, "loop_num"));
if (v_1 > e_1) {
mlfAssign(&l, _mxarray10_);
} else {
for (; ; ) {
mlfAssign(
&ofdm_symbol_num, _mxarray12_);
mlfAssign(&num, _mxarray13_);
mlfAssign(&delay, _mxarray14_);
mlfAssign(&trms, _mxarray16_);
mlfAssign(
&var_pow,
mclMtimes(
_mxarray6_,
mlfLog10(
mlfExp(
mclMrdivide(
mclUminus(
mclVv(delay, "delay")),
mclVv(trms, "trms"))))));
mlfAssign(&fd, _mxarray17_);
mlfAssign(&counter, _mxarray4_);
mlfAssign(
&count_begin,
mclMtimes(
mlfScalar(
svDoubleScalarTimes(
(double) (v_1 - 1 + 100000000),
5.0)),
mclVv(counter, "counter")));
mlfAssign(
&map_out1,
mclGt(
mlfNRand(
1,
mclMtimes(
_mxarray18_,
mclVv(N_carrier, "N_carrier")),
mclVv(
ofdm_symbol_num,
"ofdm_symbol_num"),
NULL),
_mxarray19_));
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?