此过程分为4步:
1、各UE发送代表频谱感知值的序列到BS;
2、BS获取代表频谱感知值的序列,然后和本地ZC序列做相关得出频谱感知值;
3、BS汇总各UE结果,决策出最佳值,通过下发RAR的过程将最佳值下发到各UE;
4、UE接收BS通过RAR过程下发的决策值,然后UE和BS切换到最佳频点进行通信。

ZC序列产生和“相关”操作的MATLAB仿真

产生ZC序列,然后根据UE的频谱感知值对该序列进行循环移位产生移位后的ZC序列,将这两个序列进行“相关”运算,得到的结果中最大值对应的点即为频谱感知值。
为了避免错误,减小传输带来的误差,将256分为16段,每段长度为16,每段的中心代表频谱感知值,这样该序列可以代表4段频谱的忙闲状态。例如,频谱感知值为0110(2、3段为占用,1、4段为空闲),移位值即为(6*16+8=104),在接收端可以采用相关操作计算移位值,然后将移位值除以16得到频谱感知值。
这样的好处就是若计算的移位值有偏差(计算为106),最后的频谱感知值也基本不会出现误差(106/16=6)。

clc
close all
clear alldelay = 6*16+8;
u = 1;Nzc = 256;
ZC = zeros(1, Nzc);
ZC2ShortReal = zeros(1, Nzc);
ZC2ShortImag = zeros(1, Nzc);
for k=1:NzcZC(k) = 400 * exp(-j*pi*u*k*(k+1)/Nzc);%ZC序列ZC2ShortReal(k) = real(ZC(k)) + (real(ZC(k)) < 0)*2^16 ;ZC2ShortImag(k) = imag(ZC(k)) + (imag(ZC(k)) < 0)*2^16;
end
% fid = fopen('a.txt','w+');
% fprintf(fid, '%s\n', dec2hex(round(ZC2ShortReal)));%, dec2hex(round(ZC2ShortImag)));
% fclose('all');
% x = complex(2*round(rand(1,len))-1,2*round(rand(1,len))-1);
ZC2ShortReal = dec2hex(round(ZC2ShortReal));%十六进制
ZC2ShortImag = dec2hex(round(ZC2ShortImag));%十六进制
y = fft(conj(ZC(end:-1:1)));
Tx = [ZC(end-delay+1:end), ZC(1:end-delay)] + randn(1, Nzc);t = ifft(fft(Tx).*((y)));
t = abs(t).^2;
plot(t);
[pks,locs] =  max(t);
hold on
plot(locs,t(locs),'.r','markerfacecolor',[1 0 0]);
str = ['(' num2str(locs) ',' num2str(t(locs)) ')'];
text(locs,t(locs),str)    % 在(x(t),y(t))坐标处放置文字说明
hold off

其中,ZC2ShortReal和ZC2ShortImag是生成的CCS的ZC序列格式,如下:

