当前位置: 首页 > news >正文

软件无线电2:矢量信号器和HackRF实现FM调制解调

       前面实现了在matlab平台下的FM收发,那么如果将matlab中的数据应用在真实的无线电台中会是怎样呢?于是我们借助矢量信号器和HackRF实现了射频下的FM调制解调。注意本文仅用于科研和学习,私自搭建电台属于违法行为。

1. 概述

整体实现框图如下所示:

图1 矢量信号器和HackRF One实现FM调制解调框图

        Matlab完成FM调制后,将FM调制后的基带IQ数据通过网口发送到矢量信号器,矢量信号器将基带IQ转换为射频信号发射,用HackRF One作为接收机接收FM信号,最后使用计算机开源软件SDRSharp监听FM解调后的语音。测试所用矢量信号器如图2所示:

图2 矢量信号器

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

图3 矢量信号器、HackRF One和计算机接线 

        用一根网线一端连接矢量信号器,另一端连接至计算机,如图4所示,用于计算机上Matlab软件通过计算机网口将FM调制后的基带IQ数据导入矢量信号器。

图4 网线连接矢量信号器和计算机

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。时域波形如图5所示,

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

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信号

查表法实现FM信号调制,MATLAB产生DDS,代码如下:

%************************* 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;

3.矢量信号器生成FM射频信号

        Matlab软件通过计算机网口将FM调制后的基带IQ数据导入矢量信号器,然后由矢量信号器转换为射频信号,代码如下:

%% 导入矢量信号器
download_fs_data = fs1/1e6;
download_save_name='test_signal';
ipaddress='192.167.2.179';
SMB_data_Download(x,download_fs_data,download_save_name,ipaddress);

矢量信号器将网口接收到的基带IQ转换为射频信号发射,步骤如下:

步骤一:用网线连接电脑和矢量信号器,并查询矢量信号器的IP地址,设置电脑IP地址,使其和矢量信号器IP地址在同一网段。

步骤二:设置矢量信号器频率和幅值。

步骤三:在MATLAB里,将上一章生成的FM调制基带IQ信号通过网口导入矢量信号器里,即运行Matlab代码,导入基带IQ数据完成后,会自动开启矢量信号器发送使能开关,矢量信号器循环发送FM信号。

4.HackRF One接收FM射频信号

        用射频线一端连接矢量信号器的发接口,另一端连接HackRF One的天线接口,即ANT接口;HackRF One的USB接口连接电脑的USB接口,用以给HackRF One供电和连接开源软件SDRSharp。

5.开源软件SDRSharp监听FM解调后的语音

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

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

图6 SDRSharp设置选择HackRF One

步骤二:选择Radio模式,WFM

图7 SDRSharp选择WFM

步骤三:打开监听开关

图8 SDRSharp打开监听开关

步骤四:设置监听频率91MHz

图9 SDRSharp设置监听频率

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

图10 SDRSharp设置音量和增益

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 32.递归、搜索、回溯之floodfill算法
  • com.microsoft.sqlserver:sqljdbc4:jar:4.0 was not found产生原因及解决步骤
  • Zabbix的安装与基本使用(主机群组、应用集、监控项、触发器、动作、媒介)
  • C++设计模式(更新中)
  • Linux 常用指令
  • 苹果Vision Pro曝出严重漏洞,黑客可通过用户眼动输入窃取信息
  • vue之我不会
  • Pytest配置文件pytest.ini如何编写生成日志文件?
  • (PySpark)RDD实验实战——取最大数出现的次数
  • Python 入门教程(3)基础知识 | 3.2、缩进规则
  • 【图像匹配】基于Harris算法的图像匹配,matlab实现
  • 探索LangChain的JSON加载器:轻松处理JSON和JSONL数据
  • STM32 如何生成随机数
  • Java或者前端 实现中文排序(调API的Demo)
  • Gateway学习笔记
  • 【node学习】协程
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • go语言学习初探(一)
  • Intervention/image 图片处理扩展包的安装和使用
  • nodejs:开发并发布一个nodejs包
  • 半理解系列--Promise的进化史
  • 记一次和乔布斯合作最难忘的经历
  • 解析 Webpack中import、require、按需加载的执行过程
  • 面试遇到的一些题
  • 区块链将重新定义世界
  • 使用agvtool更改app version/build
  • 详解NodeJs流之一
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​人工智能书单(数学基础篇)
  • ​什么是bug?bug的源头在哪里?
  • #QT(一种朴素的计算器实现方法)
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1) caustics\
  • (day 12)JavaScript学习笔记(数组3)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (不用互三)AI绘画工具应该如何选择
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (六)Hibernate的二级缓存
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (四)React组件、useState、组件样式
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core中的去虚
  • .Net 应用中使用dot trace进行性能诊断
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接