PlutoSDR matlab无线通信系统学习+实战——QPSK无线图片收发系统(一)

上期介绍了Plutosdr的基本知识,以及单个Plutosdr和两个plutosdr进行无线系统收发的区别,文章发出后受到了很多小伙伴的点赞和支持。

今天给大家进行代码实战的讲解,今天带来的是一个图片收发无线系统的搭建,通过Plutosdr进行图片的无线传输。废话不多说,下面上干货。

6b89899fa08a499bb6a6f3ebed322e6e.png

首先设计了一个无线图传系统的UI界面,UI界面的主要作用是清晰的展示系统的名称,以及一些想要调节的参数,根据图中的UI可以看到,要传输的文件是一个图片支持下拉框可选,另外接收端的增益、载波的频率也是可调的。UI中包含了一个“开始传输”按钮,再参数调节完毕之后,点击开始传输按钮之后,系统开始启动,完成数据的传输。点击代码中GUI.m该UI界面直接加载出来。

下面展示主程序的代码:

fprintf('正在准备传输,请稍后....\n');
deviceNameSDR = 'Pluto'; % Set SDR Device
Fs=500e3;      %采样速率
zc1_len=500;   %ZC序列长度
zc_seq1 = creat_cazac(zc1_len);

sdrTransmitter = sdrtx(deviceNameSDR); % Transmitter properties
sdrTransmitter.RadioID = 'usb:0';
sdrTransmitter.BasebandSampleRate = Fs; 
sdrTransmitter.CenterFrequency = sim_options.carrier*1e9;  % Channel 5
sdrTransmitter.ShowAdvancedProperties = true;
sdrTransmitter.Gain = 0;

sdrReceiver = sdrrx(deviceNameSDR);
sdrReceiver.RadioID = 'usb:0';
sdrReceiver.BasebandSampleRate = sdrTransmitter.BasebandSampleRate;
sdrReceiver.CenterFrequency = sdrTransmitter.CenterFrequency;
sdrReceiver.GainSource = 'Manual';
sdrReceiver.Gain = sim_options.gain;
sdrReceiver.OutputDataType = 'double';
sdrReceiver.SamplesPerFrame =200000;

首先是基本的参数配置,设置收发两端的Pluto的基本参数,需要设置发送端和接收端的设备名称,载波的中心频率无需设置可以从UI界面直接读取,发送端的增益设置成固定增益,接收端的增益读取UI界面设置的大小输出类型则选择固定的double类型,Frame的采样点数则需要根据自己的系统进行调整。

发送端程序:

    %数据比特的生成
    temp_bits=tx_bits((1:tx_len)+(nn-1)*tx_len);
    %QPSK调制
    mod_syms = tx_modulate(temp_bits); 
    %脉冲成型滤波
    mod_syms1=usercos(mod_syms,8,21);
    symbol_len=length(mod_syms1);
    %添加前导序列
    signal = [zc_seq1 zc_seq1 mod_syms1];%

首先,取出加载图片的比特数据,进行QPSK调制,这里只是选择QPSK调制方式作为例程讲解,也可以选择其他高阶调制方式进行实验,博主尝试过单个Pluto通信可以支持到128QAM调制,还可以在UI前端界面进行调制方式的配置,可以做成可选的方式,这里就不进行过多的介绍。

调制后的信号变成了一个复数信号,对于QPSK信号,其相位的变化代表了信息比特数据。

调制后的信号经过脉冲成型滤波器,这里采用根升余弦滤波器,经过根升余弦滤波器后的信号能够减少符号间干扰,成型滤波器的时域波形图如下:

c113bf577eea46fa99a063d3932492c2.png

经过成型滤波器后的信号添加前导序列,这里前导序列采用的恒幅零自相关序列,该序列具有很好的自相关特性和互相关特性。这里补充说明一下,为什么需要前导序列,无线信号在接收端进行AD采样转化为数字信号后,信号的起始位置接收端并不知道。接收端并不能区分噪声和信号,所以如何确定信号的起始位置成为了关键,该序列由于具有很好的自相关特性,所以很适合用来进行数据帧的起始位置查找。将加入前导序列的信号进行发送,可以得到发送后的信号为:

aaf9b67788ad452c8bd24632efac1015.png

信号发送出去后,需要在接收端进行信号处理,接收端的程序:

data=sdrReceiver();
rx_signal=data;
%功率归一化
rx_signal=rx_s./sqrt(mean(abs(rx_s).^2));
%信号同步
data1=sync_signal(rx_signal,search_len,zc_seq1,zc1_len,thread,symbol_len);
%频率偏移和估计
rx_equ=freq_equ(data1,zc1_len,Fs);
    
rx_data_pre=usercos_de(rx_equ(2*length(zc_seq1)+1:end),8,21);
%载波同步
rx_data_pre=carrier_sync(rx_data_pre);
%QPSK解调
rx_demodulate_bit = rx_demodulate(rx_data_pre);
de_bits=rx_demodulate_bit(1:tx_len);