SHORT ZCSequence[256*2] = {0x0190, 0xFFF6,0x018F, 0xFFE3,0x018C, 0xFFC5,0x0184, 0xFF9F,0x0175, 0xFF70,0x015C, 0xFF3B,0x0135, 0xFF02,0x00FE, 0xFECB,0x00B4, 0xFE9B,0x0058, 0xFE7A,0xFFEC, 0xFE70,0xFF79, 0xFE87,0xFF0A, 0xFEC5,0xFEAE, 0xFF2A,0xFE78, 0xFFB2,0xFE78, 0x004E,0xFEB9, 0x00E6,0xFF3B, 0x015C,0xFFEC, 0x0190,0x00AB, 0x016A,0x0147, 0x00E6,0x018F, 0x001D,0x0161, 0xFF43,0x00BD, 0xFE9F,0xFFCF, 0xFE73,0xFEEC, 0xFEDE,0xFE74, 0xFFC5,0xFEA9, 0x00CE,0xFF83, 0x017C,0x00A2, 0x016E,0x0172, 0x0099,0x0172, 0xFF67,0x0090, 0xFE8B,0xFF4C, 0xFE9B,0xFE7C, 0xFF9F,0xFEBF, 0x00EE,0xFFF6, 0x0190,0x013B, 0x00F6,0x017F, 0xFF8C,0x0074, 0xFE81,0xFEFB, 0xFED1,0xFE76, 0x0044,0xFF79, 0x0179,0x010D, 0x0128,0x0182, 0xFF95,0x0044, 0xFE76,0xFEB3, 0xFF22,0xFEB3, 0x00DE,0x0058, 0x0186,0x018D, 0x0031,0x00AB, 0xFE96,0xFED8, 0xFEF3,0xFEAE, 0x00D6,0x007D, 0x017C,0x018E, 0xFFD9,0x0027, 0xFE72,0xFE7E, 0xFF95,0xFF5E, 0x016E,0x0157, 0x00CE,0x00EE, 0xFEBF,0xFED1, 0xFEFB,0xFEEC, 0x0122,0x011B, 0x011B,0x011B, 0xFEE5,0xFEDE, 0xFEEC,0xFEFB, 0x012F,0x0141, 0x00EE,0x00CE, 0xFEA9,0xFE92, 0xFF5E,0xFF95, 0x0182,0x018E, 0x0027,0xFFD9, 0xFE72,0xFE84, 0x007D,0x00D6, 0x0152,0x010D, 0xFED8,0xFE96, 0xFF55,0xFFCF, 0x018D,0x0186, 0xFFA8,0xFF22, 0xFEB3,0xFF22, 0x014D,0x018A, 0x0044,0xFF95, 0xFE7E,0xFED8, 0x010D,0x0179, 0x0087,0xFFBC, 0xFE76,0xFED1, 0x0105,0x017F, 0x0074,0xFF8C, 0xFE81,0xFF0A, 0x013B,0x0190, 0x000A,0xFF12, 0xFEBF,0xFF9F, 0x0184,0x0165, 0xFF4C,0xFE8B, 0xFF70,0x0099, 0x0172,0x0099, 0xFE8E,0xFE92, 0x00A2,0x017C, 0x007D,0xFF32, 0xFEA9,0xFFC5, 0x018C,0x0122, 0xFEEC,0xFE73, 0x0031,0x0161, 0x00BD,0xFF43, 0xFE9F,0xFFE3, 0x018F,0x00E6, 0xFEB9,0xFE96, 0x00AB,0x0190, 0x0014,0xFEA4, 0xFF3B,0x00E6, 0x0147,0xFFB2, 0xFE78,0xFFB2, 0x0188,0x00D6, 0xFEAE,0xFEC5, 0x00F6,0x0179, 0xFF79,0xFE70, 0x0014,0x0186, 0x0058,0xFE9B, 0xFF4C,0x0135, 0x00FE,0xFF02, 0xFECB,0x00C5, 0x015C,0xFF70, 0xFE8B,0x0061, 0x0184,0xFFC5, 0xFE74,0x001D, 0x018F,0xFFF6, 0xFE70,0x0000, 0x0190,0x0000, 0xFE70,0x000A, 0x0190,0xFFE3, 0xFE71,0x003B, 0x018C,0xFF9F, 0xFE7C,0x0090, 0x0175,0xFF3B, 0xFEA4,0x00FE, 0x0135,0xFECB, 0xFF02,0x0165, 0x00B4,0xFE7A, 0xFFA8,0x0190, 0xFFEC,0xFE87, 0x0087,0x013B, 0xFF0A,0xFF2A, 0x0152,0x004E, 0xFE78,0x004E, 0x0188,0xFF1A, 0xFEB9,0x015C, 0x00C5,0xFE70, 0xFFEC,0x016A, 0xFF55,0xFF1A, 0x0147,0x001D, 0xFE71,0x00BD, 0x0161,0xFE9F, 0xFF43,0x018D, 0xFFCF,0xFEDE, 0x0114,0x003B, 0xFE74,0x00CE, 0x0157,0xFE84, 0xFF83,0x016E, 0xFF5E,0xFF67, 0x0172,0xFF67, 0xFE8E,0x0175, 0x0090,0xFE9B, 0x00B4,0x0061, 0xFE7C,0x00EE, 0x0141,0xFE70, 0xFFF6,0x00F6, 0xFEC5,0x0074, 0x017F,0xFE81, 0xFF8C,0x012F, 0xFEFB,0x0044, 0x018A,0xFE87, 0xFF79,0x0128, 0xFEF3,0x006B, 0x0182,0xFE76, 0xFFBC,0x00DE, 0xFEB3,0x00DE, 0x014D,0xFE7A, 0x0058,0x0031, 0xFE73,0x016A, 0x00AB,0xFEF3, 0x0128,0xFF2A, 0xFEAE,0x017C, 0xFF83,0x0027, 0x018E,0xFE72, 0xFFD9,0x006B, 0xFE7E,0x016E, 0x00A2,0xFF32, 0x0157,0xFEBF, 0xFF12,0x0105, 0xFED1,0x0122, 0x0114,0xFEE5, 0x011B,0xFEE5, 0xFEE5,0x0114, 0xFEDE,0x012F, 0x0105,0xFF12, 0x0141,0xFEA9, 0xFF32,0x00A2, 0xFE92,0x0182, 0x006B,0xFFD9, 0x018E,0xFE72, 0x0027,0xFF83, 0xFE84,0x0152, 0xFF2A,0x0128, 0x010D,0xFF55, 0x016A,0xFE73, 0xFFCF,0xFFA8, 0xFE7A,0x014D, 0xFF22,0x014D, 0x00DE,0xFFBC, 0x018A,0xFE7E, 0x006B,0xFEF3, 0xFED8,0x0087, 0xFE87,0x018A, 0xFFBC,0x0105, 0x012F,0xFF8C, 0x017F,0xFE81, 0x0074,0xFEC5, 0xFF0A,0x000A, 0xFE70,0x0141, 0xFF12,0x0184, 0x0061,0x00B4, 0x0165,0xFF70, 0x0175,0xFE8E, 0x0099,0xFE8E, 0xFF67,0xFF5E, 0xFE92,0x007D, 0xFE84,0x0157, 0xFF32,0x018C, 0x003B,0x0114, 0x0122,0x0031, 0x018D,0xFF43, 0x0161,0xFE9F, 0x00BD,0xFE71, 0xFFE3,0xFEB9, 0xFF1A,0xFF55, 0xFE96,0x0014, 0xFE70,0x00C5, 0xFEA4,0x0147, 0xFF1A,0x0188, 0xFFB2,0x0188, 0x004E,0x0152, 0x00D6,0x00F6, 0x013B,0x0087, 0x0179,0x0014, 0x0190,0xFFA8, 0x0186,0xFF4C, 0x0165,0xFF02, 0x0135,0xFECB, 0x00FE,0xFEA4, 0x00C5,0xFE8B, 0x0090,0xFE7C, 0x0061,0xFE74, 0x003B,0xFE71, 0x001D,0xFE70, 0x000A,0xFE70, 0x0000,0xFE70, 0x0000
};

