世界的本质是旋转(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坐标,就能实现发射(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的发射采样率,则调制速率就是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/429315.html

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

相关文章

108. 将有序数组转换为二叉搜索树【简单】

108. 将有序数组转换为二叉搜索树【简单】 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉…

电脑不小心格式化了,怎么恢复?

在这个数字化时代&#xff0c;电脑已经成为我们日常生活和工作中不可或缺的工具。然而&#xff0c;有时我们可能会不小心格式化电脑硬盘&#xff0c;导致重要数据的丢失。那么&#xff0c;电脑不小心格式化了&#xff0c;怎么恢复&#xff1f; 别着急&#xff0c;在本篇攻略中&…

vue3页面内容切换(类似登录、注册内容切换)

一、内容描述 页面有俩块内容&#xff0c;分别是验证码登录页面内容&#xff0c;账号密码登录页面内容。有俩种处理方式&#xff0c;一个是写俩个页面跳转使用&#xff0c;还有一种是一个页面俩个内容&#xff0c;切换的只是不同的内容&#xff0c;相同的内容保留。一般都是选择…

音视频开发之旅——音频基础概念、交叉编译原理和实践(LAME的交叉编译)(Android)

本文主要讲解的是音频基础概念、交叉编译原理和实践&#xff08;LAME的交叉编译&#xff09;&#xff0c;是基于Android平台&#xff0c;示例代码如下所示&#xff1a; AndroidAudioDemo 音频基础概念 在进行音频开发的之前&#xff0c;了解声学的基础还是很有必要的。 声音…

Windows安装SSH教程

Windows安装SSH教程 一、SSH1.SSH简介2.SSH功能3.SSH验证3.1 第一种级别&#xff08;基于口令的安全验证&#xff09;3.2 第二种级别&#xff08;基于密匙的安全验证&#xff09; 4.SSH层次4.1 传输层协议 [SSH-TRANS]4.2 用户认证协议 [SSH-USERAUTH]4.3 连接协议 [SSH-CONNEC…

改造muduo,不依赖boost,用C++11重构

组件的实现 1. 序 1.1. 总述 muduo库是基于多Reactor-多线程模型实现的TCP网络编程库&#xff0c;性能良好。如libev作者&#xff1a;“One loop per thread is usually a good model”&#xff0c;muduo库的作者陈硕在其《Linux多线程服务端编程》中也力荐这种“One loop pe…

linux中对信号的认识

信号的概念与相关知识认识 信号是向目标进程发送消息通知的的一种机制。 信号可以以异步的方式发送给进程&#xff0c;也就是说&#xff0c;进程无需主动等待&#xff0c;而是在任何时间都可以接收到信号。 信号的种类 用kill-l命令查看系统定义的信号列表&#xff1a; 前台…

初识Hive

官网地址为&#xff1a; Design - Apache Hive - Apache Software Foundation 一、架构 先来看下官网给的图&#xff1a; 图上显示了Hive的主要组件及其与Hadoop的交互。Hive的主要组件有&#xff1a; UI&#xff1a; 用户向系统提交查询和其他操作的用户界面。截至2011年&…

Linux - 安装 maven(详细教程)

目录 一、下载二、安装三、配置环境变量四、镜像资源配置 一、下载 官网&#xff1a;https://maven.apache.org/download.cgi 打开 maven 的官网下载页面&#xff0c;点击 bin.tar.gz 文件链接 即可下载最新版本的 maven 如果想要下载旧版本的 meven&#xff0c;则点击 Maven…

【短时交通流量预测】基于GRNN神经网络

课题名称&#xff1a;基于GRNN神经网络的短时交通流量预测 版本时间&#xff1a;2023-04-27 代码获取方式&#xff1a;QQ&#xff1a;491052175 或者 私聊博主获取 模型简介&#xff1a; 城市交通路网中交通路段上某时刻的交通流量与本路段前几个时段的交通流量有关&#x…

Python类 __init__() 是一个特殊的方法

设计者&#xff1a;ISDF工软未来 版本&#xff1a;v1.0 日期&#xff1a;2024/3/5__init__() 是一个特殊的方法 类似c# C的构造函数 两头都包含两个下划线&#xff0c;这是约定&#xff0c;用于与普通的函数保持区分class User:用户类def __init__(self,first_name,last_name):…

软件应用,财务收支系统试用版操作教程,佳易王记录账单的软件系统

软件应用&#xff0c;财务收支系统试用版操作教程&#xff0c;佳易王记录账单的软件系统 一、前言 以下软件操作教程以 佳易王账单记账统计管理系统V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 如上图&#xff0c;统计报表包含 收支汇…

JavaScript基础2之运算符、函数

JavaScript基础 运算符一元操作符递增/递减一元加和减 布尔操作符逻辑非逻辑与逻辑或 乘性操作符乘法操作符除法操作符取模操作符 加性操作符加法操作符减法操作符 比较操作符相等操作符关系操作符 函数函数声明函数表达式箭头函数函数的实参和形参arguments 默认参数参数的拓展…

QUIC来了!

什么是QUIC QUIC&#xff0c;快速UDP网络连接(Quick UDP Internet Connection)的简称&#xff0c;即RFC文档描述它为一个面向连接的安全通用传输协议。其基于UDP协议实现了可靠传输及拥塞控制&#xff0c;简单来说&#xff0c;QUIC TCP TLS。 为什么有了QUIC HTTP2.0为了为了…

如何处理微服务之间的通信和数据一致性?

✨✨祝屏幕前的兄弟姐妹们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、微服务通信 1、同步通信&#xff1a;HTTP 1.1.同步通信示例代码&#xf…

第四十九回 吴学究双掌连环计 宋公明三打祝家庄-Python与HTTP服务交互

吴用请戴宗从梁山请来铁面孔目裴宣、圣手书生萧让、通臂猿侯健、玉臂匠金大坚来帮忙。又告诫扈家庄的扈成&#xff0c;打起来不要去帮祝家庄。 孙立把旗号改成“登州兵马提辖孙立”&#xff0c;来祝家庄找峦廷玉&#xff0c;被热情接待。 第三天&#xff0c;宋江派小李广花荣…

Vue 路由功能

安装路由 npm install vue-router4创建路由器并导出 //导入vue-router import { createRouter, createWebHistory } from vue-router //导入组件 import LoginVue from /views/Login.vue import LayoutVue from /views/Layout.vue//定义路由关系 const routes [{ path: /log…

安卓玩机工具推荐----ADB状态读写分区 备份分区 恢复分区 查看分区号 工具操作解析

在以往玩机过程中。很多机型备份分区 备份固件需要借助adb手动指令或者第三方手机软件或者特定的一些工具来操作。有些朋友需要查看当前机型分区名称和对应的分区号。此类操作我前面的博文专门说过对应的adb指令。但有些界面化的工具比较方便简单。 相关分区同类博文&#xff…

WPF中如何设置自定义控件(二)

前一篇文章中简要讲解了圆角按钮、圆形按钮的使用,以及在windows.resource和app.resource中设置圆角或圆形按钮的样式。 这篇主要讲解Polygon(多边形)、Ellipse(椭圆)、Path(路径)这三个内容。 Polygon 我们先看一下的源码: namespace System.Windows.Shapes { pu…

性能问题分析排查思路之机器(3)

本文是性能问题分析排查思路的展开内容之一&#xff0c;第2篇&#xff0c;主要分为日志1期&#xff0c;机器4期、环境2期共7篇系列文章&#xff0c;本期是第三篇&#xff0c;讲机器&#xff08;硬件&#xff09;的网络方面的排查方法和最佳实践。 主要内容如图所示&#xff1a…