1、天线选择定点算法天线选择定点算法一、 系统平台与原理算法间的对应关系在文档1中提出,用以下两个公式来对不同天线配置下的信道容量进行遍历式计算,然后通过比较这些容量的大小来确定天线选择方案: (1) (2)其中为Hermitian矩阵,维数为()。是第个参考信号子载波的有效信道矩阵,维数为。是总的信号的发送能量(归一化能量发送时取值为1),是发送流数,是多个接收天线上的平均噪声方差。为参与运算的总的子载波信道数目。在系统算法平台中,发射端的调制信号能量归一化以后,经过IFFT运算后总能量衰减为原来的1/1024,总的信号发送能量没有进行归一化,在对过了多径的信号噪声的时候,噪声功率计算为: 多径
2、信道增益: 平均每个符号的能量,星座点归一化为1: 发射天线数: FFT点数: 噪声功率谱密度: 指定的信噪比: 调制方式实际加入的噪声是信号的实部和虚部分别加入的,功率谱密度为:在利用CP或是preamble进行的估计时,由于是在时域进行的,接收到的信号经过AGC以后会有个AGC的调整因子:AGC调整因子这样估计到的噪声功率谱密度是的倍数,倍数关系为:,即估计得到的噪声功率谱密度:由于接收到的midamble也是经过AGC的,且信道估计是在频域进行,而接收机这端FFT运算也没有归一化,会对信号有个放大,从仿真结果看放大倍数在左右,没有作大量的统计仿真,观察了几组数据,选择用来作为估算结果。综
3、合考虑发送端、接收端的IFFT、FFT和AGC的影响,估计得到的频域信道和实际频域信道间的关系为:以及算法中估算的结果,公式(2)变为以下形式:(3)二、 定点算法中各个模块及各变量位宽设置有了上述结果,下面给出天线选择各个模块的定点化程序。2.1 噪声功率谱密度计算通过估计得到的噪声功率谱密度及其位宽设置为: 位宽为(18, 18),当的变换范围为:030dB的时候,估算得到的的浮点数值范围为(0.0000488281, 0.0488281)通过查表法求得其倒数为: 位宽为(18, 2)2.2 天线选择模块变量名位宽说明h_ch(18,10)频域信道N整数32用了32个导频上的信道var_i
4、nverse(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_Complex* h_ch, /输入的信道矩阵int input_w,int input_w_d, /信道矩阵位宽(18,10)int N, /天线选择中所选用的子载波数FIX var_inverse, /信道矩阵位宽(18,10)int
5、 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_d-2; /有效信道小数位宽减两位,分两位计入整数位宽 int matrix_a_w=18; /H*H得到的矩阵的总位宽,统一为18 int matrix_a_w_d=4; / H*H得到的矩阵的小数位宽,统一为4
6、int 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(sizeof(FIX); /对每个载波计算算得的容量,最后要累加到变量capacity中,共32个累加量(N) int temp_capa_fix_w=11; /每个累加量的总位宽 in
7、t 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_Htranspose, *matrixA, tmp; h_eff = alloc_mem_P_complex3(N,nr,4); h_subcarr = alloc_mem_P_co
8、mplex1(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 4 for (mimo_idx=0;mimo_idx4;mimo_idx+=3) / mimo_index 4 /*利用函数P_eff_ch_cal 和输入的h_ch来计算对应于不同mimo_idx下的有效信道*/ P_eff_ch_cal(h_ch, input_w, input_w_d,N, mi
9、mo_idx,h_eff,h_eff_w,h_eff_w_d, &eff_nt,nr); for (k=0;kN;k+) /*每次提取一个载波上的有效信道矩阵到变量h_subcarr 中,即公式(2)中的Hi*/ h_subcarrh_effk*nr_idx*nt_idx; /*求Hi共轭转置 Hi*/ P_Htranspose(h_subcarr,nr,eff_nt,h_subcarr_Htranspose,1); /*矩阵相乘:Hi*Hi*/ P_Matrix_Multiply(matrixA, h_subcarr_Htranspose,h_subcarr,h_eff_w,h_eff_w_
10、d,matrix_a_w,matrix_a_w_d, eff_nt, eff_nt, nr); /* 求行列式对应的矩阵,即公式(2)中的矩阵,由于有效天线数为1的时候,要对计算得到的矩阵除以218,而有效天线数为4时,要除以220,所以此处将分根据有效天线数的不同,对(2)中矩阵的计算分开来处理,但是最终结果都是保存为(18,6)*/ if(eff_nt=1) for (i=0;ieff_nt;i+) for (j=0;jre,var_inverse); tmp2=Multiply(matrixA+i*eff_nt+j)-im,var_inverse); (matrixA+i*eff_nt+
11、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) for (i=0;
12、ieff_nt;i+) for (j=0;jre,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
13、 = (matrixA+i*eff_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 Tofixed(1,det_w,det_w_d) / calculation protection det.re = Tofixed(1,det_w,det_w_d); *temp_capa_fix=
14、0;/* 查表法求对数*/ LOG2FORFIX(tmp.re, det_w,det_w_d, temp_capa_fix, temp_capa_fix_w, temp_capa_fix_w_d);/* 计算得到的容量累积*/ capacitymimo_idx= Add(AdjustFIX(*temp_capa_fix,temp_capa_fix_w, temp_capa_fix_w_d,capacity_w,capacity_w_d),capacitymimo_idx); /* 选择最大容量的天线配置为系统下一帧的天线数*/ for (mimo_idx=0;mimo_idxtemp) tem
15、p = capacitymimo_idx; *mimo_indicator= mimo_idx; 2.3 各个子模块2.3.1 有效信道计算模块根据输入的mimo_index值来计算有效信道输入、输出参数位宽参见上一节。不管信道是几维的,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_i
16、dx,nr_idx,k; P_Complex t1,t2;/*分别根据输入的mimo_index不同,对频域信道矩阵做不同处理*/ if (mimo_index=0) for (nt_idx=0;nt_idx4;nt_idx+) for (nr_idx=0;nr_idxnr;nr_idx+) for (k=0;kN;k+) h_effknr_idxnt_idx = AdjustPC(h_chknr_idxnt_idx,input_w, input_w_d,h_eff_w, h_eff_w_d); *eff_nt=4; /mimo_index为1时,0、1两根天线上的数据相加 else if (
17、mimo_index=1) for (nr_idx=0;nr_idxnr;nr_idx+) for (k=0;kN;k+) h_effknr_idx0 = P_Complex_Add( h_chknr_idx0 , h_chknr_idx1 ); h_effknr_idx0 = AdjustPC(h_effknr_idx0,input_w+1,input_w_d,h_eff_w, h_eff_w_d); h_effknr_idx1 = AdjustPC(h_chknr_idx2,input_w,input_w_d,h_eff_w, h_eff_w_d); h_effknr_idx2 = Adj
18、ustPC(h_chknr_idx3,input_w,input_w_d,h_eff_w, h_eff_w_d); *eff_nt=3; /mimo_index为1时,0,1两根天线上的数据相加,2、3两根天线上的数据相加 else if (mimo_index=2) / mimo_index = 7 for (nr_idx=0;nr_idxnr;nr_idx+) for (k=0;kN;k+) h_effknr_idx0 = P_Complex_Add( h_chknr_idx0 , h_chknr_idx1 ); h_effknr_idx0 = AdjustPC(h_effknr_idx0
19、,input_w+1,input_w_d,h_eff_w, h_eff_w_d); h_effknr_idx1 = P_Complex_Add( h_chknr_idx2 , h_chknr_idx3 ); h_effknr_idx1 = AdjustPC(h_effknr_idx1,input_w+1,input_w_d,h_eff_w, h_eff_w_d); *eff_nt=2; /mimo_index为1时,0,1, 2、3两根天线上的数据相加 else if (mimo_index=3) / mimo_index = 10 for (nr_idx=0;nr_idxnr;nr_idx+
20、) for (k=0;kN;k+) t1 = P_Complex_Add( h_chknr_idx0 , h_chknr_idx1 ); t2 = P_Complex_Add( h_chknr_idx2 , h_chknr_idx3 ); h_effknr_idx0 = P_Complex_Add(t1, t2 ); h_effknr_idx0 = AdjustPC(h_effknr_idx0,input_w+2,input_w_d,h_eff_w, h_eff_w_d); *eff_nt=1; else printf(Wrong mimo_index in eff_ch_); return;
21、2.3.2 矩阵相乘矩阵matrixB和矩阵matrixC相乘,并将结果保存在matrixA中变量名位宽说明matrixB(18,8)在调用的时候为信道矩阵HimatrixC(18,8)Hi的共轭转置matrixA(18,4)Hi*Hivoid P_Matrix_Multiply(P_Complex * matrixA, P_Complex * matrixB, P_Complex * matrixC, int input_w, int input_w_d, int matrix_a_w, int matrix_a_w_d, int row, int column, int same_para
22、meter ) /FILE* fptest=fopen(f:fix.txt,at+); int i,j,k; P_Complex * move_pointerA; const P_Complex * move_pointerB; const P_Complex * move_pointerC; memset(matrixA,0,sizeof(P_Complex)*row*column); for(i=0;irow;i+) move_pointerB=matrixB+i*same_parameter; for(j=0;jcolumn;j+) move_pointerA=matrixA+i*col
23、umn+j; move_pointerC=matrixC+j; for(k=0;ksame_parameter;k+) *move_pointerA=P_Complex_Add(*move_pointerA,P_Complex_Multiply(*(move_pointerB+k),*(move_pointerC+k*column); *move_pointerA=AdjustPC(*move_pointerA,input_w*2+2,input_w_d*2,matrix_a_w,matrix_a_w_d); 2.3.3 矩阵行列式行列式是用递归的方法来求,递归过程中所有中间结果位宽统一调整为
24、(18,8)P_Complex P_Matrix_Determinant(P_Complex * matrix, int eff_nt, int input_w, int input_w_d, int det_w, int det_w_d) P_Complex * matrixA = matrix; P_Complex determinant;/根据有效信道数来确定矩阵的维数 switch (eff_nt) case 1: determinant = AdjustPC(*matrixA,input_w,input_w_d,det_w,det_w_d); break; case 2: deter
25、minant = P_Matrix_Determinant_Two(matrixA,input_w,input_w_d,det_w,det_w_d); break; case 3: determinant = P_Matrix_Determinant_Three(matrixA, input_w,input_w_d,det_w,det_w_d); break; case 4: determinant = P_Matrix_Determinant_Four(matrixA, input_w,input_w_d,det_w,det_w_d); return determinant;/ N = co
26、lumn 二阶行列式,对角线相乘得到P_Complex P_Matrix_Determinant_Two(P_Complex * matrix, int input_w, int input_w_d, int det_w, int det_w_d) P_Complex determinant = 0,0; P_Complex temp1,temp2; temp1 = P_Complex_Multiply(*(matrix), *(matrix+3); temp2 = P_Complex_Multiply(*(matrix+1), *(matrix+2); determinant = P_Com
27、plex_Minus( temp1 , temp2 );/ 调整行列式位宽为啊(18,8) determinant = AdjustPC(determinant,input_w*2,input_w_d*2,det_w,det_w_d); return(determinant);/ N = column 三阶行列式,利用二阶行列数递归得到P_Complex P_Matrix_Determinant_Three(P_Complex * matrix, int input_w, int input_w_d, int det_w, int det_w_d) int i; int N=3; P_Complex tmp; P_Complex determinant = 0,0; P_Complex * matrix_part; matrix_part = (P_C
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1