UE发送频谱感知结果到BS

UE在进行上行同步时,会在第6子帧中发送同步信号到BS,将产生的代表频谱感知值的序列放置在同步序列后面进行发送。

产生代表频谱感知值的序列

在同步函数中,产生代表频谱感知值的序列MTMBitSequence:

SHORT   MTMBitSequence[256*2];
if(STATION_MODE == STATION_UE)MTMBitSequence_Gen(ZCSequence,SpectrumSensingValue, MTMBitSequence);//循环移位产生代表频段质量的ZC序列

其中,MTMBitSequence_Gen函数如下:

/** Input1:ZCSequence        长度为256(INT)的ZC序列,由MATLAB程序产生* Input2:MTMBit            代表各个频段质量的数值,1为好,0为差。例如MTMBit=6(0110),即第2、3段为好,1、4段为差* Output:MTMBitSequence    ZC序列循环移位的结果,移位值为(MTMBit * 16 + 8)
*/
void MTMBitSequence_Gen(SHORT * ZCSequence, UINT MTMBit, SHORT* MTMBitSequence)
{UINT MTMBitValue = MTMBit * 16 + 8;//256=16*16,分为16段,能代表4个频段质量的好坏,x*16 + 8,x代表各频段的占用情况,1为占用,0为空闲 例如x=0110,即第2、3段可用,1、4段不可用UINT i;for (i = 0; i<512; i++){MTMBitSequence[i] = ZCSequence[(256 * 2 - MTMBitValue * 2  +  i) % 512];//循环移位}
}

