Xilinx 使用DDS实现本振混频上下变频

文章目录

  • 一、什么是混频?
  • 二、为什么要进行混频?
  • 三、Matlab实现混频操作
  • 四、FPGA实现混频上下变频操作
    • 4.1 例化IP
    • 4.2 仿真验证


一、什么是混频?

  混频(Mixing)是信号处理中的一个核心概念,混频的本质是将两个信号相乘,从而产生新的频率分量。混频是将两个信号相乘的操作,通常一个是输入信号,另一个是称为“本振信号”(LO, Local Oscillator)的载波信号。混频产生的结果是:

  1. 和频: f 1 + f 2 f_1+f_2 f1+f2
  2. 差频: f 1 − f 2 f_1-f_2 f1f2

  设两个信号分别为 x 1 ( t ) = s i n ( 2 π f 1 t ) x_1(t)=sin(2πf_1t) x1(t)=sin(2πf1t) x 2 ( t ) = s i n ( 2 π f 2 t ) x_2(t)=sin(2πf_2t) x2(t)=sin(2πf2t),混频后的结果为:

x m i x e d ( t ) = s i n ( 2 π f 1 t ) ⋅ s i n ( 2 π f 2 t ) = 1 / 2 [ c o s ( 2 π ( f 1 − f 2 ) t ) − c o s ( 2 π ( f 1 + f 2 ) t ) ] x mixed(t)=sin(2πf_1 t)⋅sin(2πf_2t)= 1/2 [cos(2π(f_1 −f_2)t)−cos(2π(f_1 +f_2 )t)] xmixed(t)=sin(2πf1t)sin(2πf2t)=1/2[cos(2π(f1f2)t)cos(2π(f1+f2)t)]

  由此可以看到,混频的结果包含两个新的频率成分: f 1 + f 2 f_1+f_2 f1+f2 f 1 − f 2 f_1-f_2 f1f2

二、为什么要进行混频?

  混频有多种用途,尤其在无线通信和音频处理领域应用广泛。以下是混频的几个主要应用场景:

  1. 频率转换
      混频最常见的用途是将信号从一个频率范围转换到另一个频率范围:
  • 下变频:把高频信号转换为较低的中频或基带频率,便于后续的处理。这通常用于接收端。例如,在无线通信中,天线接收到的信号是高频信号,直接处理非常困难。通过混频下变频,信号被转换成更低的中频(如几百kHz),便于解调和滤波。
  • 上变频:把基带信号(低频信号)提升到高频,方便通过天线发送。这通常用于发送端。例如,音频信号的频率范围为20 Hz至20 kHz,但需要通过载波信号(如88 MHz到108 MHz的FM频段)进行上变频,才能通过天线发射到远处。
  1. 调制和解调
      混频是信号调制和解调的基础:
  • 调制:是将低频的基带信号移到高频,便于在通信链路上传输。调制技术包括幅度调制(AM)、频率调制(FM)和相位调制(PM),它们的核心操作之一就是混频。例如,在AM(幅度调制)中,基带信号和高频载波信号混频后,形成具有和频和差频成分的信号,这个信号可以通过载波频率发送出去。
  • 解调:在接收端,信号通过混频还原到基带信号。混频器在接收端使用本地振荡器(LO)信号与接收到的高频信号混合,得到基带信号,之后进行后续处理。例如,在FM解调中,接收到的高频信号与本振信号混频,下变频到基带后,再通过其他方法提取出原始的音频信号。
  1. 频谱搬移
      通过混频,信号的频谱可以被移动到特定的频段,这使得信号更容易处理或分析。例如,将宽带信号通过混频下变频到一个较窄的中频段后,可以用较低采样率的ADC进行数字化处理,节省硬件资源。

三、Matlab实现混频操作

  由上文可知,混频是在时域上将输入信号与本振信号相乘,由卷积定理可知:时域上的卷积等价于频域上的乘积,反之,时域上的乘积等价于频域上的卷积。因此我们matlab操作顺序为:

  1. 创建两个时域信号,这里设置一个5M正弦信号,一个4M正弦信号。
  2. 两个信号相乘得到一个新的信号
  3. 对这三个信号进行快速傅里叶变换。
  4. 显示这三个信号的时域波形以及频域波形。
      matlab代码如下:
% 参数设置
fs = 100e6;           % 采样频率为100 MHz
t = 0:1/fs:1e-6;      % 时间向量,1微秒的信号% 生成信号
f1 = 5e6;             % 5 MHz
f2 = 4e6;             % 4 MHz
signal1 = sin(2*pi*f1*t);  % 5 MHz 正弦信号
signal2 = sin(2*pi*f2*t);  % 4 MHz 正弦信号% 混频操作
mixed_signal = signal1 .* signal2;% 频谱计算函数
N = length(t);
f = (-N/2:N/2-1)*(fs/N);  % 频率轴
S1 = fftshift(fft(signal1));  % 对第一个信号做傅里叶变换并移频
S2 = fftshift(fft(signal2));  % 对第二个信号做傅里叶变换并移频
S_mix = fftshift(fft(mixed_signal));  % 混频信号的傅里叶变换% 时域波形绘制
figure;
subplot(3,1,1);
plot(t*1e6, signal1);  % 转换为微秒显示
title('5 MHz 信号时域波形');
xlabel('时间 (µs)');
ylabel('幅值');subplot(3,1,2);
plot(t*1e6, signal2);
title('4 MHz 信号时域波形');
xlabel('时间 (µs)');
ylabel('幅值');subplot(3,1,3);
plot(t*1e6, mixed_signal);
title('混频信号时域波形');
xlabel('时间 (µs)');
ylabel('幅值');% 频谱绘制
figure;
subplot(3,1,1);
plot(f/1e6, abs(S1)/N);
title('5 MHz 信号频谱');
xlabel('频率 (MHz)');
ylabel('幅值');subplot(3,1,2);
plot(f/1e6, abs(S2)/N);
title('4 MHz 信号频谱');
xlabel('频率 (MHz)');
ylabel('幅值');subplot(3,1,3);
plot(f/1e6, abs(S_mix)/N);
title('混频信号频谱');
xlabel('频率 (MHz)');
ylabel('幅值');

  显示结果如下:

在这里插入图片描述
  可以看到混频后的信号频谱波峰在1和9M左右,为什么频谱波形都是对称的呢?

  1. 实值信号的傅里叶变换是共轭对称的。对于实值信号(例如正弦波),其傅里叶变换的频谱会在正频率和负频率上对称。也就是说,如果输入的是一个实值信号 𝑥 ( 𝑡 ) 𝑥(𝑡) x(t),那么其傅里叶变换 X ( f ) X(f) X(f) 满足:
    X ( − f ) = X ∗ ( f ) X(-f)=X^*(f) X(f)=X(f)
      这里 X ∗ ( f ) X^*(f) X(f)表示 X ( f ) X(f) X(f)的共轭复数,因此幅度频谱对于正负频率是对称的。

  2. 一个频率为 f 0 f_0 f0的正弦信号可以表示为:
    x ( t ) = s i n ( 2 π f 0 t ) x(t)=sin(2πf_0t) x(t)=sin(2πf0t)
      使用傅里叶变换会得到两个频率分量,分别位于 f 0 f_0 f0 − f 0 -f_0 f0
    X ( f ) = 1 2 j [ σ ( f − f 0 ) − σ ( f + f 0 ) ] X(f)=\frac{1}{2j}[σ(f-f_0)-σ(f+f_0)] X(f)=2j1[σ(ff0)σ(f+f0)]
      这意味着频谱在 f 0 f_0 f0 − f 0 -f_0 f0出有幅值,导致正负频率对称。

四、FPGA实现混频上下变频操作

4.1 例化IP

  我们可以使用上一文章《FPGA实现频率、幅度、相位可调的DDS以及DDS Compiler IP核的使用验证》使用的DDS来产生两个不同频率的正弦信号,然后通过一个乘法器对两个信号进行相乘,然后观察相乘之后的波形。可以用自己写的DDS也可以使用IP,这里使用IP快速的进行仿真,IP例化如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  第二个DDS设置也是同样的步骤,选择4Mhz输出,这里不再赘述。然后例化乘法器:

在这里插入图片描述

4.2 仿真验证

  仿真代码如下:

