SDR架构 (二) 为什么很多SDR频谱中间有尖峰?

相信大家第一次打开gnuradio看听广播、看频谱的时候,会注意到一个奇怪的现象,明明在频谱中间不该有信号,但是实际看到了一个尖峰。这个尖峰不含带任何信息,并且不管调节到哪个中心频率,这个尖峰都会存在。

这种情况出现在HackRF、LimeSDR上。据说也会出现在E4000版本的RTL-SDR上。

但不会出现在r820t2版本的RTL-SDR上。

首先,这不是板子的缺陷,而是跟硬件架构有关。

就像刚刚说到的SDR架构分几种,会出现这种情况的是零中频架构。也就是实际上没有中频只有基带。而r820t2版本的RTL-SDR(由于另一个版本很少见,后面我都简称为常见RTL-SDR)是有中频的。

我点测过常见RTL-SDR的中频信号。

当时我把发射机在435MHz附近左右扫频。然后把RTL-SDR的中心频率也设置在435MHz附近。就能在中频走线上测出一个在427kHz~3.15MHz范围内变化的扫频信号。说明这就是rtlsdr的中频范围。rtlsdr只会针对这一段信号采样,而不会采样最左侧0Hz的信号。即使0Hz处是存在尖峰的,但也会被滤波器过滤,你在最终的频谱上看不到这个尖峰。

这就是为啥类似常见RTL-SDR的这种低中频架构,在频谱上不会有尖峰的原因。

想象一下零中频架构的SDR,如果把射频信号直接变频到基带,也就是0Hz附近。那么0Hz附近的信号就不能用滤波器过滤,只能保留到最终显示的频谱上来。这就是为啥你会看到这个尖峰。

在rtlsdr的书里也有介绍。它用两个版本rtlsdr都跑了一个扫频的程序,用来显示完整的无线电频谱。如果用常见版本扫频,最终拼接出来的看到的是我们熟悉的频谱。

但如果用E4000版本,就会用好多个带dc offset尖峰的频谱拼接。

不但SDR会这样,如果用示波器打开FFT功能,你会发现在最左侧0Hz附近也会有尖峰(示波器FFT默认频谱左右对称,不显示0Hz以下的部分)。

此时如果打开测量功能可测出,我们发的正弦波平均值是10mV左右。

我们可以调节任意波形发生器,让它带有-10mV的偏置。

此时你会发现0Hz上的尖峰大幅减小了,从-24dBm降低为-39dBm。

示波器由于是直采,它是实现SDR的最理想架构。但是也会有这个dc offset。

所以说dc偏置是无法避免的。只是在低中频架构中你看不到,而零中频架构中你可以看到。

解决的方法一个是可以像我刚刚调节示波器一样,把偏置拉低。在一些高端SDR,比如LimeSDR中会有供你配置的寄存器。

或者你也可以在采样后的数字信号中,自己实现一个数字中频,然后用数字滤波器把你要的信号与dc offset区分开。在HackRF中文教程的FM广播接收那一集中Michael Ossmann就是这么做的。先把中心频率故意设置在偏离目标信号的频点上,然后用cosine函数,把目标信号下变频到0Hz,而把原本的0Hz变到滤波器带宽以外。即可解决这个问题。

现在知道了零中频接收机有这个dc offset的是正常现象。但为什么我们还要用零中频接收机,不用其它架构呢?另外一本书里有详细解释。

第1.4节说道:

以前一直在用超外差架构,这种架构性能很好,但结构复杂,需要很多不同组件,每个组件有最小体积限制,这样整体就不能做得很小。而且由于主要是硬件实现,灵活度也不如软件。

比较上两张图,就能看出零中频比超外差需要的组件少了好多了。在上一篇文章彩图(c)中,你也能看出它比(a)和(b)结构简单。

但是这篇文章也说了零中频架构的缺点。

