转自:meteor,
很多研究认知的朋友都将usrp_spectrum_sense 作为频谱感知的原型程序,以前我也粗略的看了一下,这两天看到一些这方面的问题,所以我详细的阅读了该程序。下面我将的理解和大家分享,有不对的地方还希望大家提出指正。 首先需要描述的是该程序的执行过程,我用一个简单的框图表示一下 有些细节,以及参数设置,可以看源程序,这里只是写出了主要功能的模块 工作流程大致为 usrp 按照步进调谐中心频率,而调谐过程是由数据统计模块来控制的,然后加窗完成FFT,将FFT变换后的值输入到数据统计模块,用于处理频域数据,同时将处理的结果封装到msg 里面以供使用。 这里面最核心的模块应该是数据统计模块 stats = gr.bin_statistics_f(self.fft_size, self.msgq,self._tune_callback, tune_delay,dwell_delay) 里面的几个参数的意思为: self.fft_size FFT 变换的长度 self.msgq 消息模块,其实就是一个链表了 self._tune_callback, 是USRP调谐频率过程的一个程序句柄,有了它,stats就可以调用调谐子程序了 tune_delay 可以理解为调谐命令到子板的时间+实际调谐时间+调谐后的第一帧数据的到达时间 dwell_delay 在一个频率点上的停留时间 gr.bin_statistics_f的工作过程可以参照 gr_bin_statistics_f.cc 其主要工作过程其实是一个状态机 首先初始化,然后就进入一个调谐,驻留的循环过程当中,中间将需要的统计数据封装到消息队列msg中,消息队列包括,中心频率fft长度,以及最后计算出来的信息 需要解释的就是这个数据的统计过程是如何实现的,以一个示意的例子来说明吧 比如此时中心频率在f 上,fft 为4点的 f1=f-3/2df, f2=f-1/2df, f3=f1+1/2df, f4=f+3/2df 在一个驻留时间的信号幅度用矩阵表示如下,假设驻留时间是三组信号 A11 A12 A13 A14 A21 A22 A23 A24 A31 A32 A33 A34 处理后的结果是 Max(A11,A21,A31) Max(A12,A22,A32) Max(A13,A23,A33) Max(A14,A24,A34)