软件无线电3-微相E316和HackRF实现FM调制解调

        前面介绍了基于Matlab、矢量信号器和HackRF One实现射频下的FM调制解调,今天分享的内容是用微相E316替代矢量信号器完成发射工作。注意本文仅用于科研和学习,私自搭建电台属于违法行为。

1.概述

微相E316和HackRF One实现FM调制解调测试框图如1所示:

图1 微相E316和HackRF One实现FM调制解调框图

        Matlab将FM调制基带IQ数据存为IQ文件,上位机通过网口将IQ文件发给微相E316,微相E316将基带IQ数据转换为射频信号发射,用HackRF One作为接收机接收FM信号,最后使用计算机开源软件SDRSharp监听FM解调后的语音。

        微相E316的网口和USB口连接计算机,如图2所示:

图2 微相E316和计算机间接线图

        微相E316的射频输出用SMA射频线连接到HackRF One的天线接口(或者微相E316的射频输出和HackRF One的天线接口分别接一根天线),HackRF One 的USB接口连接至计算机,如图3所示。

图3 HackRF One接线图

2.Matlab生成FM调制基带IQ信号

2.1Matlab读取语音文件

        准备一段wav的语音文件,我用笔记本自带的录音机录制了一段自己的语音“软件无线电小方圆.wav“,MATLAB读取语音文件,并获取采样频率信息。

clc;
clear all;
%% ***************read file*************************************
filename ='./data_source/软件无线电小方圆.wav';
[m,fm]= audioread(filename);% fm = 48e3; %音频的采样率
sound(m,fm);
figure(1);
plot(m);title('原始的语音信号');

我的这段语音数据源采样率48kHz。时域波形如图4所示,

图4 原始语音信号时域波形

2.2相关参数设置和语音数据源初处理

        我用的载波频率192kHz,载波采样率1.92MHz,代码里类似这些参数大家可以根据自己的需求修改。FM宽带调制最大频偏75kHz。因为FM调制是用基带信号控制载波的频率,即与载波信号数据相乘,所以在这之前,我们需要将基带信号的采样率和长度进行处理,使其与载波信号采样率和长度保持一致,处理代码如下:

fs = 1.92e6; %采样率 载波的采样率
fc = 192e3; %载波中心频率
df = 75e3; %最大频偏  宽带75khz  窄带5khz
kf = (df*2^32/fs)/32767;
AC= 1024;%幅度
dt=1/fs;
m_len=length(m)*fs/fm;%按照载波采样率的长度计算
m_t=zeros(1,m_len);
for i=1:length(m)for j=1:fix(fs/fm)m_t((i-1)*fix(fs/fm)+j)=m(i); end
end

2.3 FM调制生成基带IQ信号

查表法实现信号发生器,MATLAB产生DDS,生成FM调制基带IQ数据,代码如下:

%************************* FM调制 ********************
n=0:1/1024:1023/1024;
s_rom=sin(2*pi*n);
c_rom=cos(2*pi*n);
w_r=0;%相位累加器
rrom_addr=0;%
dac_i=zeros(1,m_len);%I路信号 
dac_q=zeros(1,m_len);%Q路信号
for i=1:m_lenw_r = w_r + kf*m_t(i);if(w_r > 2^32) % 做32位累加器的溢出判断w_r= w_r - 2^32;elseif(w_r <0)w_r = w_r + 2^32; % 负的溢出时endrrom_addr=round(w_r/2^22);%读查找表的地址if rrom_addr == 0rrom_addr =1;enddac_q(i)=AC*s_rom(rrom_addr);dac_i(i)=AC*c_rom(rrom_addr);
end
data =  dac_i +1i*dac_q;

2.4 Matlab生成IQ文件

Matlab完成将2.3节里生成的FM调制基带IQ数据存为IQ文件,代码如下:

for i=1:Nsig(2*i-1)= real(data (i));sig(2*i)= imag(data (i));
end
fileID = fopen('WBFM.iq', 'wb');
% 写入数据,'short'指定数据类型为short(2字节整数)
fwrite(fileID, sig, 'short');
% 关闭文件
fclose(fileID);

3.上位机将IQ文件导入微相E316

步骤一:网线一端连接计算机,另一端连接微相E316,根据E316内部代码,设置计算机IP,我的E316 IP是192.168.1.11,计算机IP设置为192.168.1.33:

步骤二:上位机选择上一章里Matlab生成的IQ文件,点击“载入文件”,如图5所示:

图5 上位机载入IQ文件

步骤三:等待上位机打印区显示数据下发完成,如图6所示。

图6 上位机下发IQ文件

步骤四:发送次数改为0(连续发送),点击“开始发射”,停止则要点击“停止发射”,如图7和图8所示:

图7上位机设置连续发射

图8 上位机设置E316射频发射中

4.微相E316生成FM信号

        微相E316读取网口接收的IQ文件,得到FM调制基带IQ数据,根据设置的频率,我的E316代码内部设置发射频率492005270Hz,如图9所示,E316将FM调制基带IQ数据经过上变频和混频后,通过射频DA发送FM信号。

图9 开始连续发射

5.HackRF One接收FM信号

在电脑上打开软件SDRSharp,打开后具体操作步骤如下:

步骤一:打开设置,选择硬件HackRF One,如10所示:

图10 SDRSharp设置选择HackRF One

步骤二:选择Radio模式,勾选WFM,如图11所示

图11 SDRSharp选择WFM

步骤三:打开监听开关,如图12所示

图12 SDRSharp打开监听开关

步骤四:设置监听频率490MHz,如图13所示

图13 SDRSharp设置监听频率

步骤五:调节音量和增益值,如图14所示,使收听效果更好。

图14 SDRSharp设置音量和增益

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

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

相关文章

【后端开发】JavaEE初阶—线程的理解和编程实现

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解多线程的知识哟~~~&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;【后端开发】JavaEE初阶——计算机是如何工作的&#xff1f;&#xff1f;&#xff1f;-CSDN博客 &#x1f308;感兴趣的小伙…

哈希表(一)

一、基础知识 哈希表的优点&#xff1a; 查找key的时间效率是O&#xff08;1&#xff09; 什么时候要用到哈希表&#xff1a; 查询元素的出现问题&#xff08;是否出现过&#xff0c;是否在集合里&#xff0c;出现次数等&#xff09; 哈希表的三种数据结构&#xff1a; 数组…

4--苍穹外码-SpringBoot项目中分类管理 详解

目录 新增分类 分类分页查询 启用禁用分类 根据类型查询 修改分类 本文介绍SpringBoot项目中的分类管理&#xff0c;操作类似员工管理模块&#xff0c;具体详解可见以下博客&#xff0c;此处给出各部分代码 2--SpringBoot项目中员工管理 详解&#xff08;一&#xff09;-C…

Web端云剪辑解决方案,BS架构私有化部署,安全可控

传统视频制作流程繁琐、耗时&#xff0c;且对专业设备和软件的高度依赖&#xff0c;常常让企业望而却步&#xff0c;美摄科技凭借其强大的技术实力和创新能力&#xff0c;推出了面向企业用户的Web端云剪辑解决方案&#xff0c;为企业提供一站式、高效、便捷的视频生产平台。 B…

[WMCTF2020]Make PHP Great Again 2.01

又是php代码审计,开始吧. 这不用审吧&#xff0c;啊喂. 意思就是我们要利用require_once()函数和传入的file的value去读取flag的内容.&#xff0c;貌似呢require_once()已经被用过一次了&#xff0c;直接读取还不行&#xff0c;看一下下面的知识点. require_once() require…

【C++位图】构建灵活的空间效率工具

目录 位图位图的基本概念如何用位图表示数据位图的基本操作setresettest 封装位图的设计 总结 在计算机科学中&#xff0c;位图&#xff08;Bitmap&#xff09;是一种高效的空间管理数据结构&#xff0c;广泛应用于各种场景&#xff0c;如集合操作、图像处理和资源管理。与传统…

【Docker】基于docker compose部署artifactory-cpp-ce服务

基于docker compose部署artifactory-cpp-ce服务 1 环境准备2 必要文件创建与编写3 拉取镜像-创建容器并后台运行4 访问JFog Artifactory 服务 1 环境准备 docker 以及其插件docker compose &#xff0c;我使用的版本如下图所示&#xff1a; postgresql 的jdbc驱动, 我使用的是…

Qt优秀开源项目之二十三:QSimpleUpdater

QSimpleUpdater是开源的自动升级模块&#xff0c;用于检测、下载和安装更新。 github地址&#xff1a;https://github.com/alex-spataru/QSimpleUpdater QSimpleUpdater目前Star不多&#xff08;911个&#xff09;&#xff0c;但已在很多开源项目看到其身影&#xff0c;比如Not…