将序列拷贝到同步信号后面

memcpy(pnRSOut,t_pnFFTOut,4096);
memcpy(pnRSOut+2048,t_pnFFTOut,4096);//接着上一句地址后面拷贝相同的数据,长度为4096字节
#if MTMBitAddif(STATION_MODE == STATION_UE)memcpy(pnRSOut+1024*2*2,MTMBitSequence,1024);   //将MTMBitSequence序列放置到DMRS后面
#endif

BS获取感知结果

BS对同步信号进行分析得到时偏值,然后根据时偏值在对应位置取出代表频谱感知值的序列,最后和本地ZC序列做相关得出频谱感知值。
首先,在初始化中预先对ZC序列进行倒序、共轭和FFT,如下:

void SpectrumSensingInit()
{//ZC序列预倒序、共轭及其FFTINT nLen_ZCSequence = 256;gen_twiddle_fft16x16(g_anDFTGSHBuf256, 256);Bas_Reverse32((int *)ZCSequence,(int *)ZCSequenceReverse,nLen_ZCSequence);//信号预倒序,卷积运算会倒序,但是相关运算不需要倒序,为了利用卷积运算实现相关Bas_CplxConjugate(ZCSequenceReverse,nLen_ZCSequence);//相关运算需要共轭,卷积运算不会共轭DSP_fft16x16(g_anDFTGSHBuf256, nLen_ZCSequence, ZCSequenceReverse, g_nLocalZCSeqFFTOut);//本地ZC序列做256点FFT
}

之后,做相关的代码如下:

UINT t_UserID = t_struMsgMac.m_unMacRecData.m_struMsgULSync.m_uiUserID;
SHORT * RecMTMBitAddr = t_stru_mailbx_sync_cfg.m_pnData + t_UserID*SYNC_SIGNAL_INTERVAL*2 + 1024*2*2 + g_iTimeDelay*2 + 4*2;//加上5*2是为了取数更准确,不加的话偏移量可能存在偏差,但是位于哪个段可以计算正确;加上的话可以准确估计出偏移量,进而得到位于哪个段
if((GetUEMTMMessageFlag[t_UserID] == 0))
{MTMBit[t_UserID] = getMTMBit(RecMTMBitAddr);GetUEMTMMessageFlag[t_UserID] = 1;
}
/** Input1:MTMBitSequenceInput       接收到的序列起始地址* Output:MTMBitValue/16            UE上传的感知结果
*/
UINT getMTMBit(SHORT* MTMBitSequenceInput)//基于接收信号和本地ZC序列计算多窗谱值
{SHORT *t_pnFFTSrcBuf;SHORT *t_pnFFTDstBuf;UINT MTMBitValue = 0;INT t_nFFT = 256;//FFT点数
//  SHORT g_nMTMBitSeqFFTOut[256 * 2];//接收序列256点FFT输出
//  SHORT MulResult[256 * 2];//频域点乘结果SHORT fftResult[256 * 2];//fft结果
//  INT   PowResult[256]={0};//平方结果t_pnFFTSrcBuf = MTMBitSequenceInput;t_pnFFTDstBuf = fftResult;DSP_fft16x16(g_anDFTGSHBuf256, t_nFFT, t_pnFFTSrcBuf, t_pnFFTDstBuf);//接收序列做256点FFTBas_CplxShrMul16(t_pnFFTDstBuf,g_nLocalZCSeqFFTOut,t_pnFFTSrcBuf,12,t_nFFT);//频域点乘//频域点乘后做ifft,等效于时域卷积完成//用fft函数实现ifft,只需要在fft前取共轭,fft后再取共轭,就等效于ifft了Bas_CplxConjugate(t_pnFFTSrcBuf,t_nFFT);DSP_fft16x16(g_anDFTGSHBuf256, t_nFFT, t_pnFFTSrcBuf, t_pnFFTDstBuf);Bas_CplxConjugate(t_pnFFTDstBuf,t_nFFT);//共轭Bas_Pow16s32(t_pnFFTDstBuf, (INT)fftResult, t_nFFT);//求平方  平方结果放在fftResult中是为了少定义一个数组,防止出现错误ti.sysbios.knl.Task: line 360: E_stackOverflow: Task 0xc0ce978 stack overflow.MTMBitValue = Bas_MaxIdx32((INT)fftResult, t_nFFT)+1;//求最大值  索引从0开始,所以需要加1return (MTMBitValue / 16);//看看在哪个段内
}