`timescale 1ns / 1ps
module tb_ddsmixer();reg                                                 aclk    ;
reg                                                 aresetn ;
wire                                                m_axis_data_tvalid1 ;
wire            [15:0]                              m_axis_data_tdata1  ;
wire                                                m_axis_data_tvalid2 ;
wire            [15:0]                              m_axis_data_tdata2  ;
wire            [31:0]                              mixer   ;initial beginaclk = 0;aresetn = 0;#100;aresetn =1;
endalways #5 aclk = ~aclk;dds_compiler_0 u0_4Mhz_sin (.aclk(aclk),                              // input wire aclk.aresetn(aresetn),                        // input wire aresetn.m_axis_data_tvalid(m_axis_data_tvalid1),  // output wire m_axis_data_tvalid.m_axis_data_tdata(m_axis_data_tdata1)    // output wire [15 : 0] m_axis_data_tdata
);dds_compiler_1 u0_5Mhz_sin (.aclk(aclk),                              // input wire aclk.m_axis_data_tvalid(m_axis_data_tvalid2),  // output wire m_axis_data_tvalid.m_axis_data_tdata(m_axis_data_tdata2)    // output wire [15 : 0] m_axis_data_tdata
);mult_gen_0 your_instance_name (.CLK(aclk),  // input wire CLK.A(m_axis_data_tdata1),      // input wire [15 : 0] A.B(m_axis_data_tdata2),      // input wire [15 : 0] B.P(mixer)      // output wire [31 : 0] P
);endmodule

  打开仿真:

在这里插入图片描述
  我们可以看出混频后的波形整体频率较小,然后再叠加了高频的信号,我们用时标看一下频率是多少:

在这里插入图片描述
  可以看到,整体的波形频率为1Mhz,对应的是差频信号 f 1 − f 2 f_1-f_2 f1f2=5M - 4M = 1M。我们再来看高频信号频率:
在这里插入图片描述  可以看到,整体的波形频率为1/110=9.09M,对应的是和频信号 f 1 + f 2 f_1+f_2 f1+f2=5M + 4M = 9M。

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

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

相关文章

C语言 | Leetcode C语言题解之第435题无重叠区间

题目: 题解: int cmp(int** a, int** b) {return (*a)[1] - (*b)[1]; }int eraseOverlapIntervals(int** intervals, int intervalsSize, int* intervalsColSize) {if (intervalsSize 0) {return 0;}qsort(intervals, intervalsSize, sizeof(int*), cm…

Git版本控制的使用教程

使用Git进行项目代码的版本控制,具体操作: 1). 创建Git本地仓库 当Idea中出现: 说明本地仓库创建成功。 2). 创建Git远程仓库 访问Gitee - 基于 Git 的代码托管和研发协作平台,新建仓库 点击 创建 3). 将本地文件推送到Git远程…

typename、非类型模板参数、模板参数的特化、模板类成员函数声明和定义分离、继承等的介绍

文章目录 前言一、typename二、非类型模板参数三、模板参数的特化1. 函数模板参数的特化2. 类模板的特化 四、模板类成员函数声明和定义分离1. 显示实例化(不建议使用)2. 将生命和定义写在同一个.h文件中 五、 继承总结 前言 typename、非类型模板参数、…

基于DAMODEL——Faster-RCNN 训练与测试指南

Faster-RCNN 训练与测试指南 前言 今天我们要来实现一个经典的目标检测模型:Faster-Rcnn。我们使用DAMODEL云平台来实现,这是个很强大的云端平台,功能众多,你可以投你所好去进行你想做的事情。 1. 环境与工具准备 1.1 远程连接…

【漏洞复现】用友 U8CRM getemaildata.php 任意文件读取漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

【VMware及CentOS7】安装 配置

一、VMware安装 这里选择的版本是16.1.2,这里不再赘述安装过程,无难点。 crack key: ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2UT6 ZF71R-DMX85-08DQY-8YMNC-PPHV8 110L3-9135J-M807A-08ARK-84V7L FF31K-AHZD1-H8ETZ-8WWE…

性能监控之Python实战SkyWalking链路追踪

文章目录 一、介绍二、SkyWalking支持的语言三、SkyWalking安装3.1 前提准备3.2 先安装ElasticSearch7.X3.3 Skywalking-OAP 安装3.4 Skywalking-UI 界面安装3.5 访问页面检查SkyWalking是否可以访问 四、Python 项目接入SkyWalking4.1 演示项目代码4.2 验证 sw-python4.3 配置…

【最基础最直观的排序 —— 选择排序算法】

最基础最直观的排序 —— 选择排序算法 选择排序算法是一种简单直观的排序算法。其基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小&a…

模型Alignment之RLHF与DPO

1. RLHF (Reinforcement Learning from Human Feedback) RLHF 是一种通过人类反馈来强化学习的训练方法,它能够让语言模型更好地理解和执行人类指令。 RLHF 的三个阶段 RLHF 的训练过程一般分为三个阶段: 监督微调(Supervised Fine-Tuning,…

echarts 导出pdf空白原因

问题阐述 页面样式: 导出pdf: 导出pdf,统计图部分为空白。 问题原因 由于代码中进行了dom字符串的复制,而echarts用canvas绘制,canvas内部内容不会进行复制,只会复制canvas节点,因此导出pdf空白。 解决…

1. IP地址介绍

IP地址 一、网络概述1、网络类型2、网络组成、传输介质2.1 组成2.2 传输介质 二、IP地址1、IP地址的表示方法2、IP地址的组成3、IP地址的类型3.1 根据IP地址第一个字节大小来分3.1.1 单播地址 Unicast 3.2 根据IP地址的使用 三、子网掩码 netmask1、默认的子网掩码2、判断多个I…

游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)

1.静态合批与动态合批的原理是什么?有什么限制条件?为什么?对CPU和GPU产生的影响分别是什么? 原理:Unity运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们,就是一个drawcall批次。 限…

MyBatis—Plus 快速上手【后端 22】

MyBatis-Plus 使用入门指南 前言 在Java的持久层框架中,MyBatis因其灵活性和易用性而广受欢迎。然而,随着项目规模的扩大,MyBatis的一些重复性工作(如CRUD操作)开始显得繁琐。为了解决这一问题,MyBatis-Pl…

图论系列(dfs)9/24

岛屿问题: 二叉树dfs遍历的框架代码: 要有一个终止条件、访问相邻节点; public void dfs(Treenode root){if(rootnull)return;dfs(root.left);dfs(root.right);} 网格dfs遍历的框架代码: public void dfs(int[][] grid,int x,int y){//如果x、y坐标不在网格里面 …

专业学习|随机规划概观(内涵、分类以及例题分析)

一、随机规划概览 (一)随机规划的定义 随机规划是通过考虑随机变量的不确定性来制定优化决策的一种方法。其基本思想是在决策过程中,目标函数和约束条件可以包含随机因素。 (1)重点 随机规划的中心问题是选择参数&am…

学习一下怎么用git

目录 初始化操作 设置名字: 设置邮箱: 查询状态 初始化本地仓库 清空git bush控制台 git的三个区域 文件提交 将会文件提交到暂存区 暂存指定文件 暂存所有改动文件 查看暂存区里面的文件 将文件提交到版本库 git文件状态查看 ​编辑 暂存区的相关指令…

时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较

引言 近年来,民航旅客周转量一直是衡量国家或地区民航运输总量的重要指标之一。为了揭示民航旅客周转量背后的规律和趋势,本研究旨在综合分析1990年至2023年的相关数据。 通过单位根检验和序列分解,我们确定了民航旅客周转量数据的非平稳性&…

MySQL(面试题 - 同类型归纳面试题)

目录 一、MySQL 数据类型 1. 数据库存储日期格式时,如何考虑时区转换问题? 2. Blob和text有什么区别? 3. mysql里记录货币用什么字段类型比较好? 4. MySQL如何获取当前日期? 5. 你们数据库是否支持emoji表情存储&…

也遇到过 PIL Image “image file is truncated“的问题

背景前言 属于活久见系列,最近工作上遇了该问题! 背景:前端 APP使用 Android CameraX 的接口,拍摄并上传图片,然后 Python后端服务对图片裁剪与压缩处理。后端服务处理图片时有遇到image file is truncated的情况。还…

Leetcode 螺旋矩阵

算法思想: 这个算法的目标是按照顺时针螺旋的顺序从矩阵中取出元素。为了做到这一点,整个思路可以分成几个关键步骤: 定义边界:首先需要定义四个边界变量: left:当前左边界的索引。right:当前右…