声明,此文仅代表目前我自己的理解,可能有错(几率还挺大)
1,SDR的基本架构,LMS7002M 射频收发芯片,经过混频后到达中频IF,这是通过高速ADC采样,这个就是采样率但是这时数据量非常大,不适合进入PC运算,于是通过 FPGA 的 DDC 数字下变频技术把ADC数据采样率下降到基带可以处理的范围,例如几兆并且,DDC模块出来的数据是 IQ 信号流,所以在PC上面处理的数据就是比如GRC模块的32k采样率,其实应该是 32K IQ数据流通过USB送到SDR硬件的FPGA做DUC数字上变频的。
2,LimeSuite https://github.com/myriadrf/LimeSuite
首先需要的是驱动,linux或者window平台通过USB收发数据,命令是什么,包格式是什么等这些是官方自己定义并且做好的,这个就是 LimeSuite 了。编译安装之后提供了一个动态库,可以用C++语言直接写程序收发数据,可以直接设置频率等模块参数,也就是说,水平够的话不需要 gnuradio,可以自己直接用c++写数字信号处理软件,因为我们可以设置射频参数,可以收发IQ数据流,这就完全足够了,参考LimeSuite 的 example 下面有例子。
3,之前也说过了,limesdr是新的模块,其他现有的SDR软件目前还没有(有的已经开始支持了),最简单的办法就是模拟一个现成的接口,limesdr选择了 soapysdr 通用接口,这样一来,其他SDR软件看起来就是一个支持soapy接口的硬件而已,他不需要管你是什么,这个接口的实现是在 LimeSuite里面做了。
4,gunradio 是一个通用的数字信号处理软件,运行在pc上,处理fft等算法,数字解码算法。但是他是不涉及具体的硬件的。那么怎么把实际的sdr硬件的数据流导入到 gunradio 中,方法同样很简单,做一个中间层转换就可以了。在 gnuradio 中是通过模块的形式出现,需要实现一个外部模块,包含 sink 和 source,这样 sdr硬件是数据流就可以通过这个转换层模块导入到 gnuradio了。所以各个厂商,其实都需要实现这么一个模块,从而实现和 gnuradio通讯。这个项目的地址在 https://github.com/myriadrf/gr-limesdr ,一般 gr- 开头的就是这类模块了,或者通过 gr-osmocom 访问 soapy接口的形式在 gnuradio 上使用,其实原理都是一样的。如何写这个模块,有一个简单的教程,可以搜索 gr-howto-write-a-block ,有翻译版,对应的软件可以在 gnuradio下载源代码的地方下载。C++编程,需要点功底。
就这样,整个脉络都清晰了。
如果对硬件感兴趣,可以看原理图
如果对FPGA处理数字信号感兴趣,可以看FPGA的代码
如果对USB和 LMS7002M 感兴趣,可以看 LimeSuite 代码
如果想自己学习处理数字信号,可以学习 LimeSuite 里面直接调用接口来处理。
如果想自己学习处理数字信号,可以学习 gnuradio 源代码,有些模块代码不多,但是背后的原理要学习好久。
如果你想自己设计一个SDR
1,射频部分其实没有要求,送到PC处理的是 IQ 数据流,只要能实现这个就行。
2,和PC的接口,可以是 USB,可以是其他接口。不过速度有点要求,1M采样率就需要 4MB/S的数据速率。
3,自己实现操作射频的函数接口,还有数据流的接口,通讯协议自己定,能用就行。
4,自己实现gnuraio模块,或者实现 soapy接口,或者模拟其他接口。
全部做完之后,一块 SDR 就完成了。不过难度之高可想而知。