比如,如果校准的不够好,镜像和载波泄露就会出现。那么在接收过程中,会降低灵敏度。在发射过程中会发射出不想要的信号。

而如果射频部分和校准部分在不同芯片上完成,这个校准是不可能做得很完美的。

幸好芯片技术在不停发展,现在已经可以把射频部分的模拟电路与实现校准算法的数字电路做到同一颗芯片上了,这样整套系统的性能就会有提升。LimeSDR上的LMS7002,以及竞品AD9361都是这样的结构。硬件上是能够校准好的,但实际好不好也要看校准算法做得怎么样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/709054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达梦数据库把日志数据按天统计不同状态的数据,实现字段行转列与根据id分组

1、这是日志表记录的数据,现在需要统计出每个app_id各个警告类型alarm_type的总数 2、先实现行转列,把三个alarm_type值转成列字段 SQL select app_id,count(CASE WHEN alarm_typeconcurrency THEN 1 ELSE null END) AS currentCount,count(CASE WHEN …

Python 读取环境变量时,环境变量值修改后一直读不到最新的解决

原因 在使用Open AI开发应用时,API Key为了安全,会保存在操作系统环境变量中(Windows)。 在Windows中添加一个环境变量值: OPENAI_API_KEYYOUR_API_KEY。 今天这个API KEY被禁了,使用不了了,就…

期货开户保证金保障市场正常运转

期货保证金是什么?在期货市场上,采取保证金交易制度,投资者只需按期货合约的价值,交一定比率少量资金即可参与期货合约买卖交易,这种资金就是期货保证金。期货保证金(以下简称保证金〕按性质与作用的不同。…

Docker 第十九章 : 阿里云个人镜像仓使用

Docker 第十九章 : 阿里云个人镜像仓使用 本章知识点: 如何创建镜像库,如何设置密码,如何登录与退出个人镜像仓,如何本地打镜像,如何将本地镜像推送到个人镜像库。 背景 在项目YapiDocker部署中,因读取mongo:latest 版本不一致,导致后续执行步骤的异常。遇到此场景…

Unity3D 使用 Lerp 进行连续运动

有很多关于在 Unity 中使用 lerp 方法移动对象的帖子和视频,但很少有人指出主要问题。 在开始之前,请阅读这篇文章以了解 Lerp 方法:How to Lerp like a pro | Chico Unity3D 正如您在上面的文章中读到的,lerp 方法遵循一个简单的概念。设置开始和结束位置以及进度百分比。…

在UniApp中引入大于40kb字体包的记录

因为项目UI需要特殊字体,所以给了一个80kb字体包,但是在正常的使用导入时候发现不生效 这是我的导入过程 1.把下载好的文件放入static/font目录中 2.在app.vue中引用 font-face { font-family: zitiming; src: url(/static/font/YouSheBiaoTiHei-2.t…

opengles 背面剔除介绍(十二)

文章目录 前言一、OpenGL ES 剔除功能简介二、Opengl ES 剔除功能相关的API1.使能剔除功能2. 配置面剔除模式3. 设置剔除面的顺序4. 禁用剔除功能总结参考资料前言 本文主要介绍 opengles3.0 中的背面剔除相关知识,对于绘制3d 图形, 经常会用到它,并且它能提升渲染效率 软硬…

微信小程序配置

微信小程序的下拉刷新配置主要在页面的配置文件 app.json 中进行。 在 app.json 中,可以使用 enablePullDownRefresh 字段来配置是否支持下拉刷新,该字段的值为布尔类型。 示例代码如下: {"pages": ["pages/index/index&qu…

Matlab进阶绘图第41期—双三角网格曲面图

在《Matlab论文插图绘制模板第67期—三角网格图(Trimesh)》中,我分享过三角网格曲面图的绘制模板。 然而,有的时候,需要在一张图上绘制两个及以上的三角网格曲面图,且每个三角网格曲面图使用不同的配色方案。 在Matlab中&#x…

使用Axure RP并配置IIS服务结合内网穿透实现公网访问本地HTML原型页面

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

vmware网络负载均衡方式

基于 IP 哈希的路由: 原理: 基于虚拟机的源和目标 IP 地址以及 TCP/UDP 端口号计算哈希值,并使用该哈希值确定出口网络适配器。这样可以确保同一对源和目标的网络流量始终被路由到相同的网络适配器。应用场景: 适用于大量使用虚拟…

学习JAVA的第六天(基础)

目录 集合 集合和数组的对比 ArrayList成员方法 ArrayList成员方法代码展示 练习 集合的遍历01之字符串 集合的遍历02之数字 集合的遍历03之学生对象 集合 集合和数组的对比 从长度维度来看 数组长度固定 集合长度可变从存储类型维度来看 数组可以存放基本数据类型和…

NC65 零预算控制规则 数据库表关系

NC65 零预算控制规则 数据库表关系 SELECT t1.createdby, t1.objname, t2.ctrlname, t2.pk_parent, t3.billtype, t3.nameidx, t3.pk_obj FROM tb_rule_formula t1 left join tb_ctrlformula t2 on t1.pk_obj t2.pk_parent left join tb_ctrlscheme t3 on t3.pk_ctrlformula …

如果大数据中多头借贷风险严重怎么办呢?

在大数据报告中,多头借贷风险、逾期风险、联系人风险、司法风险等是大数据评分评级的重要组成部分,大数据多头借贷风险也是很多银行和金融平台比较看重的,那如果大数据中多头借贷风险严重怎么办呢?本文详细为大家讲讲。 大数据多头风险是什么…

[JavaWeb玩耍日记]Mybatis快速入门与增删改查

目录 模块一:快速入门 1.创建数据库,插入数据 2.创建maven模块后,需要导入的依赖有哪些? 3.想要输出查询到的数据(包括日志打印),需要创建哪些文件? 4.如何放置UserMapper接口与User类? 5.…

林浩然与杨凌芸的Scala奇遇记:从Java王国到函数式编程乐园

林浩然与杨凌芸的Scala奇遇记:从Java王国到函数式编程乐园 在那个代码编织而成的世界里,我们的主人公林浩然和杨凌芸,两位Java领域的编程高手,正在寻找新的挑战。他们曾一起探索过Java丛林中的Lambda表达式的奥秘,也曾…

Spring注解@NoNull、@NotEmpty、@NotBlank的区别及注解无效以及嵌套对象的无效解决办法

1.三者的区别 NotNull: 不能为null,但可以为empty(“”," “,” “) ,一般用在基本数据类型的非空校验上,而且被其标注的字段可以使用 size/Max/Min对字段数值进行大小的控制 NotEmpty: 不能为null,而…

配置资源管理Secret

目录 一、什么是Secret? 二、secret的三种类型 三、pod适用secret的三种方式 四、secret实例 1、创建secret 2、使用Secret方式 一、什么是Secret? Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,目的是为了更方便的控制使用数据,并…

GDB动态调试学习-2-【断点】

文章目录 在程序地址上打断点在程序入口处打断点获取程序入口地址 在命名空间设置断点命名空间给命名空间的函数下断电 在文件行号上打断点保存已经设置的断点设置临时断点设置条件断点command指令 忽略断点 在程序地址上打断点 当调试汇编程序,或者没有调试信息的…

【扩散模型第三篇】Classifier Guidance 和 Classifier Free Guidance(CFG)

参考: [1] 张振虎博客 [2] https://www.bilibili.com/video/BV1s8411i7cU/?spm_id_from333.788&vd_source9e9b4b6471a6e98c3e756ce7f41eb134 [3] https://zhuanlan.zhihu.com/p/660518657 [4] https://zhuanlan.zhihu.com/p/640631667 进食顺序 1 前言2 Classi…