BS通过下发RAR的过程将决策值发送到UE

BS将决策值t_puiBestCenterFreqInd通过位操作汇合到发送值t_pucSrc 上:

/** Input:t_pucSrc                   对各个数值进行位操作的结果* Input:t_puiFlag                  RAR值(0/1)* Input:t_puiRBStart               该UE的RB起始位置(0/25/50/75)* Input:t_puiRBLen                 改UE的RB长度(25/50/75/100)* Input:t_puiMCS                   MCS值* Input:t_puiBestCenterFreqInd     BS决策好的频谱感知值*/
void DCI_PACK(UCHAR *t_pucSrc, UINT *t_puiFlag, UINT *t_puiRBStart, UINT *t_puiRBLen, UINT *t_puiMCS, UINT *t_puiBestCenterFreqInd)
{   *t_puiFlag      &= 0x3;*t_puiRBStart   &= 0x7F;*t_puiRBLen     &= 0x7F;*t_puiMCS       &= 0x1F;//t_pucSrc[2] t_pucSrc[1] t_pucSrc[0]*(UINT *)(t_pucSrc) = (((*t_puiFlag)<<6) |                          //t_pucSrc[0]的第2位(((*t_puiRBStart) >> 1) | (((*t_puiRBStart)&0x1)<<15)) |    //t_pucSrc[0]的低6位+t_pucSrc[1]最高位((*t_puiRBLen) << 8) |                                      //t_pucSrc[1]低7位((*t_puiMCS) << 19)) |                                      //t_pucSrc[2]高5位((*t_puiBestCenterFreqInd) << 16);                          //放置于t_pucSrc[2]的低3位
}

UE接收BS通过RAR过程下发的决策值

UE从接收值t_pucSrc中通过位操作取出决策值:

/** Input:t_pucSrc                   对各个数值进行位操作的结果* Input:t_puiFlag                  RAR值(0/1)* Input:t_puiRBStart               该UE的RB起始位置(0/25/50/75)* Input:t_puiRBLen                 改UE的RB长度(25/50/75/100)* Input:t_puiMCS                   MCS值* Input:t_puiBestCenterFreqInd     BS决策好的频谱感知值*/
void DCI_UNPACK(UCHAR *t_pucSrc, UINT *t_puiFlag, UINT *t_puiRBStart, UINT *t_puiRBLen, UINT *t_puiMCS, UINT *t_puiBestCenterFreqInd)
{*t_puiFlag = (UINT)(((t_pucSrc[0]) & 0xC0)>>6);*t_puiRBStart = (UINT)((((t_pucSrc[0]) & 0x3F)<<1) |(((t_pucSrc[1]) & 0x80)>>7)); *t_puiRBLen = (UINT)(t_pucSrc[1]&0x7F);*t_puiMCS = (UINT)(((t_pucSrc[2]) & 0xF8)>>3);*t_puiBestCenterFreqInd = (UINT)(t_pucSrc[2] & 0x7);
}