Scikit-LearnTensorFlow机器学习实用指南(三):一个完整的机器学习项目【下】

机器学习实用指南(三)&#xff1a;一个完整的机器学习项目【下】 作者&#xff1a;LeonG 本文参考自&#xff1a;《Hands-On Machine Learning with Scikit-Learn & TensorFlow 机器学习实用指南》&#xff0c;感谢中文AI社区ApacheCN提供翻译。 本文全部代码和数据集保存在…

Rust - 字符串:str 与 String

在其他语言中&#xff0c;字符串通常都会比较简单&#xff0c;例如 “hello, world” 就是字符串章节的几乎全部内容了。 但是Rust中的字符串与其他语言有所不同&#xff0c;若带着其他语言的习惯来学习Rust字符串&#xff0c;将会波折不断。 所以最好先忘记脑中已有的关于字…

LiveNVR监控流媒体Onvif/RTSP功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大

LiveNVR监控流媒体Onvif/RTSP功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大 1、视频广场2、录像回看3、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、视频广场 视频广场 -》播放 &#xff0c;左键单击可以拉取矩形框&#xff0c;放大选中的范围&#xff…

汽车总线之----FlexRay总线

Introduction 随着汽车智能化发展&#xff0c;车辆开发的ECU数量不断增加&#xff0c;人们对汽车系统的各个性能方面提出了更高的需求&#xff0c;比如更多的数据交互&#xff0c;更高的传输带宽等。现如今人们广泛接受电子功能来提高驾驶安全性&#xff0c;像ABS防抱死系统&a…

网络安全 DVWA通关指南 DVWA Weak Session IDs(弱会话)

DVWA Weak Session IDs&#xff08;弱会话&#xff09; 文章目录 DVWA Weak Session IDs&#xff08;弱会话&#xff09;Low LevelMedium LevelHigh LevelImpossible Level 参考文献 WEB 安全靶场通关指南 相关阅读 Brute Force (爆破) Command Injection&#xff08;命令注入…

SpringSecurity-用户认证

1、用户认证 1.1 用户认证核心组件 我们系统中会有许多用户&#xff0c;确认当前是哪个用户正在使用我们系统就是登录认证的最终目的。这里我们就提取出了一个核心概念&#xff1a;当前登录用户/当前认证用户。整个系统安全都是围绕当前登录用户展开的&#xff0c;这个不难理…

基于Spring JDBC AbstractRoutingDataSource 实现动态数据源

AbstractRoutingDataSource 实现动态数据源 AbstractRoutingDataSource 即抽象的路由数据源&#xff0c;提供了动态数据源切换的机制。你可以通过实现它的 determineCurrentLookupKey() 方法&#xff0c;根据不同的条件返回对应的数据源 key&#xff0c;基于这点可以根据外部输…

C语言 fwirte 函数 - C语言零基础入门教程

目录 一.fwirte 函数简介二.fwirte 函数使用三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.fwirte 函数简介 C 语言文件读写&#xff0c;fread 函数用于读取文件中的数据到指定缓冲区中&#xff0c;而 fwrite 函数用于把缓冲区数据写入到文件…

从1岁活到80岁很平凡 chatgpt 到底能干啥

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少。 Introduction ChatGPT是一款基于人工智能技术的聊天机器人,可以自动回复用户的问题和提供…

【算法题】72. 编辑距离-力扣(LeetCode)

【算法题】72. 编辑距离-力扣(LeetCode) 1.题目 下方是力扣官方题目的地址 72. 编辑距离 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个…

公交IC卡收单管理系统 多处 SQL注入致RCE漏洞复现

0x01 产品简介 公交IC卡收单管理系统是城市公共交通领域中不可或缺的一部分,它通过集成先进的集成电路技术(IC卡)实现了乘客便捷的支付方式,并有效提高了公共交通运营效率。系统集成了发卡、充值、消费、数据采集、查询和注销等多个功能模块,为公交公司和乘客提供了全面、…

使用shardingsphere实现mysql数据库分片

在大数据时代&#xff0c;随着业务数据量的不断增长&#xff0c;单一的数据库往往难以承载大规模的数据处理需求。数据库分片&#xff08;Sharding&#xff09;是一种有效的数据库扩展技术&#xff0c;通过将数据分布到多个数据库实例上&#xff0c;提高系统的性能和可扩展性。…