1. 正交调制解调:不只是通信,更是FPGA信号处理的基石
大家好,我是老李,一个在FPGA和信号处理领域摸爬滚打了十多年的工程师。今天想和大家聊聊一个听起来高大上,但实际在项目中无处不在的技术——正交调制解调。很多刚接触的朋友一听到这个名词,第一反应可能是:“这不是无线通信里的东西吗?跟我做图像处理、雷达信号的有啥关系?” 这其实是个很大的误解。我当年做第一个多通道声纳阵列项目时,也是这么想的,结果在数据混叠和频谱搬移上栽了大跟头,白白折腾了好几周。
正交调制解调,说白了,就是一种频谱搬移和信号分离的数学技巧。它的核心思想,是用两个频率相同但相位相差90度(也就是正交)的正弦波(我们常叫载波),去“搅拌”我们的原始信号。在调制端,我们把信号“搬”到高频去;在解调端,我们再把它“搬”回来,并神奇地把混在一起的信号成分分开。这个过程,在通信里是为了把基带信号变到射频发射,而在我们FPGA工程师手里,它更是一个强大的工具:用于数字上/下变频(DUC/DDC)、相干检波、I/Q信号分离,甚至是软件无线电(SDR) 的基石。
举个例子,你手头有一个10kHz的低频信号,但你的系统工作在100MHz的时钟下,直接处理这个低频信号效率很低,而且容易受到低频噪声干扰。这时候,你就可以用正交调制,把它“搬”到一个更适合处理的中间频率(比如1MHz)上去进行滤波、放大等操作,最后再解调回来。这就像你要把货物从A地运到B地,直接走小路(低频)可能颠簸又慢,不如先上高速公路(搬移到中频)跑一段,再下到B地的小路,整体效率反而更高。
所以,无论你是做通信、雷达、声纳,还是医疗影像、音频处理,只要涉及到多速率信号处理和频谱操作,掌握正交调制解调的FPGA实现,就相当于手里多了一把瑞士军刀。接下来,我就结合一个具体的多通道信号处理项目,带大家从理论到代码,再到仿真验证,完整地走一遍这个流程。我会把原理掰开揉碎了讲,把写代码和仿真时踩过的坑都标记出来,目标是让你看完就能自己动手复现。
2. 原理不复杂:用“旋转”的眼光看调制与解调
很多教材和文章一上来就摆公式:s(t) = I(t)cos(ωt) - Q(t)sin(ωt)。公式没错,但不够直观。我更喜欢用“旋转矢量”或者“混频”的角度来理解,这对我们后续写Verilog代码更有帮助。
想象一下,你的原始信号是一个在复平面上运动的点,它可以用一个实部(I路)和一个虚部(Q路)来表示。正交调制,其实就是让这个点绕着原点旋转起来。cos(ωt)和-sin(ωt)就是两把旋转的“尺子”。I路信号乘以cos(ωt),Q路信号乘以-sin(ωt),然后把结果加起来,相当于把原始信号这个点,用这两把旋转的尺子量度并叠加,最终得到的信号S(t),其频谱就从基带搬移到了载波频率ω的附近。
为什么要用两路正交的载波? 这是精髓所在。如果只用一路cos(ωt),解调时会出现“镜像频率”问题,信息会损失一半。而用两路正交载波,相当于在复平面上进行旋转,可以无失真地保留信号的全部信息(幅度和相位)。解调的过程就是逆旋转:把收到的S(t)分别乘以cos(ωt)和-sin(ωt),再经过低通滤波器,就能完美地还原出原始的I路和Q路信号。
在我们这个FPGA工程实践中,情况稍微特殊一点。原始文章里提到,他的两路基带信号其实是96路独立的CW(连续波)信号,而不是严格意义上的一个信号的I和Q分量。这其实可以看作96个并行的、实数的基带信号,共用一套正交调制解调架构。这样做的好处是能极大节省硬件资源,用一个调制解调链路处理多路信号,在波束成形、通道化接收等场景下非常实用。我们的目标,就是用Verilog在FPGA里搭建这样一个处理流水线。
这里有几个关键参数,直接决定了我们设计的边界:
- 系统时钟:100MHz。这是我们FPGA工作的主时钟,一切时序都以它为基准。
- 载波频率:400kHz。这是我们用来“搅拌”信号的本地振荡器频率。
- 信号频率:10kHz。这是我们96路CW信号的频率。
- 采样率:400kHz。这是我们对信号进行模数转换(ADC)或进行处理的速率。注意,它和载波频率巧合地相同,这简化了我们的载波生成设计。
- 滤波器:64阶低通,截止频率20kHz。它的任务是在解调后,滤除高频分量,只留下我们想要的10kHz基带信号。
理解了这些,我们心里就有了一个清晰的框图:96路10kHz信号进来,经过一个由400kHz载波驱动的正交调制器,变成调制信号;然后再经过一个由相同载波驱动的正交解调器,最后通过低通滤波器,恢复出(理论上)原始的信号。下面,我们就开始用Verilog把这个框图变成现实。
3. Verilog实现:模块化设计,把原理图变成代码
FPGA设计讲究模块化和流水线。根据上面的原理分析,我们可以把系统划分为几个核心模块:载波生成、混频(调制/解调)、滤波器,以及一个顶层模块把它们连接起来。此外,还需要一个锁相环(PLL) 来生成那个400kHz的时钟。我们一个一个来看。
3.1 载波生成模块:简单而巧妙的四状态机
载波生成模块的任务,是产生两路正交的、频率为400kHz的数字正弦波:cos(ωt)和-sin(ωt)。在数字域,我们不需要存储完整的正弦波表,尤其是当采样率(400kHz)是载波频率(400kHz)的整数倍时,可以取巧。
注意,我们的系统时钟是100MHz,但载波控制时钟clk_400K是400kHz。这意味着,在载波的一个周期内,clk_400K只会出现一个上升沿。文章里采用了一个更巧妙的思路:既然一个周期内clk_400K只采样一次,那么在一个载波周期内,我们其实只需要生成4个特殊的采样点(因为采样率=载波频率)。这4个点可以选为:1, 0, -1, 0(对应余弦载波)和 0, 1, 0, -1(对应负正弦载波)。这正好是一个周期内正弦/余弦波在0°, 90°, 180°, 270°四个关键点的值。
// carrier.v - 载波控制模块
module carrier(
input clk, // 100MHz 系统时钟
input clk_400K, // 400kHz


6531

被折叠的 条评论
为什么被折叠?



