|
gnuradio的分析py文件笔记
https://wiki.gnuradio.org/index.php/Tutorials
本示例演示了如何使用称为自适应线路增强器的结构将自适应滤波器应用于信号分离
https://blog.csdn.net/jxwxg/article/details/53026659
如果想要学习SDR的基本原理等,建议先学习srsLTE平台。srsLTE平台代码量较小,代码书写规范,而且项目性能稳定,便于调试
srsLTE开源了srsEPC,即核心网功能,且一如往常的代码简洁,配置简单,使用方便,到目前为止,既可以通过srsLTE搭建完整的LTE网络
https://github.com/srsran/srsRAN
接下来研究啥:
为了接入真实数据 硬件的
gnuradio的 输入对象:波形生成 文件
GNU Radio非图形化界面提供了File Sink block,可以把通信数据存储下来
Rational resampling 合理的重采样 Interpolation factor差值因子
Decimation factor 抽取因子
自适应滤波:lms_filter_ff
self.adapt_lms_filter_xx_0 = adapt.lms_filter_ff(True, num_tap, mu, 0, 1, is_adapt, False, reset)
https://github.com/ziyuanjun/gr-xzyblocks
Using GNU Radio to realize signal processing and research
https://github.com/kit-cel/gr-radar
GNU Radio Radar Toolbox
https://github.com/DrYerzinia/gr-pulse
https://mimognuradio.wordpress.com/2018/08/08/final-week-summary-of-the-project/
GNU Radio 中巧妙地设计了一套零拷贝循环缓存机制,保证数据在 block 之间高效的流动
我们发现同样的频率下,正弦函数和余弦函数是正交的啊,那我们不就可以把一组数据调制在正弦信号上,一组数据调制在余弦信号上了吗
我们再一细想,诶,正弦信号不也是余弦信号吗,只不过差了九十度的相位。
那还有什么是差九十度的相位的呢?1向量和i向量嘛,那我们不就可以很方便的用一个复数来表示两个正交的量了吗?
所以其实我们就是把正弦和余弦这一组正交基换成了1和i这一组正交基了而已
记住一点,从USRP设备传输给电脑的IQ数据已经是基带信号了,也就是中心频率是0Hz,
因为这个信号是在通过设备下变频处理之前已经进行了AD转换的基带信号
可视化是:用py的qt做的 :from PyQt5 import Qt, QtCore
from gnuradio import analog
from gnuradio import blocks
包裹一下 变窗体:
self._qtgui_time_sink_x_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0.pyqwidget(), Qt.QWidget)
blocks.throttle(gr.sizeof_gr_complex*1, samp_rate,True)
信号源
analog.sig_source_c(samp_rate, analog.GR_COS_WAVE, 1000, 1, 0)
analog.sig_source_f(samp_rate, analog.GR_SIN_WAVE, freq, 1, 0)
USRP X310支持两收两发(或者4个接收),频率覆盖DC到6GHz,带宽最大达160M,
可供选择的高速接口包括(PCIe,万兆口,千兆口), 以及一个资源丰富,用户可编程的Kintex7 FPGA组成
每个通道提供高达100 MHz的瞬时带宽,并涵盖了从10MHz到6 GHz的扩展频率范围。
USRP N310基带处理器采用Xilinx公司的zynq-7100 SOC,
他提供了丰富的可编程的FPGA用于实时性要求高的和低延迟处理以及双核心的ARM CPU单机操作。
用户可以部署应用程序在预装的Linux嵌入式操作系统
由于USRP E系列自带ARM处理器,所以可以独立运行,非常适合如外场测试的相关场景
最大支持160M(UBX)或者120M(WBX CBX SBX )带宽
最高支持覆盖频率到6GHz
关于组件调度这块,目前研究不深,只能浅显谈谈
内核为每个组件block创建一个线程,从而达到多线程并行运行效果
多线程之间采取优先级调度或者轮询调度机制,系统默认为轮询调度机制
内核采用了基于缓冲区的组件间通信机制,为每个组件分配了输入缓冲区和输出缓冲区
采样率变换,是软件无线电中的一个重要概念。
一般来说,接收端射频器件以较高的采样率进行采样,可以使被采样带宽增加,而且有利于降低量化噪声,
但高采样率会使采样后的数据速率很高,
例如,接收卫星信号的采样率可达500MSPS,每秒采500M个样点,数据规模庞大,
容易导致后续信号处理的负担加重,
因此,非常有必要在ADC后进行降速处理,自然也就涉及到采样率的变换问题
采样率的变换,通常分为内插(也称上采样)和抽取(也称下采样)
内插是指提高采样率以增加数据样点的过程;抽取是指降低采样率以去除多余数据样点的过程
结论
插值后信号的频谱为原始信号频谱经过I倍“压缩”得到,抽取后的信号频谱以原始信号频谱的D倍进行“展宽”
吃透gnuradio的设计模式:
现在的雷达仿真系统大多基于单线程技
术。随着仿真系统越来越复杂,基于单线程的雷达仿真系统的运行速度也越来越慢。
仿真系统的运行速度也是影响雷达系统设计、研发和测试的重要因素,因此,雷达仿
真系统的运行速度越来越受到重视
单线程的设计框架很容易满足仿真系统对仿真时
序的严格要求,但是这样的仿真系统并没有充分利用现代计算机多核的硬件资源优势
GNU Radio 的另一个优点是其每一个信号处理模块都是基于一个线程的。这样搭建的软件系统是基于多线程的
NumCpp(C++版本Numpy)使用笔记
在开源的 C++矩阵运算库中,线性代数运算库 Armadillo 具有运算性能高
与使用方便等优点。Armadillo 矩阵库支持 vector、matrix 及 cube 类型,同时也支持
单精度浮点、双精度浮点及复数等数值类型。Armadillo 矩阵库包含常用的三角运算
及统计功能函数。另外,为了尽可能地减少中间临时变量的产生,其优化了运算的时
间和空间效率
利用 Armadillo 库编写的矩阵运算代码与在 MATALAB 上编写的程序
在形式上非常相似,这样的特点使得从 MATALAB 程序向 C/C++程序的转换变得很
便利。同时,Armadillo 矩阵库具有跨平台的优势
为了确保图形化雷达仿真系统可以稳定正常地循环运行,必须为此雷达仿真系统
建立数据反馈机制,实现雷达仿真系统闭环的运行机制
传输机制将此动态内存的地址传输给模块2
基于上述问题,本文提出通过判断仿真系统模块的输入和输出是否满
足要求来实现对仿真模块的控制,从而进一步实现对基于多线程模式
下的图形化雷达仿真系统的执行顺序控制
这样通过模块的输入输出数据的使用情况来控制此模块是否需要执行,
从而实现对雷达仿真系统所有模块执行顺序的控制和雷达仿真系统的时序控制
只有在仿真模块的输入有合适的数据且输出数据被使用的情况下模块才会被执行
self.blocks_throttle_0 = blocks.throttle(gr.sizeof_gr_complex*1, samp_rate,True)
self.blocks_throttle_0 = blocks.throttle(gr.sizeof_float*1, samp_rate,True)
import time
time.sleep(3)
assert 0 == 1, "停"
最近在学习c++矩阵库,顺便把vibe算法用c++矩阵库armadillo做了一遍。
虽然效果不理想,但是借这个机会算是把armadillo、Eigen、numcpp等几个注明的矩阵库都大致学习了一遍,
还是很有收货的。反观效果发现,在使用armadillo库实现算法时,虽然也设置了并行处理(#define use_openmp),
但并行效果并不理想,每帧处理时间达到150多ms,CPU利用率只有44%左右。
反而用最原始的for循环,开启openmp并行化之后只需要20ms以内就可以处理一帧,而且效果很好,CPU利用率达到了88%。
set_iq_balance_mode(2, 0)
set_iq_balance_mode(int mode, size_t chan=0)
/*!
* Set the RX frontend IQ balance mode.
*
* \param mode iq balance correction mode: 0 = Off, 1 = Manual, 2 = Automatic
* \param chan the channel index 0 to N-1
*/
virtual void set_iq_balance_mode( int mode, size_t chan = 0 ) = 0;
class OSMOSDR_API source : virtual public gr::hier_block2
self.freq_res = freq_res = samp_rate/float(packet_len) 这是干什么的? 采样率/长度
尽量去搞懂一个个点
死磕 static_target_simulator_cc_impl的实现
看看(make里创建的对象)裸指针指向的对象类型:N2gr9top_blockE [jjj没注意到的]该类是gr::hier_block2的子类
sig_source_impl.h --> sync_block --> block --> basic_block
top_block.h --> hier_block2 --> basic_block
flat_flowgraph.cc
flowgraph.cc
hier_block2.cc
hier_block2_detail.cc
明明有这个文件:
/home/jiang/c_c++_works/gnuradio/gnuradio-runtime/lib/hier_block2.cc
/home/jiang/c_c++_works/gnuradio/gnuradio-runtime/include/gnuradio/top_block.h
/home/jiang/c_c++_works/gnuradio/gnuradio-runtime/lib/top_block.cc
/home/jiang/c_c++_works/gnuradio/gnuradio-runtime/python/gnuradio/gr/top_block.py
/home/jiang/c_c++_works/gnuradio/gnuradio-runtime/lib/flat_flowgraph.cc
// 32Kbyte buffer size between blocks
#define GR_FIXED_BUFFER_SIZE (32 * (1L << 10))
static const unsigned int s_fixed_buffer_size = GR_FIXED_BUFFER_SIZE;
大型项目管理: https://zhuanlan.zhihu.com/p/470681241 cmake还是不够熟悉与深入
流程:
[py]类的构造--> [py]gr.top_block.__init__(self, "jiang_debug_tools") -->
[py]self._impl = top_block_swig(name) --> [py]_runtime_swig.top_block_swig(name) -->
top_block.i文件的%rename(top_block_swig) make_top_block;
gr::top_block_sptr make_top_block(const std::string name) -->
[c++]top_block.cc里的make_top_block()方法 其他block都是make与work方法的
得到 top_block_sptr 就是python里的self._impl -->
[top_block]的构造,会先构造父类hier_block2,还会构造top_block_impl(this)
top_block_impl (/home/jiang/c_c++_works/gnuradio/gnuradio-runtime/lib/top_block_impl.h)这里面涉及了线程的调度
scheduler_tpb.h
scheduler_table
看这个:https://blog.csdn.net/u012572543/article/details/22800435
https://gnuradio-manual-zh.readthedocs.io/zh/latest/note-gnuradio/index.html GNURadio源码手册
个人主页:https://www4.comp.polyu.edu.hk/~cszan/
https://www.gnuradio.org/blog/2017-01-05-buffers/
>>> import pmt
>>> P = pmt.from_long(23)
>>> type(P)
block_executor();
enum state {
READY, // We made progress; everything's cool.
READY_NO_OUTPUT, // We consumed some input, but produced no output.
BLKD_IN, // no progress; we're blocked waiting for input data.
BLKD_OUT, // no progress; we're blocked waiting for output buffer space.
DONE, // we're done; don't call me again.
};
/home/jiang/c_c++_works/gnuradio/gnuradio-runtime/include/gnuradio/buffer.h
/home/jiang/c_c++_works/gnuradio/gnuradio-runtime/lib/buffer.cc
缓冲区管理是如何做的?
重新安装gnuradio: gnuradio-config-info --prefix 看路径前缀 这个很重要
cmake -DENABLE_GR_UHD=ON .. 可以不开启uhd cmake ..
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j8
sudo make install
sudo ldconfig
先卸载: sudo make uninstall
flowgraph的数据结构:
1 endpoint : block + port 很多endpoint的:endpoint_vector_t ----> msg端点
2 edge: 源endpoint到 目标endpoint 很多边的: edge_vector_t ----> msg边
3 flowgraph : connect两个端点 validate() edges()
general_work(输出个数, 多个输入个数, 多个输入的buffer读指针, 多个输出的buffer写指针)
|
|