世界的本质是旋转(5)-在复平面上驱动软件无线电SDR发射BPSK波形

在上一篇文章中,我们介绍了复平面、拍照采样的一些思维实验。从本节开始,转入现实应用,通过控制复平面向量的位置,实现一个完整的BPSK全双工通信通道。

发射方:通过控制复平面向量在各个时刻的位置来携带信息的技术,属于通信原理中调制的概念。
接收方:从采样(拍照)结果找回信息经历的计算,是通信原理中解调的概念。

本文基于C语言SDR实验平台taskBus开展实验。文章从复平面向量的旋转起步,以图、代码为主,并没有严谨专业的理论推导。一些工程方法比起专业的通信技术而言是非常单薄且作坊的,俗称野路子、小高炉炼钢铁,希望读者仅仅以娱乐或者批判的眼光看待本文。SDR是成人的大玩具,我们的口号是娱乐至上!

完整的工程参考taskbus_course的a2课程,可执行包参考taskBus的Release版本。

1. 通用软件无线电的特点

在开始本文前,笔者已经花了4天左右的时间,利用USRP B200min构造了稳健的BSPK/QPSK双工通道,用自己的思路和直接的纯C代码实现了调制解调,体会到软件无线电实现BPSK一些有趣的不同:

  1. 传统通过电路实现的解调器感觉复杂的部分,在计算机上一个 atan 就解决了。
  2. 符号时钟同步、载波同步的环路,就是一个角度变量的更新和迭代,使得相机的旋转与残频的旋转同步,类似旋转打地鼠
  3. BPSK只判断相位符号,不测量向量长度,因而在多径衰落下,影响也不大。
  4. USRP自带一个滤波器,即使没有成型,也不会频谱泄露。
支持BPSK/QPSK的SDR范例带有残差频率的BPSK地鼠机
BPSKBSPK地鼠机

通用计算机的优势,使得调制解调代码出奇的短,并非常直接,易于理解。后面的例子以BPSK讲述,QPSK的算法原理完全一样,通过阅读源码很容易推广。

2. 调制:使用向量的位置携带信息驱动USRP B210

在前文中,我们观察的是简单的向量转动的叠加。如果把叠加后向量的位置看做一个质点,显然每次拍照时,质点都会在复平面留下影像。如果我们通过设置质点的位置,让每 Ts 秒质点必然出现在某些特定的位置上,则可以用这种时间:位置的对应关系,来表征信息。

比如,希望质点位于(0,1)时表示二进制信息1,位于(0,-1)时表示二进制信息0,则可以携带二进制信息。下图携带的信息是 1 0 1 1 0 1 1 0 1 0 0 0 0 0

raw
USRP B210/B200mini 只要输入上述复平面的 x,y坐标,就能实现发射(USRP板卡自带BW设置,可以抑制带外旁瓣,相当于成型滤波)。这种复平面上的 x,y坐标数组构成的数据流被称为“基带信号”,表示为一组整数。SDR硬件会帮助我们进行DUC(上变频)与DA转换,驱动模拟电路产生无线电波。

对USRP B210来说,可以直接在当前采样率(拍照速率)下给出上述波形,接收的时候,注意以2倍以上的速率接收即可. 从比特生成USRP IQ 发射波形的代码:

std::vector<short> emit_one_pack(std::vector<char> bits)
{std::vector<short>  signal;for (int i=0;i<bits.size();++i){signal.push_back((packagedta[i]==1?1:-1) * 8192);signal.push_back(0);}return signal;
}

此时,采样率设置多大,调制速率就是多少波特。如250KHz的发射采样率,则调制速率就是250KBd。在我们的范例工程里,注意要把模块“a2psk_mod”的“shaping_filter”开关关闭,则实现的就是上述功能。

成型滤波设置

3 空中波形的实际情况

虽然我们递交给USRP 小盒子的是离散的坐标,但一定要有概念,就是发射到空中的是连续的电磁信号。同时,所有的SDR设备都是带限的。这种阶跃的状态最终生成的是连续的波形。就像您用力甩一个长绳子,绳子上的各个质点的纵向轨迹也是连续的行为。

另一方面,为了降低对带外其他频率的干扰,一般会使用成型滤波抑制带外频谱分量,导致更为平缓的过度。比如,我们在4倍采样率下,看到的中间状态是这样的,红色的点是我们的信息点,蓝色的圈圈是中间状态:

带限
观察上述现象的octave代码如下。代码里,使用成型滤波模拟了 USRP B210设备帮助我们做的事情。蓝色的点的坐标,也是导致4倍采样率下上文的地鼠会朝向原点运动到对面的情况。地鼠不可能阶跃过去,我们的向量(地鼠)在状态之间的迁移是连续的。

