此过程分为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. Sci-Hub十岁生日解封,超233万新论文被放出!总数达到近8800万
  2. linux sftp没有读写权限,sftp服务器上的Linux权限问题
  3. Bootstrap3 表格-带边框的表格
  4. C++中的空类,编译器默认可以产生哪些成员函数
  5. 软件测试作业8:分析自动售货机软件例子生成的判定表图例
  6. 大数据小白系列——HDFS(1)
  7. 《我的视频我做主:Premiere Pro CS5实战精粹》——第一部分 基础篇 第1章 非线性剪辑基础 1.1 认识非线性剪辑...
  8. 牛客网-数据结构笔试题目(六)-最近点对问题求解思路
  9. React开发(247):react项目理解 学会debugger
  10. Windows之node.js安装
  11. iOS中网络请求的使用(GET请求与POST请求)
  12. 数据库的设计及经典案例
  13. 中国心率监测器行业市场供需与战略研究报告
  14. Java--JSON嵌套JSON中带‘\‘字符的解决方式
  15. 如何做一个基于微信小说小程序系统毕业设计毕设作品
  16. 软件测试中的正交缺陷分析总结,正交缺陷分类(ODC)流程简介及应用经验分享(上)...
  17. Exception at 0x7fefd73a49d, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continue
  18. 引用Microsoft.Office.Interop.Excel的解决方法
  19. php 提取数字,php如何实现只取数字的功能
  20. 远程入侵原装乘用车(中)

热门文章

  1. SQL--乱七八糟问题
  2. IOS学习之路二十四(custom 漂亮的UIColor)
  3. 三星note10+5G (韩版9825)DL模式提示OEM Lock: ON(U)的解决方案
  4. 百度22篇!入选CVPR 2020论文涵盖全视觉领域!
  5. mysql not exists 用法_mysql 子查询 exists 和 not exists使用方法和实例
  6. 生气后有太多的负面情绪怎么办?5个好方法帮你来排解!
  7. 使用URDF创建机器人3D仿真模型
  8. 鸿蒙HarmonyOS关于NFC碰一碰拉起FA
  9. 这才是B站的正确打开方式!
  10. 区块链和物联网结合的挑战和前景