我认为前面讲的这几种类型的代码里,最重要的有两方面:一个是与硬件驱动交互的部分(这部分上一篇已经大致讲了,另外也可以参考我的另一个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数组。

matlab adsb,SDR# (SDRSharp)代码讲解相关推荐

  1. SDR# (SDRSharp)代码讲解 (二)

    程序结构 进入SDRSharp主文件夹,可以发现下面有很多目录,这些目录主要分为3大类. 第一类是只与界面相关的代码,如:FrequencyEdit.FrequencyManager(频率管理界面). ...

  2. SDR# (SDRSharp)代码讲解 (九)

    看完了变量可以看一下三个循环各自代表的功能,来对整个代码结果做一个整体上的理解.首先,最外侧的循环,对应于第48行的for,代表了当前运算对应第几级.第58行,对应于同一级中有几个旋转因子,所以这个循 ...

  3. matlab高斯滤波跟中值滤波区别,matlab图像滤波处理代码讲解 均值滤波 中值滤波 高斯滤波...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 (1)均值滤波 function imres = averageFilter(im,N) % imres为均值滤波后的矩阵,参数im为图像的路径,N为滤波 ...

  4. python多目标优化_多目标优化算法(四)NSGA3(NSGAIII)论文复现以及matlab和python的代码...

    前言:最近太忙,这个系列已经很久没有更新了,本次就更新一个Deb大神的NSGA2的"升级版"算法NSGA3.因为multi-objective optimization已经被做烂了 ...

  5. siamfc-pytorch代码讲解(三):demotrack

    siamfc-pytorch代码讲解(三):demo&track 一.demo.py 二.track 2.1 init(self, img, box) 2.2 update(self, img ...

  6. 多目标优化算法(四)NSGA3(NSGAIII)论文复现以及matlab和python的代码

    前言:最近太忙,这个系列已经很久没有更新了,本次就更新一个Deb大神的NSGA2的"升级版"算法NSGA3.因为multi-objective optimization已经被做烂了 ...

  7. HackRF 代码讲解 (一)

    本文包括驱动.固件.CPLD代码讲解(也包括gr-osmosdr中的相关部分). HackRF是比较早期的一款SDR设备,凭借其相对低廉的价格加上半双工收发能力,在国内的SDR市场中占比很高.这款设备 ...

  8. matlab中调用java代码_Matlab中调用第三方Java代码

    在Java中采用Matlab JA Builder可以实现调用m文件,采用这样的方式,可在Matlab的M文件中,直接调用Java类.这种方式可以表示为Java--> Matlab( m, Ja ...

  9. 举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤

    MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. 使用MATLAB Coder产生代码的3个步骤:准备用于产生代码的MATLAB算法:检查MATLAB代码的 ...

最新文章

  1. 全国计算机等级考试题库二级C操作题100套(第42套)
  2. linux之多线程(1)
  3. scrapy —— ImagePipeline
  4. hdu-4080 Stammering Aliens 字符串hash 模板题
  5. 基于麻雀算法优化的核极限学习机(KELM)回归预测 -附代码
  6. linux系统expdp按表空间导出,expdp导出是全库吗
  7. 简单病毒的制作学习分享~
  8. winpe安装win7教程
  9. 技术主管和技术总监的区别_技术主管–责任圈
  10. 查看当前python环境_python-环境
  11. linux docker启动指定字符集,【字符集】解决docker 容器中中文乱码问题
  12. 欧洲语言框架A1到C2,开言英语怎么样,学习过一段时间的效果评价
  13. 如何搭建一个属于自己的直播平台?
  14. 北大青鸟 ASP.NET(C#) 视频 全32集
  15. win 10系统电脑键盘突然失灵
  16. 【电影漫谈】点评好莱坞的导演和模式风格
  17. 入门级蛋白质结构查看PyMol的使用——用PyMol制作视频movie
  18. Baxter实战——baxter摇摆起来(打开gazebo进入baxter仿真)
  19. Ubuntu 修改默认 Python版本
  20. 10.25 ib api 自定义魔改日记

热门文章

  1. 多种Java开发工具分享
  2. 机械行业ERP选型的两大原则
  3. ps cs5 gif 动画 分解
  4. eclipse.exe 已停止工作
  5. 关于分贝(dB)单位的解释(理解),关于dB增益是什么意思,他们放大了多少倍?为何他们的计算公式不一样。
  6. 川崎机器人怎样操作返回原点_川崎工业机器人的基本操作
  7. 《这些道理没有人告诉过你》_阅读笔记
  8. LD-Lock(文件夹加密工具) v2.1
  9. Bash 漏洞是什么级别的漏洞,有什么危害,具体如何修复?
  10. 通用PE u盘装Ghost Win7系统