mulrate = 4;
symlen = 1000;
dta1_bits = randint (1, symlen, 2);
dta2_symbols = pskmod (dta1_bits, 2, 0, "gray");
dta3_sig = zeros(1,symlen*mulrate);
dta3_sig(1:mulrate:end) = dta2_symbols;
[fir_rcos]=rcosfir(0.25,[-3,3],mulrate,1,'sqrt');
dta4_baseband = conv(dta3_sig,fir_rcos,'same');
f = figure();
filename = 'output.gif';
dta4_draw = imag(dta4_baseband)+1j*real(dta4_baseband);
hold on;
DelayTime = 0.5;
plot([0,1],[0,0],'k');
plot([0,0],[-1,1],'k');
for t = 1:100plot([t-1,t],[0,0],'k');if mod(t - 1,mulrate)==0plot(dta4_draw(t),'r*');endifif t>1plot([t-1,t],[real(dta4_baseband(t-1)),real(dta4_baseband(t))],'r');if mod(t - 1,mulrate)==0plot([t],[real(dta4_baseband(t))],'r*');elseplot([t],[real(dta4_baseband(t))],'bo');endifendxlim([0,t]);pause(DelayTime );drawnow% 存为Gifframe = getframe(f);im = frame2im(frame);[imind,cm] = rgb2ind(im);if t == 1;imwrite(imind,cm,filename,'gif','DelayTime', DelayTime , 'Compression' , 'lzw');elseimwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime', DelayTime , 'Compression' , 'lzw');end
end
hold off

一些感性的认识是:

  1. 复平面上质点的运动是连续的。质点不可能从一个位置“阶跃”到另一个位置。
  2. 由于带宽限制,运动轨迹很平滑,看起来像是一些余弦的叠加。
  3. 滤波使得原本恰好为正负1的y坐标分散了,在各个定时时刻上无法恰巧等于1或者-1.

4. 用C语言实现1/4速率成型滤波(非必须)

上文从0,1序列生成基带波形的 C语言代码非常直接,下文把成型滤波也加进去了,以对带宽进行限制,同时实现了4倍速率插值。完整的代码要参考文章开头的git代码库。注意的是使用自定义的滤波器提高了波形质量,但同样的采样率下,生成的调制速率降低了4倍。因此,要像上文驱动一个250KBd的BPSK波形,需要 1MHz的TX采样率。因此实际应用中,自己做不做成型,还是交给USRP的硬件滤波器来限制带宽,取决于连接SDR设备的网速,以及对码间串扰等滤波器特性的要求。