得到模块的接收信号后进行信号功率的归一化,然后根据信号添加的前导序列进行信号的同步,即根据信号的前导序列找到信号的起始位置,将有效的信号提取出来。接收端的时域信号如下:

e3d4fb2ee94342a18a9cf56ce085db0a.png

通过前导序列同步找到信号的起始点:

92662865b6b047a385ff17f411e07064.png

如上图所示,在接收端同步后得到的一个较大的相关值,该最大点对应的就是信号的起始点,找到信号的有效起始点后,进行频偏的估计和补偿,然后接收端进行匹配滤波得到滤波后的信号,对滤波后的信号进行载波同步,得到接收端的QPSK信号:

15c544b84f9b4e4cb7a3e2131f0a1946.png

解调后的QPSK信号得到了接收的信号,然后对接收端的信号进行还原得到接收端的图片:

499789485a4c47459a9983c71e3d6a69.png

最后程序运行完毕出弹出一个图片显示的窗口,来展示程序运行过程中生成的图片:

083767ac593945fe9e413533ee23b2d6.png

图片中每个按钮都对应展示了运行过程中生成的波形图,点击按钮对应的信号波形图即可展示。通过这些过程的图片能够帮助你更好的理解程序的过程。 同时,信号传输完成之后也会弹出传输成功窗口:

b6e6c9bebe464a4791a3636152f5cd61.png

这个程序的整个流程至此也就结束了,整个程序的流程介绍也基本结束,我整理了这个程序的整个工程文件和相关的流程说明都放在了下面的链接中,欢迎大家进行下载尝试运行,运行过程中对程序原理或者流程有什么问题欢迎私信我讨论。原创不易,还望大家尊重知识产权,侵权必究!!!

源码链接:

通过网盘分享的文件:链接: https://pan.baidu.com/s/1ej2QPOfbFo1ct9iD1gDPNw?pwd=jv5h 提取码: jv5h

https://m.tb.cn/h.6i0xQgP?tk=sDfwVY09KK1https://m.tb.cn/h.6i0xQgP?tk=sDfwVY09KK1

本期就到这里,大家有任何问题欢迎进行讨论,下期再见!!!!

下一篇:

PlutoSDR无线通信系统学习+实战——基于FM的语音传输(一)-CSDN博客

PlutoSDR matlab无线通信系统学习+实战——提升数据传输速率,实现彩色图片收发-CSDN博客

### 如何在MATLAB中配置和使用PlutoSDR #### 配置环境 为了能够在MATLAB环境中顺利使用PlutoSDR,首先需要确保已正确安装必要的驱动程序和插件。对于Windows用户而言,在开始之前应当参照相关文档完成PlutoSDRM2k USB驱动以及MATLAB插件的安装过程[^3]。 旦完成了上述准备工作,则可以在MATLAB命令窗口输入 `findPlutoRadio` 来检测并建立PlutoSDR设备之间的连接;如果切正常的话,数分钟后应该可以看到确认连接成功的提示信息[^4]。 #### 初始化设置 当成功建立了硬件间的通讯之后,就可以着手初始化些基本参数以便后续的操作: ```matlab % 创建个新的plutoradio对象实例并指定IP地址对应的物理设备关联起来 radio = sdrdev('Pluto'); % 设置中心频率为915 MHz centerFrequency = 915e6; set(radio,'CenterFrequency', centerFrequency); % 设定采样率 sampleRate = 200000; % 单位Hz set(radio,'SampleRate', sampleRate); ``` 以上代码片段展示了如何创建个代表实际存在的PlutoSDR装置的对象,并对其核心属性进行了初步设定——包括但不限于工作频段的选择(这里选取的是常见的ISM波段内的915MHz)、数据采集速率等重要指标。 #### 数据收发操作 接下来就是具体的数据接收或发射流程了。下面分别给出简单的例子来展示这两种常见应用场景下的实现方式: ##### 接收回传信号 ```matlab % 开始监听来自空中接口的消息流 dataReceived = rx(radio); % 对接收到的信息做进步处理... disp(dataReceived); ``` 这段脚本负责启动次性的侦听任务,等待任何可能到来的新鲜报文并通过变量存储下来供下步骤调用。 ##### 发送自定义载荷 ```matlab % 准备要传输的有效负载内容 payloadToSend = complex(randn(1, 100), randn(1, 100)); % 将预设好的二进制序列推送到天线端口向外广播出去 tx(radio, payloadToSend); ``` 此处演示了个非常基础的例子:随机生成组复数值作为待发送的内容,经由调用相应的API方法将其转化为电磁波形式传播开来。 --- 通过以上的介绍可以看出,借助于专门为MATLAB定制化的工具箱支持,即使是没有太多底层编程经验的研究人员也能够快速地上手实践各种复杂的SDR实验课题[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值