LTE系统调试记录14:频谱感知模块——UE发送感知结果到BS进行处理相关推荐

  1. LTE系统调试记录14:频谱感知模块——UE/BS端采用多窗谱算法测量频谱

    MATLAB中对多窗谱算法仿真 产生DPSS序列,然后分别对接收信号进行加窗,最后取平均得到多窗谱估计值,算法如下: clc; clear all; close all;%对信号采样数据为2048点的 ...

  2. LTE系统调试记录13: LTE物理传输资源(1)-帧结构和OFDM符号

    转载链接:http://blog.csdn.net/m_052148/article/details/51305338 写完上一篇博文<LTE小区搜索-物理小区ID和同步信号PSS.SSS> ...

  3. LTE系统调试记录2:CCS5中graph选项将一个包含复数的数组分实部虚部画出波形

    1.需求 发送端:DSP发送测试正弦波数据gu32DanyinTemp[100]到FPGA,然后FPGA通过DA板输出I路和Q路得正弦波: PS:导出I路或Q路数据,然后只发送I路或Q路的程序请点击这 ...

  4. [调试记录]3288 7.1平台上移植美格 SLM790 4G模块

    [调试记录]3288 7.1平台上移植美格 SLM790 4G模块 一 驱动配置 1.1 PPP 配置 需要配置 Android 内核来支持 PPP 功能,按照以下步骤来配置 PPP 选项 Devic ...

  5. [系统安全] Windbg Preview调试记录

    本文为笔者从零基础学习系统安全相关内容的笔记,如果您对系统安全.逆向分析等内容感兴趣或者想要了解一些内容,欢迎关注.本系列文章将会随着笔者在未来三年的读研过程中持续更新. 前文链接 [系统安全] PE ...

  6. AP6236 WiFi模块调试记录

    AP6236 WiFi模块调试记录 Platform: RK3368 OS: Android 6.0 Kernel: 3.10.0 文章目录 AP6236 WiFi模块调试记录 内核驱动移植 1. 更 ...

  7. 海思NNIE开发(一):海思Hi3559AV100/Hi3519AV100 NNIE深度学习模块开发与调试记录

    海思NNIE开发系列文章: 海思NNIE开发(一):海思Hi3559AV100/Hi3519AV100 NNIE深度学习模块开发与调试记录 海思NNIE开发(二):FasterRCNN在海思NNIE平 ...

  8. 自动驾驶系统中视觉感知模块的安全测试

    本文由吴昊,王浩,苏醒,李明昊,许封元,仲盛联合创作 摘要 近年来,基于深度学习的视觉感知技术的发展极大地促进了车联网领域中自动驾驶的繁荣,然而自动驾驶系统的安全问题频出引发了人们对自动驾驶未来的担忧 ...

  9. 4G模块使用pppd拨号调试记录

    4G模块使用pppd拨号调试记录 1.配置linux内核 2.交叉编译移植ppp拨号程序 3.编写pppd配置脚本 1.配置linux内核 执行make menuconfig 使能USB GSM配置 ...

最新文章

  1. springboot 分层_限量!阿里Spring Boot成长笔记终开源!理论实战满满
  2. 《JavaScript设计模式与开发实践》模式篇(12)—— 装饰者模式
  3. kindeditor-网页文字编辑
  4. Django Channels 入门指南
  5. Web前端开发面试考点指南
  6. “哎哟,真的很快哦” 闪送宣布签约周杰伦为其品牌代言人
  7. spring4.1.3模块的官方说明
  8. 在网页中引用DWG控件,交互绘图,和响应鼠标点击对象的方法
  9. 三个内置模块shutil logging hashlib config
  10. 2022-2028全球民宿行业调研及趋势分析报告
  11. 前端ES6+基础总结
  12. 基于Ribbon界面的MFC应用程序
  13. 有哪些 Java 源代码看了后让你收获很多,代码思维和能力有较大的提升?
  14. 使用ant design遍历多选组件时,选择一个,所有便利的选择器都进行了选择。
  15. async await 处理异步变同步(微信小程序内举例)
  16. 「化学」相对分子质量
  17. ES module与commonjs的区别
  18. 数组下标越界异常是如何产生的
  19. 微信小程序如何使用阿里巴巴字体图标iconfont?
  20. docker container的操作

热门文章

  1. kpu.h文件研究(完善中)
  2. Linux查看主机名
  3. 【一】VVC理论知识之图像块划分
  4. python模板怎么写_模板模式-Python
  5. linux游戏龙芯能玩吗,历时三个月,我终于成功搭建了龙芯平台,竟可以玩cf和lol你敢信?...
  6. 如何批量生成文件夹并命名
  7. 毛玻璃之前世今生之filter与backdrop-filter
  8. 后台流量跑得快?软件厂商和运营商或许在偷着乐
  9. ArcGIS 从DSM中提取高程点
  10. 游戏反外挂技术首次公开