《天线选择定点算法》由会员分享,可在线阅读,更多相关《天线选择定点算法(14页珍藏版)》请在金锄头文库上搜索。
1、天线选择定点算法天线选择定点算法一、系统平台与原理算法间的对应关系 在文档1中提出,用以下两个公式来对不同天线配置下的信道容量进行遍历式计算,然后通 过比较这些容量的大小来确定天线选择方案:(1)12, 0(_)logdetNi M iC mimoindexMA(2)2Hs iMMiiE MA= IHH,% %其中为 Hermitian 矩阵,维数为() 。是第 个参考信号子载波的iMA,MM1,4M iH%i有效信道矩阵,维数为。是总的信号的发送能量(归一化能量发送时取值为 1) ,是4 MsEM发送流数,是多个接收天线上的平均噪声方差。为参与运算的总的子载波信道数目。2N在系统算法平台中,
2、发射端的调制信号能量归一化以后,经过 IFFT 运算后总能量衰减为原来 的 1/1024,总的信号发送能量没有进行归一化,在对过了多径的信号噪声的时候,噪声功率计算 为: 多径信道增益_HPOWER:平均每个符号的能量,星座点归一化为 1_Esymbol:发射天线数TN: FFT 点数_FFTNOTES:噪声功率谱密度2:指定的信噪比0bE N:调制方式Mod 实际加入的噪声是信号的实部和虚部分别加入的,功率谱密度为:20_2bHPOWEREsymbol EModN 在利用 CP 或是 preamble 进行的估计时,由于是在时域进行的,接收到的信号经过 AGC 以2后会有个 AGC 的调整因
3、子:AGC 调整因子_agcdivisor这样估计到的噪声功率谱密度是的倍数,倍数关系为:,即估计得到的噪22_agcdivisor声功率谱密度:222_estagcdivisor由于接收到的 midamble 也是经过 AGC 的,且信道估计是在频域进行,而接收机这端 FFT 运算也没有归一化,会对信号有个放大,从仿真结果看放大倍数在左右,没有作大量_FFTNOTES的统计仿真,观察了几组数据,选择用来作为估算结果。_FFTNOTES综合考虑发送端、接收端的 IFFT、FFT 和 AGC 的影响,估计得到的频域信道和实际频域信道 间的关系为:_i iestagcdivisorFFTNOTES
4、HH%以及算法中估算的结果,公式(2)变为以下形式:2222_ _)_)_Hs iMMiiTHii M estHT MiiE M EsymbolN estagcdivisorestagcdivisorFFTNOTES MFFTNOTESFFTNOTESEsymbolN MFFTNOTES A= IHHHHI(I(H(H,% %(3 3)二、定点算法中各个模块及各变量位宽设置 有了上述结果,下面给出天线选择各个模块的定点化程序。 2.1 噪声功率谱密度计算 通过估计得到的噪声功率谱密度及其位宽设置为:位宽为(18, 18) ,当的变换范围为:030dB 的时候,估算得到的的浮点2 est0bE
5、N2 est数值范围为(0.0000488281, 0.0488281)通过查表法求得其倒数为:位宽为(18, 2)21est2.2 天线选择模块变量名位宽说明h_ch(18,10)频域信道N整数 32用了 32 个导频上的信道var_inverse(18,2)噪声功率谱的倒数nr4接收天线数h_eff(18,8)计算的有效信道h_eff* (h_eff)(18,4)有效信道和它自己的共轭转置的乘积matrixA(18,6)公式(2)中的矩阵 Adet(18,8)矩阵的行列式temp_capa_fix(11,7)行列式的对数capacity(16,7)容量值void P_rank_cal(P_
6、Complex* h_ch,/输入的信道矩阵int input_w,int input_w_d,/信道矩阵位宽(18,10)int N,/天线选择中所选用的子载波数FIX var_inverse,/信道矩阵位宽(18,10)int var_w, int var_w_d,/噪声功率谱密度的倒数位宽(18,2)int *mimo_indicator,/计算得到的mimo索引值int nr)/接收天线数int eff_nt,i,j,k,nr_idx,nt_idx,mimo_idx;int h_eff_w=input_w;/计算有效信道位宽和输入总位宽一致,int h_eff_w_d=input_w_
7、d-2;/有效信道小数位宽减两位,分两位计入整数位宽int matrix_a_w=18;/H*H得到的矩阵的总位宽,统一为18int matrix_a_w_d=4;/ H*H得到的矩阵的小数位宽,统一为4int matrix_adjust2_a_w=18;/公式(2)中计算后的总位宽int matrix_adjust2_a_w_d=6;/公式(2)中计算后的总小数位宽int det_w=18;/算得的行列式位宽int det_w_d=8;/算得的行列式小数位宽FIX det=0;FIX temp=0; FIX tmp1,tmp2;FIX* temp_capa_fix=(FIX*)malloc(
8、sizeof(FIX);/对每个载波计算算得的容量,最后要累加到变量capacity中,共32个累加量(N)int temp_capa_fix_w=11;/每个累加量的总位宽int temp_capa_fix_w_d=7;/每个累加量的小数位宽FIX capacity4; /现在只计算天线独立数为1和4时的容量,每个位宽为(16,7),由32个temp_capa_fix累加得到int capacity_w=16;int capacity_w_d=7;/*所需变量空间分配,可以不管*/P_Complex *h_matrix,*h_eff,*h_subcarr,*h_subcarr_Htransp
9、ose, *matrixA, tmp;h_eff = alloc_mem_P_complex3(N,nr,4);h_subcarr = alloc_mem_P_complex1(nr*4);h_subcarr_Htranspose = alloc_mem_P_complex1(4*nr);matrixA = alloc_mem_P_complex1(4*4);memset(capacity,0,sizeof(FIX)*4); / mimo_index re,var_inverse);tmp2=Multiply(matrixA+i*eff_nt+j)-im,var_inverse);(matri
10、xA+i*eff_nt+j)-re= AdjustFIX(tmp118,36,6,matrix_adjust2_a_w,matrix_adjust2_a_w_d);(matrixA+i*eff_nt+j)-im= AdjustFIX(tmp218,36,6,matrix_adjust2_a_w,matrix_adjust2_a_w_d);if (i=j)(matrixA+i*eff_nt+j)-re = (matrixA+i*eff_nt+j)-re + Tofixed(1,matrix_adjust2_a_w,matrix_adjust2_a_w_d); else if(eff_nt=4)f
11、or (i=0;ire,var_inverse);tmp2=Multiply(matrixA+i*eff_nt+j)-im,var_inverse);(matrixA+i*eff_nt+j)-re= AdjustFIX(tmp120,36,6,matrix_adjust2_a_w,matrix_adjust2_a_w_d);(matrixA+i*eff_nt+j)-im= AdjustFIX(tmp220,36,6,matrix_adjust2_a_w,matrix_adjust2_a_w_d);if (i=j)(matrixA+i*eff_nt+j)-re = (matrixA+i*eff_
12、nt+j)-re + Tofixed(1,matrix_adjust2_a_w,matrix_adjust2_a_w_d); /* 求行列式*/det = P_Matrix_Determinant(matrixA, eff_nt,matrix_adjust2_a_w,matrix_adjust2_a_w_d,det_w,det_w_d);if(det.re temp)temp = capacitymimo_idx; *mimo_indicator= mimo_idx;2.32.3 各个子模块各个子模块 2.3.12.3.1 有效信道计算模块有效信道计算模块 根据输入的 mimo_index 值
13、来计算有效信道 输入、输出参数位宽参见上一节。不管信道是几维的,4*4 还是 1*1,最终都将位宽调整为(18,8) 。void P_eff_ch_cal(P_Complex *h_ch, int input_w,int input_w_d,int N, int mimo_index, P_Complex *h_eff,int h_eff_w,int h_eff_w_d, int *eff_nt,int nr)int nt_idx,nr_idx,k;P_Complex t1,t2;/*分别根据输入的mimo_index不同,对频域信道矩阵做不同处理*/if (mimo_index=0)for
14、(nt_idx=0;nt_idx1;table_index=table_index 1;/ location+tabletable_index得到最后的对数值*log_value=AdjustFIX(log_tabletable_index,8,7,log_value_w,log_value_w_d)+Tofixed(float)location,log_value_w, log_value_w_d);free(log_table);/ 矩阵数乘:确定代数余子式,系数(-1)(i+j)和子矩阵第一行相乘void P_Scalar_Multiply2(P_Complex * matrixA,in
15、tinput_w,intinput_w_d,int row,int column,int scalar)int i,j;/ 由于乘数为1,所以只需要根据输入的scalar来确定是不变还是取反即可if(scalar%2=0)for(i=0; ire = (matrixA + i*column + j)-re;(matrixA + i*column + j)-im = (matrixA + i*column + j)-im;elsefor(i=0; ire = -(matrixA + i*column + j)-re;(matrixA + i*column + j)-im = -(matrixA + i*column + j)-im;/ 除去第i行,第j列后剩下的矩阵void