std::vector<short> emit_one_pack(std::vector<char> bits)
{static const double fir_rcos_q25[25] = {-0.018773,0.0030136,0.032677,0.047094,0.02655,-0.027522,-0.085225,-0.099447,-0.032147,0.11904,0.31118,0.472,0.53463,0.472,0.31118,0.11904,-0.032147,-0.099447,-0.085225,-0.027522,0.02655,0.047094,0.032677,0.0030136,-0.018773};static double fir_cache[25] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};static unsigned long long fir_clock = 0;std::vector<short> signal;for (int i=0;i<bits.size();++i){for (int sym = 0; sym< 4;++sym){//环状滤波器滤波成型fir_cache[fir_clock % 25] = sym==0?(bits[i]==1?1:-1):0;double fval = 0;for (int f=0;f<25;++f)fval += fir_cache[(fir_clock + 1 + f) % 25] * fir_rcos_q25[f];++fir_clock;//X,Ysignal.push_back(fval * 8192);signal.push_back(0);//BPSK Y (Q路)是0.}}return signal;
}

5. 下节预告:噪声背景下的接收

至此,已经可以把一串010101发到空中啦。下一节,我们会看到噪声叠加后,上述波形的取值进一步分散了,波形抖动的很厉害,只能大概看到各个点的符号, 而且其X坐标也不再是0,原本在Y轴上的点产生了位移:

recv

不仅如此,接收机接收到的坐标与发射机的坐标之间,存在着细微的偏差。首先是红色坐标位置生成的速率有误差,而后,上下变频有误差。接收机解决的主要问题都是围绕这些误差的同步来开展的。

  1. 时钟误差导致收发双方生产、消费红色样点的速率有差别。发射机生产10000个点,接收机相同时间消费9990个点。
  2. 频率误差,导致整体坐标系以一个很低的转速发生旋转。
  3. 初始相位差,使得接收机看到的点x,y坐标都不是0.

下一节我们看看收到的数据是如何处理的。

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

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

相关文章

管道读写规则及 PIPE_BUF 涉及的写原子性问题

结论&#xff1a; 一、当管道内没有数据可读时 O_NONBLOCK disable&#xff1a;read 调用阻塞&#xff0c;直到有可读数据 O_NONBLOCK enable&#xff1a; read 调用返回 -1&#xff0c;errno 值为 EAGAIN 二、当管道已满或者剩余空间不够时 O_NONBLOCK disable&#xff1a;wr…

Vue时间轴

之前有这样子的需求没有用第三方插件于是自己写一个简单的时间轴 时间轴滚动条并左右切换滚动条位置相对应移动 <div class"time-scrollbar"><div v-if"timeLineData.length>0" class"scrollbar-content"><div class"ar…

vue3的基本使用(1)

Vue3的基本使用&#xff08;1&#xff09; 初识vue31. vue3简介2. 性能提升3. 源码升级 Vue3的创建1. vue-cli创建2. vite创建 Composition API的区别&#xff08;组合式&#xff09;setup函数响应式数据1. ref响应式2. reactive响应式 toRefs与toRef简单介绍 初识vue3 1. vue…

Vue系列-环境快速搭建

vue环境快速搭建 演示视频 快速搭建Vue开发环境pnpm和yarn 1. 基本信息 作者: GMCY系列: Vue仓库: GitHub | Gitee话题(GitHub): tools \ vue创建时间: 2024/03/02 2. 介绍 功能 批处理文件vue 环境的快速搭建nodejs, npm, pnpm, yarn 自动 下载安装npm, pnpm, yarn 自动 …

CVE-2024-27198 JetBrains TeamCity 身份验证绕过漏洞分析

漏洞简介 JetBrains TeamCity 是一款由 JetBrains 公司开发的持续集成和持续交付服务器。它提供了强大的功能和工具&#xff0c;旨在帮助开发团队构建、测试和部署他们的软件项目 JetBrains TeamCity发布新版本修复了两个高危漏洞JetBrains TeamCity 身份验证绕过漏洞(CVE-20…

企智汇:引领企业项目管理的数字智能化管理系统工具!

随着数字化时代的来临&#xff0c;企业对项目管理的要求也日益增高。面对日益复杂的业务流程和海量数据&#xff0c;如何有效地管理项目、整合资源、优化流程、提高管理效率&#xff0c;成为了摆在企业面前的重要课题。在这样的背景下&#xff0c;专业做了10年项目管理系统的&a…

vsphere虚拟机迁移是灰色如何解决

vsphere虚拟机迁移是灰色如何解决 问题描述&#xff1a; 在vsphere中&#xff0c;迁移虚拟机时迁移按钮是灰色&#xff0c;无法迁移&#xff0c;关机之后也无法迁移 虚拟机按钮为灰色 找到虚拟机存储对应的位置&#xff0c;查询是否有.vmx虚拟机文件 查询中发现有.vmx文件存…

JS使用方式

JS是解释性语言&#xff0c;所以不需要搭建类似C#/Java之类的开发运行环境&#xff0c;因为他们是编译型语言。JS一般运行在浏览器中或者node环境中&#xff0c;这里都是JS引擎的功劳。 node环境使用 推荐使用nvm管理node版本&#xff0c;nrm管理代理地址。 安装node&#xf…

P2241 统计方形(数据加强版) python解法

求n*m网格内矩形的数目 - tenos - 博客园 (cnblogs.com) 法一&#xff08;题解推规律暴力枚举得到&#xff09;&#xff1a; n,mmap(int,input().split()) sqr,rec0,0 #正方形和长方形个数 #以长宽做循环&#xff0c;每次求n*m大小的矩形的个数 #题解是从0开始的&#xff0c;我…

供应链管理(SCM):界面设计全面扫盲,得供应链者得天下

大家伙&#xff0c;我是大千UI工场&#xff0c;专注UI分享和项目接单&#xff0c;本期带来供应链系统的设计分享&#xff0c;欢迎大家关注、互动交流。 一、什么是SCM SCM系统是供应链管理&#xff08;Supply Chain Management&#xff09;系统的缩写。供应链管理是指协调和管…

信号处理--卷积残差网络实现单通道脑电的睡眠分期监测

目录 背景 亮点 环境配置 数据 方法 结果 代码获取 参考文献 背景 人类大约花三分之一的时间睡觉&#xff0c;这使得监视睡眠成为幸福感的组成部分。 在本文中&#xff0c;提出了用于端到端睡眠阶段的34层深残留的Convnet架构 亮点 使用深度1D CNN残差架构&#xff0…

支小蜜校园防欺凌报警系统如何识别霸凌

校园霸凌给受害者带来了深重的心理和身体伤害。为了有效应对这一问题&#xff0c;校园防欺凌报警系统应运而生&#xff0c;其核心技术在于如何准确、迅速地识别霸凌行为。那么校园防欺凌报警系统是如何识别霸凌的呢&#xff1f; 图像识别技术 这些系统利用高清摄像头捕捉校园…