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数组。
matlab adsb,SDR# (SDRSharp)代码讲解相关推荐
- SDR# (SDRSharp)代码讲解 (二)
程序结构 进入SDRSharp主文件夹,可以发现下面有很多目录,这些目录主要分为3大类. 第一类是只与界面相关的代码,如:FrequencyEdit.FrequencyManager(频率管理界面). ...
- SDR# (SDRSharp)代码讲解 (九)
看完了变量可以看一下三个循环各自代表的功能,来对整个代码结果做一个整体上的理解.首先,最外侧的循环,对应于第48行的for,代表了当前运算对应第几级.第58行,对应于同一级中有几个旋转因子,所以这个循 ...
- matlab高斯滤波跟中值滤波区别,matlab图像滤波处理代码讲解 均值滤波 中值滤波 高斯滤波...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 (1)均值滤波 function imres = averageFilter(im,N) % imres为均值滤波后的矩阵,参数im为图像的路径,N为滤波 ...
- python多目标优化_多目标优化算法(四)NSGA3(NSGAIII)论文复现以及matlab和python的代码...
前言:最近太忙,这个系列已经很久没有更新了,本次就更新一个Deb大神的NSGA2的"升级版"算法NSGA3.因为multi-objective optimization已经被做烂了 ...
- siamfc-pytorch代码讲解(三):demotrack
siamfc-pytorch代码讲解(三):demo&track 一.demo.py 二.track 2.1 init(self, img, box) 2.2 update(self, img ...
- 多目标优化算法(四)NSGA3(NSGAIII)论文复现以及matlab和python的代码
前言:最近太忙,这个系列已经很久没有更新了,本次就更新一个Deb大神的NSGA2的"升级版"算法NSGA3.因为multi-objective optimization已经被做烂了 ...
- HackRF 代码讲解 (一)
本文包括驱动.固件.CPLD代码讲解(也包括gr-osmosdr中的相关部分). HackRF是比较早期的一款SDR设备,凭借其相对低廉的价格加上半双工收发能力,在国内的SDR市场中占比很高.这款设备 ...
- matlab中调用java代码_Matlab中调用第三方Java代码
在Java中采用Matlab JA Builder可以实现调用m文件,采用这样的方式,可在Matlab的M文件中,直接调用Java类.这种方式可以表示为Java--> Matlab( m, Ja ...
- 举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤
MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. 使用MATLAB Coder产生代码的3个步骤:准备用于产生代码的MATLAB算法:检查MATLAB代码的 ...
最新文章
- 全国计算机等级考试题库二级C操作题100套(第42套)
- linux之多线程(1)
- scrapy —— ImagePipeline
- hdu-4080 Stammering Aliens 字符串hash 模板题
- 基于麻雀算法优化的核极限学习机(KELM)回归预测 -附代码
- linux系统expdp按表空间导出,expdp导出是全库吗
- 简单病毒的制作学习分享~
- winpe安装win7教程
- 技术主管和技术总监的区别_技术主管–责任圈
- 查看当前python环境_python-环境
- linux docker启动指定字符集,【字符集】解决docker 容器中中文乱码问题
- 欧洲语言框架A1到C2,开言英语怎么样,学习过一段时间的效果评价
- 如何搭建一个属于自己的直播平台?
- 北大青鸟 ASP.NET(C#) 视频 全32集
- win 10系统电脑键盘突然失灵
- 【电影漫谈】点评好莱坞的导演和模式风格
- 入门级蛋白质结构查看PyMol的使用——用PyMol制作视频movie
- Baxter实战——baxter摇摆起来(打开gazebo进入baxter仿真)
- Ubuntu 修改默认 Python版本
- 10.25 ib api 自定义魔改日记