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

news2024/9/20 17:18:27

       前面实现了在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_len
    w_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; % 负的溢出时
    end
    
    rrom_addr=round(w_r/2^22);%读查找表的地址
    if rrom_addr == 0
        rrom_addr =1;
    end
    dac_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设置音量和增益

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的?

【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的&#xff1f; 【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的&#xff1f; 文章目录 【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的&#xff1f;1. 什么是梯度&#xff1f;2.梯度…

【网络安全】分享4个高危业务逻辑漏洞

未经许可,不得转载。 文章目录 正文逻辑漏洞1逻辑漏洞2逻辑漏洞3逻辑漏洞4其它正文 该目标程序是一家提供浏览器服务的公司,其核心功能是网页抓取和多账户登录操作,类似于浏览器中的隐身模式,但更加强大和高效。通过该平台,用户可以轻松管理并同时运行数百个隐身浏览器实…

【Python123题库】#绘制温度曲线 #XRD谱图绘制 #态密度曲线绘制

禁止转载&#xff0c;原文&#xff1a;https://blog.csdn.net/qq_45801887/article/details/140087866 参考教程&#xff1a;B站视频讲解——https://space.bilibili.com/3546616042621301 有帮助麻烦点个赞 ~ ~ Python123题库 绘制温度曲线XRD谱图绘制态密度曲线绘制 绘制温度…

【LeetCode】每日一题 2024_9_16 公交站间的距离(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;公交站间的距离 代码与解题思路 func distanceBetweenBusStops(distance []int, start int, destination int) int {// 首先让 start > destination, 这两个谁大对结果没有影响&#…

监控易监测对象及指标之:全面监控DB2_linux数据库

在数字化时代&#xff0c;数据库作为企业核心数据资产的存储和管理中心&#xff0c;其稳定性和性能直接关系到业务的连续性和效率。DB2作为IBM推出的关系型数据库管理系统&#xff0c;广泛应用于各种业务场景。为了确保DB2_linux数据库的稳定运行和高效性能&#xff0c;全面而细…

【已解决】关于错误 UnicodeEncodeError: ‘gbk‘ codec can‘t encode character

某次爬取一个网站的时候UnicodeEncodeError: gbk codec cant encode character \xa9 in position 19417: illegal multibyte sequence 尝试了很多个办法&#xff0c; def get_page(self):headers {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)…

浏览器插件利器--allWebPluginV2.0.0.20-beta版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

Jenkins基于tag的构建

文章目录 Jenkins参数化构建设置设置gitlab tag在工程中维护构建的版本按指定tag的版本启动服务 Jenkins参数化构建设置 选择参数化构建&#xff1a; 在gradle构建之前&#xff0c;增加执行shell的步骤&#xff1a; 把新增的shell框挪到gradle构建之前&#xff0c; 最后保存 …

【代码随想录训练营第42期 Day59打卡 - 图论Part9 - Bellman-Ford算法

目录 一、Bellman-Ford算法 定义 特性 伪代码实现 二、经典题目 题目&#xff1a;卡码网 94. 城市间货物运输 I 题目链接 题解&#xff1a; Bellman-Ford算法 三、小结 一、Bellman-Ford算法 定义 Bellman-Ford算法是一个迭代算法&#xff0c;它可以处理包含负权边的…

深入解析Transformer原理

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Transformer架构的出现无疑是一个里程碑式的进展。从Google的BERT到OpenAI的GPT系列&#xff0c;Transformer已经成为许多前沿AI模型的核心。今天&#xff0c;我们就来深入探讨Transformer的原理&#xff0c;帮助你更…

CleanMyMac 5 for Mac 最新中文破解版下载 系统优化垃圾清理工具

今天给大家带来的是CleanMyMac最新款CleanMyMac 5&#xff0c;它是一个全面的Mac清理和维护工具&#xff0c;通过提供多项强大的功能&#xff0c;帮助用户简化日常维护任务&#xff0c;提升系统性能&#xff0c;同时保护个人隐私和安全。无论是新手还是经验丰富的Mac用户&#…

Linux进程等待 | 程序替换

进程终止 一个进程退出了&#xff0c;无非只有三种情况&#xff1a; 代码跑完了&#xff0c;结果正确代码跑完了&#xff0c;结果不正确代码没跑完&#xff0c;程序异常退出了 代码跑完了&#xff0c;我们可以通过退出码获取其结果是否正确&#xff0c;&#xff08;这个退出…

Qt 模型视图(四):代理类QAbstractItemDelegate

文章目录 Qt 模型视图(四):代理类QAbstractItemDelegate1.基本概念1.1.使用现有代理1.2.一个简单的代理 2.提供编辑器3.向模型提交数据4.更新编辑器的几何图形5.编辑提示 Qt 模型视图(四):代理类QAbstractItemDelegate ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方…

手写流程图元素检测系统源码分享

手写流程图元素检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

安装WINDOWS微软商店已下架的WSL系统,以UBUNTU 16.04 为例

下载WSL系统 方法1&#xff1a;POWERSHELL 用powershell下载 PowerShell Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1604 -OutFile Ubuntu.appx -UseBasicParsing 1 如果下载时间很长&#xff0c;可以这样把进度条关闭&#xff1a; $ProgressPreference Silentl…

Vue特性

Vue概念 Soc原则&#xff1a;关注点分离原则 Vue 的核心库只关注视图层&#xff0c;方便与第三方库或既有项目整合 Model&#xff08;模型&#xff09;&#xff1a;表示应用程序的核心数据和业务逻辑。模型通常包含数据和与数据相关的操作。它独立于视图和视图模型&#xff…

Rust表达一下中秋祝福,群发问候!

一、Rust表达一下中秋祝福 在Rust中&#xff0c;表达中秋佳节的祝福可以通过定义一个包含祝福语的字符串变量&#xff0c;并使用标准输出函数来打印这个字符串。以下是一个简单的Rust程序示例&#xff0c;用于展示如何用Rust编写并打印中秋佳节的祝福语&#xff1a; fn main()…

3谐振功率放大器的实际电路设计

1原理电路 下图是谐振功率放大器的原理电路&#xff0c;如果我们照着下图搭一个电路&#xff0c;会发现它可能实现不了功率放大?这是为什么&#xff1f; 2实际电路设计 2.1要注意直流馈电线路 馈电原则(馈电供电)&#xff1a; 1&#xff09;保证直流电流分量流过直流电源&…

wordpress源码资源站整站打包32GB数据,含6.7W条资源数据

源码太大了&#xff0c;足足32gb&#xff0c;先分享给大家。新手建立资源站&#xff0c;直接用这个代码部署一下&#xff0c;数据就够用了。辅助简单做下seo&#xff0c;一个新站就OK了。 温馨提示&#xff1a;必须按照顺序安装 代码下载

【Linux】理解和解释shell命令的工具

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;C语言编程&…