问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://m.blog.csdn.net/qq_43156031/article/details/142493686

混频是信号处理中的一个核心概念,广泛应用于无线通信和音频处理等领域。本文将从混频的基本原理出发,详细介绍其在Matlab中的仿真实现以及在FPGA上的具体应用,帮助读者全面理解这一重要技术。

一、什么是混频?

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

  1. 和频:f1 + f2
  2. 差频:f1 - f2

设两个信号分别为x1(t) = sin(2πf1t)和x2(t) = sin(2πf2t),混频后的结果为:

xmixed(t) = sin(2πf1t) ⋅ sin(2πf2t) = 1/2 [cos(2π(f1 - f2)t) - cos(2π(f1 + f2)t)]

由此可以看到,混频的结果包含两个新的频率成分:f1 + f2和f1 - f2。

二、为什么要进行混频?

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

  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)的共轭复数,因此幅度频谱对于正负频率是对称的。

  1. 一个频率为f0的正弦信号可以表示为:

x(t) = sin(2πf0t)

使用傅里叶变换会得到两个频率分量,分别位于f0和-f0:

X(f) = 1/2j[σ(f-f0)-σ(f+f0)]

这意味着频谱在f0和-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 begin
    aclk = 0;
    aresetn = 0;
    #100;
    aresetn =1;
end
always #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,对应的是差频信号f1 - f2 = 5M - 4M = 1M。我们再来看高频信号频率:

可以看到,整体的波形频率为1/110=9.09M,对应的是和频信号f1 + f2 = 5M + 4M = 9M。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号