Xilinx 使用DDS实现本振混频上下变频
文章目录
- 一、什么是混频?
- 二、为什么要进行混频?
- 三、Matlab实现混频操作
- 四、FPGA实现混频上下变频操作
- 4.1 例化IP
- 4.2 仿真验证
一、什么是混频?
混频(Mixing)是信号处理中的一个核心概念,混频的本质是将两个信号相乘,从而产生新的频率分量。混频是将两个信号相乘的操作,通常一个是输入信号,另一个是称为“本振信号”(LO, Local Oscillator)的载波信号。混频产生的结果是:
- 和频: f 1 + f 2 f_1+f_2 f1+f2
- 差频: f 1 − f 2 f_1-f_2 f1−f2
设两个信号分别为 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π(f1−f2)t)−cos(2π(f1+f2)t)]
由此可以看到,混频的结果包含两个新的频率成分: f 1 + f 2 f_1+f_2 f1+f2和 f 1 − f 2 f_1-f_2 f1−f2
二、为什么要进行混频?
混频有多种用途,尤其在无线通信和音频处理领域应用广泛。以下是混频的几个主要应用场景:
- 频率转换
混频最常见的用途是将信号从一个频率范围转换到另一个频率范围:
- 下变频:把高频信号转换为较低的中频或基带频率,便于后续的处理。这通常用于接收端。例如,在无线通信中,天线接收到的信号是高频信号,直接处理非常困难。通过混频下变频,信号被转换成更低的中频(如几百kHz),便于解调和滤波。
- 上变频:把基带信号(低频信号)提升到高频,方便通过天线发送。这通常用于发送端。例如,音频信号的频率范围为20 Hz至20 kHz,但需要通过载波信号(如88 MHz到108 MHz的FM频段)进行上变频,才能通过天线发射到远处。
- 调制和解调
混频是信号调制和解调的基础:
- 调制:是将低频的基带信号移到高频,便于在通信链路上传输。调制技术包括幅度调制(AM)、频率调制(FM)和相位调制(PM),它们的核心操作之一就是混频。例如,在AM(幅度调制)中,基带信号和高频载波信号混频后,形成具有和频和差频成分的信号,这个信号可以通过载波频率发送出去。
- 解调:在接收端,信号通过混频还原到基带信号。混频器在接收端使用本地振荡器(LO)信号与接收到的高频信号混合,得到基带信号,之后进行后续处理。例如,在FM解调中,接收到的高频信号与本振信号混频,下变频到基带后,再通过其他方法提取出原始的音频信号。
- 频谱搬移
通过混频,信号的频谱可以被移动到特定的频段,这使得信号更容易处理或分析。例如,将宽带信号通过混频下变频到一个较窄的中频段后,可以用较低采样率的ADC进行数字化处理,节省硬件资源。
三、Matlab实现混频操作
由上文可知,混频是在时域上将输入信号与本振信号相乘,由卷积定理可知:时域上的卷积等价于频域上的乘积,反之,时域上的乘积等价于频域上的卷积。因此我们matlab操作顺序为:
- 创建两个时域信号,这里设置一个5M正弦信号,一个4M正弦信号。
- 两个信号相乘得到一个新的信号
- 对这三个信号进行快速傅里叶变换。
- 显示这三个信号的时域波形以及频域波形。
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左右,为什么频谱波形都是对称的呢?
-
实值信号的傅里叶变换是共轭对称的。对于实值信号(例如正弦波),其傅里叶变换的频谱会在正频率和负频率上对称。也就是说,如果输入的是一个实值信号 𝑥 ( 𝑡 ) 𝑥(𝑡) 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)的共轭复数,因此幅度频谱对于正负频率是对称的。 -
一个频率为 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[σ(f−f0)−σ(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 f1−f2=5M - 4M = 1M。我们再来看高频信号频率:
可以看到,整体的波形频率为1/110=9.09M,对应的是和频信号 f 1 + f 2 f_1+f_2 f1+f2=5M + 4M = 9M。
相关文章:

Xilinx 使用DDS实现本振混频上下变频
文章目录 一、什么是混频?二、为什么要进行混频?三、Matlab实现混频操作四、FPGA实现混频上下变频操作4.1 例化IP4.2 仿真验证 一、什么是混频? 混频(Mixing)是信号处理中的一个核心概念,混频的本质是将两个…...

ClickHouse-Kafka Engine 正确的使用方式
Kafka 是大数据领域非常流行的一款分布式消息中间件,是实时计算中必不可少的一环,同时一款 OLAP 系统能否对接 Kafka 也算是考量是否具备流批一体的衡量指标之一。ClickHouse 的 Kafka 表引擎能够直接与 Kafka 系统对接,进而订阅 Kafka 中的 …...

PTA L1-071 前世档案
L1-071 前世档案(20分) 网络世界中时常会遇到这类滑稽的算命小程序,实现原理很简单,随便设计几个问题,根据玩家对每个问题的回答选择一条判断树中的路径(如下图所示),结论就是路径终…...

解决mac下 Android Studio gradle 下载很慢,如何手动配置
抓住人生中的一分一秒,胜过虚度中的一月一年! 小做个动图开篇引题 前言 平时我们clone git 上项目,项目对应gradle版本本地没有,ide编译会自动下载,但是超级慢可能还下载失败,下面讲解下此问题如 如下图所示ÿ…...

第三篇 第17章 工程计量与支付
第三篇 工程计价 第17章 工程计量与支付 17.1 工程计量 17.1.1 工程计量的原则 承包人完成合同工程且应予计量的工程数量确定计量周期可以月为单位,也可以按其他时间节点、工程形象进度分段计量因承包人原因造成的超出合同工程范围施工或返工的工程量、发包人不予计量 17.1…...

[半导体检测-1]:半导体检测概述
前言: 半导体检测是半导体产业链中不可或缺的一环,它贯穿于产品生产制造流程的始终,对于提高产线良率、提升产品竞争实力具有关键作用。以下是对半导体检测的详细概述: 一、什么是半导体检测 半导体检测是指运用专业技术手段&a…...

公共字段自动填充
问题分析 总会有些公共字段,例如创建时间和创建人 实现思路 对mapper定义注解,使用切面思想来判断是不是更新和新增操作对于指定的操作来更新公共字段 自定义操作类型 package com.sky.enumeration;/*** 数据库操作类型*/ public enum OperationType {/*…...

超详细 Git 教程:二十篇博客,三万字干货
Git 是最流行的版本管理工具,可以说是任何程序员都应该掌握的工具。 当然,其他人也可以学习它用来进行版本控制 为此,我将之前学习 Git 时的笔记整理了下(预计有二十篇),作为博客发出来,希望能帮…...

“出参”和“入参”的命名由来
有些开发者会用“入参”和“出参”来描述函数、方法或接口的参数和返回值。尽管我们基本都知道“入参”就是方法的参数,“出参”就是返回值。但是对于一些起步就是JAVA的开发者来说,可能并不清楚这两个名词的由来。这篇文章就来分享一下关于“入参”和“…...

webrtc gclient sync报错问题解决
报错信息 strp_current_url current_url[:-4] if current_url.endswith( ^^^^^^^^^^^^^^^^^^^^ AttributeError: ‘NoneType’ object has no attribute ‘endswith’ gclient syncsrc/base (ERROR) ---------------------------------------- [0:00:00] Started. ----------…...

FLUX模型,或许这几点你还未曾都了解,最详细的Flux模型介绍(附模型安装包)
当我们还在沉浸在惊叹和体验快手的Kolors模型之时,SD原开发团队组成的“黑森林”出的FLUX模型就袭来了。我们不得不感叹FLUX模型给我们带来的冲击,模型所绘制的画面质感、精细度的确让我们眼前一亮,之前发布的SD3开源模型给我们带来的些许失落…...

RAG(Retrieval-Augmented Generation)检索增强生成技术基础了解学习与实践
RAG(Retrieval-Augmented Generation)是一种结合了信息检索(Retrieval)和生成模型(Generation)的技术,旨在提高生成模型的性能和准确性。RAG 技术通过在生成过程中引入外部知识库,使…...

基于SpringBoot实现高性能缓存组件
1. 简介 为了体现我们的实力,首先我们要有造轮子的能力。这意味着我们不仅要熟练掌握现有的技术栈和框架,还要具备深厚的技术功底。通过自主设计和实现关键组件,如高性能缓存系统,我们能够深入理解技术背后的原理,掌握…...

【深度学习基础模型】递归神经网络 (Recurrent Neural Networks, RNN) 详细理解并附实现代码。
【深度学习基础模型】递归神经网络 (Recurrent Neural Networks, RNN) 【深度学习基础模型】递归神经网络 (Recurrent Neural Networks, RNN) 文章目录 【深度学习基础模型】递归神经网络 (Recurrent Neural Networks, RNN)1.算法原理介绍:递归神经网络 (Recurrent…...

python全栈学习记录(十九) hashlib、shutil和tarfile、configparser
hashlib、shutil和tarfile、configparser 文章目录 hashlib、shutil和tarfile、configparser一、hashlib二、shutil和tarfile1.shutil2.tarfile 三、configparser 一、hashlib hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值。如果把hash…...

RL进阶(一):变分推断、生成模型、SAC
参考资料: 视频课程《CS285: Deep Reinforcement Learning, Decision Making, and Control》第18讲、第19讲,Sergey Levine,UCerkeley课件PDF下载:https://rail.eecs.berkeley.edu/deeprlcourse/主要内容:变分推断、生成模型、以及Soft Actor-Critic。变分推断在model-bas…...

WPF 绑定 DataGrid 里面 Button点击事件 TextBlock 双击事件
TextBlock双击事件 <DataGridTemplateColumn Width"*" Header"内标"><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid><TextBlockBackground"Transparent"Tag"{Binding InternalId}"Text"…...

828华为云征文|华为云Flexus云服务器X实例Windows系统部署一键短视频生成AI工具moneyprinter
在追求创新与效率并重的今天,我们公司迎难而上,决定自主搭建一款短视频生成AI工具——MoneyPrinter,旨在为市场带来前所未有的创意风暴。面对服务器选择的难题,我们经过深思熟虑与多方比较,最终将信任票投给了华为云Fl…...

非标精密五金加工的技术要求
非标精密五金加工在现代制造业中占据着重要地位,其对于产品的精度、质量和性能有着较高的要求。以下是时利和整理的其具体的技术要求: 一、高精度的加工设备 非标精密五金加工需要先进的加工设备来保证加工精度。例如,高精度的数控机床是必不…...

新手小白怎么通过云服务器跑pytorch?
新手小白怎么通过云服务器跑pytorch?安装PyTorch的步骤可以根据不同的操作系统和需求有所差异,通过云服务器运行PyTorch的过程主要包括选择GPU云服务器平台、配置服务器环境、部署和运行PyTorch模型、优化性能等步骤。具体步骤如下: 第一步&a…...

Spring 全家桶使用教程
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

Spark SQL性能优化高频面试题及答案
目录 高频面试题及答案1. 如何通过分区(Partitioning)优化Spark SQL查询性能?2. 什么是数据倾斜(Data Skew)?如何优化?3. 如何使用广播(Broadcast)优化Join操作ÿ…...

云原生链路观测平台 openobserve + fluent-bit,日志收集
grpc-opentracing https://github.com/grpc-ecosystem/grpc-opentracing openobserve fluent-bit 为啥会选择这个组合 一个 rust 写的一个是c写的,性能和内存方面不用担心,比java 那套好太多了 openobserve 文档 :https://openobserve.ai/…...

Android 车载应用开发指南 - CarService 详解(下)
车载应用正在改变人们的出行体验。从导航到娱乐、从安全到信息服务,车载应用的开发已成为汽车智能化发展的重要组成部分。而对于开发者来说,如何将自己的应用程序无缝集成到车载系统中,利用汽车的硬件和服务能力,是一个极具挑战性…...

【Linux网络 —— 网络基础概念】
Linux网络 —— 网络基础概念 计算机网络背景网络发展 初始协议协议分层协议分层的好处 OSI七层模型TCP/IP五层(或四层)模型 再识协议为什么要有TCP/IP协议?什么是TCP/IP协议?TCP/IP协议与操作系统的关系所以究竟什么是协议? 网络传输基本流程…...

el-form动态标题和输入值,并且最后一个输入框不校验
需求:给了固定的label,叫xx单位,要输入单位的信息,但是属性名称都一样的,UI画图也是表单的形式,所以改为动态添加的形式,实现方式也很简单,循环就完事了,连着表单校验也动…...

一,初始 MyBatis-Plus
一,初始 MyBatis-Plus 文章目录 一,初始 MyBatis-Plus1. MyBatis-Plus 的概述2. 入门配置第一个 MyBatis-Plus 案例3. 补充说明:3.1 通用 Mapper 接口介绍3.1.1 Mapper 接口的 “增删改查”3.1.1.1 查询所有记录3.1.1.2 插入一条数据3.1.1.3 …...

安卓13删除下拉栏中的关机按钮版本2 android13删除下拉栏关机按钮
总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 顶部导航栏下拉可以看到,底部这里有个设置按钮,点击可以进入设备的设置页面,这里我们将更改为删除,不同用户通过这个地方进入设置。我们之前写过一个文章也是一样的删除…...

快递物流单号识别API接口代码
官网:快递鸟 API参数 一、接口描述/说明 (1)该接口仅对运单号做出识别,识别可能属于的一家或多家快递公司。 (2)接口并不返回物流轨迹,用户可结合即时查询接口和订阅查询接口完成轨迹查询、订…...

AI时代的程序员:如何保持和提升核心竞争力
1.引言 随着AIGC(如 ChatGPT、Midjourney、Claude 等)大语言模型的快速崛起,AI辅助编程工具逐渐成为程序员工作的重要组成部分。这一转变不仅改变了工作方式,更深刻影响了程序员的职业角色和技术路径。有人担心,AI将取…...