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

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

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

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

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

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

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

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

BPSK

通用计算机的优势,使得调制解调代码出奇的短,并非常直接,易于理解。

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坐标,就能实现发射。这种复平面上的 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的发射采样率,则调制速率就是250KHz。在我们的范例工程里,注意要把模块“a2psk_mod”的“shaping_filter”开关关闭,则实现的就是上述功能。

成型滤波设置

3 空中波形的实际情况

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

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

带限
观察上述现象的octave代码如下。代码里,使用成型滤波模拟了 USRP B210设备帮助我们做的事情。

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:100
  plot([t-1,t],[0,0],'k');
  if mod(t - 1,mulrate)==0
    plot(dta4_draw(t),'r*');
  endif
  if t>1
    plot([t-1,t],[real(dta4_baseband(t-1)),real(dta4_baseband(t))],'r');
    if mod(t - 1,mulrate)==0
      plot([t],[real(dta4_baseband(t))],'r*');
    else
      plot([t],[real(dta4_baseband(t))],'bo');
    endif
  end
  xlim([0,t]);
  pause(DelayTime );
  drawnow

  % 存为Gif
  frame = getframe(f);
  im = frame2im(frame);
  [imind,cm] = rgb2ind(im);
  if t == 1;
    imwrite(imind,cm,filename,'gif','DelayTime', DelayTime , 'Compression' , 'lzw');
  else
    imwrite(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,Y
			signal.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.

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Socks5代理协议:原理、应用与优势

在计算机网络中&#xff0c;代理协议是一种用于转发客户端请求的机制。Socks5是其中一种广泛使用的代理协议。它主要工作在传输层和应用层之间&#xff0c;位于OSI参考模型的第五层&#xff08;会话层&#xff09;。其设计初衷是为了帮助授权用户突破防火墙限制&#xff0c;获取…

【洛谷 P8682】[蓝桥杯 2019 省 B] 等差数列 题解(数学+排序+辗转相除法)

[蓝桥杯 2019 省 B] 等差数列 题目描述 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列&#xff0c;只记得其中 N N N 个整数。 现在给出这 N N N 个整数&#xff0c;小明想知道包含这 N N N 个整数的最短的等差数列有几项&#xff1f; 输…

远程调用--webClient

远程调用webClient 前言1、创建webClient2、准备数据3、执行请求4、接收返回响应到的数据整体代码 前言 非阻塞、响应式HTTP客户端 1、创建webClient WebClient client WebClient.create();2、准备数据 Map<String,String> params new HashMap<>();params.pu…

google最新大语言模型gemma本地化部署

Gemma是google推出的新一代大语言模型&#xff0c;构建目标是本地化、开源、高性能。 与同类大语言模型对比&#xff0c;它不仅对硬件的依赖更小&#xff0c;性能却更高。关键是完全开源&#xff0c;使得对模型在具有行业特性的场景中&#xff0c;有了高度定制的能力。 Gemma模…

c语言游戏实战(10):坤坤的篮球回避秀

前言&#xff1a; 这款简易版的球球大作战是博主耗时两天半完成的&#xff0c;玩家需要控制坤坤在游戏界面上移动&#xff0c;来躲避游戏界面上方不断掉下来的篮球。本游戏使用C语言和easyx图形库编写&#xff0c;旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代…

php开发项目 docx,pptx,excel表格上传阿里云,腾讯云存储后截取第一页生成缩略图

服务器或者存储上传的word,ppt和excel表格需要截取内容展示的时候,就需要管理后台每次上传文件时根据不同文件类型截取图片保存起来,并讲图片的地址保存到数据字段中.网上搜索了很多相关文章遇到的坑不少,经过2天时间终于完成了,将代码和遇到的问题完整记录下来. 本文用的…

【JavaEE进阶】 Linux常用命令

文章目录 &#x1f343;前言&#x1f334;ls 与 pwd&#x1f6a9;ls&#x1f6a9;pwd &#x1f38d;cd&#x1f6a9;认识Linux目录结构 &#x1f340;touch与cat&#x1f6a9;touch&#x1f6a9;cat &#x1f332;mkdir与rm&#x1f6a9;mkdir&#x1f6a9;rm &#x1f384;cp与…

长贵对赵本山说:你需要我们家大脚,我立马给你配双大鞋!

长贵对赵本山说&#xff1a;你需要我们家大脚&#xff0c;我立马给你配双大鞋&#xff01; --小品《乡村爱情》&#xff08;中2&#xff09;的台词 表演者&#xff1a;赵本山 于月仙 王小利 唐鉴军等 &#xff08;接上&#xff09; 哈哈哈 伊拉克啊 这地方也不产这玩意吧 …

Blazor 向 ECharts 传递 option

目标 将ECharts封装为Blazor组件&#xff0c;然后通过jsRuntime向ECharts传递参数&#xff0c;即设置option。 封装ECharts 步骤&#xff1a; 1. 在index.html中引入echarts.min.js&#xff1b; 2. 创建blazor组件&#xff0c;将ref传递给js用于初始化echarts&#xff1b; …

指定新加坡|高职老师自费赴新加坡国立大学访学交流

K老师任职于某高职院校&#xff0c;希望通过自费出国访学&#xff0c;达到拓宽国际化视野&#xff0c;为本校的专业发展寻求新契机的目的&#xff0c;并将访学目标国家指定为新加坡。最终我们为其获得新加坡国立大学的邀请函。因交叉性、前沿性的专业特性&#xff0c;K老师的出…

构建安全的REST API:OAuth2和JWT实践

引言 大家好&#xff0c;我是小黑&#xff0c;小黑在这里跟咱们聊聊&#xff0c;为什么REST API这么重要&#xff0c;同时&#xff0c;为何OAuth2和JWT在构建安全的REST API中扮演着不可或缺的角色。 想象一下&#xff0c;咱们每天都在使用的社交媒体、在线购物、银行服务等等…

大气颗粒物和VOCs PMF源解析实用干货

目前&#xff0c;大气颗粒物和臭氧污染成为我国亟待解决的环境问题。颗粒物和臭氧污染不仅对气候和环境有重要影响&#xff0c;而且对人体健康有严重损害。而臭氧的前体物之一为挥发性有机物&#xff08;VOCs&#xff09;。为了高效、精准地治理区域大气颗粒物和臭氧污染&#…

115.龙芯2k1000-pmon(14)- pmon编程优化

通过上面的分析&#xff0c;发现&#xff0c;其实gzrom-dtb.bin其实有很多空白区域&#xff0c;而且空白区域填充的都是0&#xff0c;这对flash来说并不友好&#xff0c;能否把填充的位置改为ff呢&#xff0c;这样编程的速度也会加快&#xff0c;对flash来说也是一种保护呢。 …

【网站项目】121开放式教学评价管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Linux速览(1)——基础指令篇

在上一章对Linux有了一些基础了解之后&#xff0c;本章我们来学习一下Linux系统下一些基本操作的常用的基础指令。 目录 1. ls 指令 2. pwd&&whoami命令 3. cd 指令 4. touch指令 5.mkdir指令&#xff08;重要&#xff09;&#xff1a; 6.rmdir指令 && …

【虚拟机安装centos7后找不到网卡问题】

最近开始学习linux&#xff0c;看着传智播客的教学视频学习&#xff0c;里面老师用的是centos6.5&#xff0c;我这边装的是centos7最新版的 结果到了网络配置的这一节&#xff0c;卡了我好久。 我在centos一直找不到我的网卡eth0&#xff0c;只有一个回环网口&#xff0c;在/…

TikTok外贸系统的核心功能及其源代码分享!

随着全球化的不断推进&#xff0c;外贸业务成为越来越多企业的增长动力&#xff0c;TikTok作为一个全球性的社交媒体平台&#xff0c;其用户基数庞大、活跃度高&#xff0c;为外贸业务提供了无限的商机。 为了帮助企业在TikTok上更好地开展外贸业务&#xff0c;TikTok外贸系统…

Ubuntu环境使用docker构建并运行SpringBoot镜像

今天Ubuntu环境使用docker构建并运行SpringBoot镜像&#xff0c;看文章之前建议先查看安装流程: Linux环境之Ubuntu安装Docker流程 一、镜像打包过程及执行 1、创建一个测试目录 mkdir javaDemo 2、springBoot的包复制到此目录下 cp demo1-0.0.1-SNAPSHOT.jar /data/app/…

Docker快速集成minio

拉取镜像&#xff08;默认最新的&#xff09; docker pull minio/minio创建配制和数据映射文件夹&#xff08;用于将容器内的配置和数据映射到本地&#xff09; 这边的路径可以修改成自己想要的文件夹 mkdir -p /data/minio/{config,data}启动容器 (这边启动容器要保证本地映…

【大厂AI课学习笔记NO.61】环境部署的选择

主要是选择单机和分布式、生产和开发环境的规划等。 开发环境、测试环境、预发布环境和生产环境是软件开发和部署过程中常见的几个环境&#xff0c;它们各自的定义、区别、联系以及实现的关键技术如下&#xff1a; 1. 开发环境&#xff08;Development Environment&#xff09…