matlab adsb,SDR# (SDRSharp)代码讲解

我认为前面讲的这几种类型的代码里,最重要的有两方面:一个是与硬件驱动交互的部分(这部分上一篇已经大致讲了,另外也可以参考我的另一个HackRF代码讲解系列,会找到很多类似的东西,只不过那里调用的libhackrf.so这里变成了libhackrf.dll),另一个是数字信号处理的代码(包括AM、FM解调,FFT算法,语音降噪算法),我们会先讲这部分代码。

对于SDR领域,最有意义的就是这部分信号处理代码。在过去这类代码往往先在纸面上公式推导,然后在Matlab里做仿真验证。验证完了以后就把这些代码转换为DSP中用的C语言或者改写为VHDL语言在FPGA之类的硬件上实现。

SDR的魅力在于,你在完成初步的公式推导、理解概念后,可以直接把Matlab验证和硬件实现这两步合并起来。把最接近于通信原理中学的那些公式的代码直接生成波形然后用SDR硬件发射出去,或者用最接近原始通信原理公式的代码来解调SDR硬件接收到的波形。这样可以大大节省开发时间,提高灵活性。要知道Matlab代码要改写为C语言已经不怎么方便,如果要写入DSP芯片里可能还要交叉编译,调试起来也不如在电脑上直接运行的代码方便。如果Matlab代码要转为VHDL代码更麻烦。因为VHDL代码描述的是一个数字电路的硬件结构,可能实现个简单的除法在FPGA里就要写一个很复杂的逻辑。前面说的这两种硬件还算是比较容易改写的,如果是ASIC芯片,改写一次还要重新流片,开销巨大。所以对于批量不大,单价价格不敏感,并且灵活性要求高的项目来说,SDR实现可以说是一个非常有前途的方案。

我们先会看一下AmDetector.cs和FmDetector.cs这两个文件(以及它们所调用的其它辅助性.cs文件),他们分别对应于AM解调算法和FM解调算法,这两种算法可以说是很多模拟、数字调制方式的基础。

首先点开AmDetector.cs,可以发现代码很简单。代码中只有一个Demodulate方法,表示解调,它把收到的iq数据(这个iq数据就是从SDR硬件中获取到的原始数据流,至于如何从硬件获得后又调用到这个方法的以后会详细讲)做了取模的运算,然后作为sample,最后sample又送入了audio数组,用于音频输出。

这种AM解调算法是比较基础的算法,是非相干调幅解调算法的一种,我翻译的RTL-SDR Matlab书里也讲到过多次,见原书295页,或者原书232页6.8.2~6.8.3。书里的Magnitude和代码里的Modulus其实是同一个意思,都是取模(或者说取大小),用这种方式达到了低通滤波的效果。

所以这个解调算法的核心就是var sample = iq[i].Modulus()这一行代码。之后就把sample送入audio数组用于收听了。

说句题外话,早期的矿石收音机也是类似原理,只不过用的是硬件元器件处理波形,收到含信息的电磁波后经过二极管检波,其实就是把包络线找到了(相比取绝对值回丢失一些信息,但是做了低通滤波后也差不太多),然后就把这个包络线送入滤波电容,对包络线做进一步平滑处理,有些矿石收音机更简单,连后面的那个滤波电容都不用,因为人耳本身就有低通滤波的功能。

接下来再仔细看下代码,AMDetector.cs还有些其它内容,比如powerThreshold和squelchThreshold。它们两个其实是差不多的东西,可以从powerThreshold被赋值的那句代码看到,只是squelchThreshold的一个线性运算后的产物。它们的作用是,可以让使用者人为设定一个阈值,然后把解调出的sample值和这个阈值比较,如果sample足够大就作为音频数据输出,否则当作噪音去除掉。这个版本的代码里还把sample做了平滑处理(低通滤波,0.99f *avg+ 0.01f*power这句话实现)后再与那个阈值比较。

另外,还有一个小细节初学者可能不理解。因为我们普遍认为无线电信号和解调出的音频信号应该是连续的,实际确实也是连续的,但是电脑在处理时,无法处理一个无限长度的数据,只能对于一定长度的数据分段处理,所以有了length这个参数,并且做了一个循环,在没达到length前,不停地对iq数据做解调操作并不停地把解调出的数据送入audio数组。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值