写在前面

这是我大三下学期一门课的大作业,主要是完成数字频谱仪的FPGA部分,采用的是传统扫频式架构,没有涉及到FFT算法。当初开始设计的时候在网上没有搜到太靠谱的教程,做完了决定自己写一个。

如果想深入了解频谱分析仪的原理请拉到底部,参阅本文的参考文献,本人曾从中受益良多。

关键词:软件无线电结构,扫频式频谱仪,滤波器设计,多速率信号处理系统设计

设计目标

整体

image-20230712184120707

图中电路分为3个主要模块,模块1,主要完成信号的预放大,混频滤波等工作。模块2主要完成信号的数字处理以及数字扫频信号的产生工作,模块3主要完成人机交互界面、频谱的显示以及系统整体控制的工作。

我这里只做了模块二

主要技术指标

简易频谱仪的设计指标要求如下:

(1) 输入信号电平范围为-60dBm~0dBm(按照输入电阻为50欧姆计),信号无直流分量

(2) 输入信号频率范围为1MHz~20MHz

(3) 频谱仪的扫频宽度(SPAN)要求可以实现1MHz,100kHz,20kHz,3个挡位

(4) 频谱仪的解析带宽(RBW)要求可以实现10kHz,1kHz,300Hz,3个挡位

(5) 频谱仪的视频带宽(VBW)要求可以实现50kHz,5kHz,1kHz,3个挡位

(6) 输入信号预放大要求可以实现10dB、20dB、30dB,3个挡位。

要求

要求查阅资料后给出电路设计的详细方案,选择不同方向的同学需要分别完成以下内容:

(1) 选择通信方向和测量方向的同学需要完成模块2的电路设计与仿真,需要给出设计方案、器件选型、并按照指标要求进行FPGA代码设计并通过波形仿真给出方案实现的最终结果。

(2) 选择基本电路方向的同学需要完成模块1的设计,包括预放大、滤波、混频等模拟电路的设计,并利用Multisim软件对电路进行仿真验证。其中第一级射频预放大模块需要用晶体电路实现,可采用多个晶体构成的放大电路来实现,晶体的型号可以自行选择,推荐晶体管ft大于300MHz的型号。混频器和后续放大滤波电路的实现方案可以自行设定,但是需要满足系统的指标要求。

(3) 选择控制类方向的同学需要完成模块3的设计,主要实现人机交互界面,如设定参数的输入,要求可以实现频谱仪常用的输入功能,如中心频率设定、扫频带宽设定、RWB和VWB设定、预放大增益设定等;实现频谱的扫描显示(可用LCD12864模块进行显示);控制扫频信号源以及系统内其它需要进行控制的模块在执行相应的操作时进行切换。可以通过Protus软件或者其它仿真软件进行仿真验证。

分析过程

由于模块2的输入并不明确,也就不能很好地评价设计效果,所以我们在设计中对模拟部分的信号处理流程也进行了仿真。这里有两种方法:

第一种是在matlab中借助高采样率完成类模拟信号的处理流程,将经过处理的最终波形导出为波形文件,导入到仿真流程中观察效果。但这样我们无法观察到实时改变扫频信号时,混频产物产生的变化。于是采用第二种方法:直接使用verilog完成对模拟信号的生成、混频和带通滤波器这些流程的仿真

对于射频信号的模拟,我们可以使用rom存储matlab里已经生成好的信号波形,此信号可包含多个频率,使用DDS把它读出来,在内部与扫频信号进行混频。

扫频信号也是通过DDS产生,扫频起止频率由中频、中心频率和扫频带宽共同决定。这点后面会细说计算过程。

混频出中频信号后,输入带通滤波器(RBW),有三档,解析带宽分别为:10KHz、1KHz和300Hz。带通滤波器相关参数是在matlab设计好之后滤波器的采样频率、中心频率、通带频率、阻带频率之后,导出为coe文件,在vivado中导入IP核。

需要注意的是,输入到该带通滤波器模块的信号需要经过CIC抽取,因为在前面使用了100M的时钟输入DDS ip核,这意味着现在的混频信号采样率是100M,而过高的采样率会导致数字滤波器的数字域带宽窄、阶数高,所以我们需要加入抽取操作降低采样率。但抽取会带来非常大的混叠效应,因此在抽取前还需要加抗混叠滤波器

之后将已经解析之后的信号作数字检波。一种方法是IQ检波,用一对正交的信号将信号分为IQ两路,经过低通滤波器后使用反正切运算求取幅度值。另外一种方法是直接使用低通滤波器提取包络,因为实现简单,这里使用低通检波

实际上,检波前的信号比较类似于AM信号,由一个频率为中频的载波和一个被调制到载波上的包络信号构成。

AM解调中一般的方式是进行全波整流或者半波整流,然后经过一个低通滤波器即可。在数字通信系统中一般全波整流实现方式就是取绝对值,半波整流就是直接舍弃负值。最终选择了全波整流,选取包络信号的频率为低通滤波器的截止频率。

最后是视频滤波器的实现(VBW)。视频滤波器是一种低通滤波器,起到了对检波输出波形平滑处理的作用。

平滑的幅度序列通过串口或并口提供给单片机,这就是最终频谱的幅度值,而横坐标由扫频信号的控制信号提供。如果接到滤波器的xy模式上,也可以直接显示频谱。

由于滤波器有延时,这点我还没解决。

各部分的具体实现

扫频式频谱仪原理介绍与软件无线电知识补全

这个大作业是要做个数字频谱仪。我们只用做软件部分,整个系统是最最传统的扫频式频谱仪。

先从模拟电路部分讲起,射频信号进来,我们要分析它的频谱,最朴实的思路是生成一段从低到高(或者从高到低)频率连续变化的正弦信号,用混频器跟射频信号相乘,就可以把射频信号搬到我们固定好的中频(IF)上了。

中频是一种在外差式接收机中的指标,它是人为规定的,是第一级本地振荡信号(以下缩写为本振)与射频信号混频后的固定频率,通常为465KHZ、10.7MHZ或433MHZ等。在收音机中,我们通过调节旋钮选台,实际上是在调节本振的频率,不同频率的本振会把不同频谱的信号搬到中频上。如设定了10.7MHZ的中频,旋钮将本振调到14.7MHZ,就可以把4MHZ的信号搬到中频上,方便后续的滤波和信号处理。

回到我们的频谱仪上,连续变化的扫频本振去和射频信号混频,这个过程就像调节收音机旋钮,一些频率上的幅度大,一些频率上的幅度小,对应在收音机上就是音量大小。如果我们在调节过程中拿一张图把中频处的幅度大小记下来,横坐标对应为扫频信号的逐渐增大(或变小)的频率,就得到了一张频谱图。你肯定会想,谁没事边转收音机旋钮边记音量,但这确实是一种直观有效的解释方式。

让我们来看看传统的模拟扫频式频谱仪长什么样。

image-20230712191420583

上图是一个超外差频谱分析仪的简化框图。“外差”是指混频,即对频率进行转换,而“超”则是指超音频频率或高于音频的频率范围。

从图中我们看到,输入信号先经过一个衰减器,再经低通滤波器到达混频器,然后与来自本振(LO)的信号相混频。由于混频器是非线性器件,其输出除了包含两个原始信号之外,还包含它们的谐波以及原始信号与其谐波的和信号与差信号。若任何一个混频信号落在中频(IF)滤波器的通带内,它都会被进一步处理(被放大并可能按对数压缩)。基本的处理过程有包络检波、低通滤波器进行滤波以及显示。斜波发生器在屏幕上产生从左到右的水平移动,同时它还对本振进行调谐,使本振频率的变化与斜波电压成正比。

再来看看频谱仪的显示屏有哪些参数可以设定。

image-20230712191612998

频谱分析仪的输出是屏幕上的 X-Y迹线,显示被映射在由 10 个水平网格和 10 个垂直网格组成的标度盘上。横轴表示频率,其标度值从左到右线性增加。

频率设置通常分为两步:先通过中心频率控制将频率调节到标度盘的中心线上,然后通过频率扫宽控制再调节横跨 10 个网格的频率范围(扫宽)。这两个控制是相互独立的,所以改变中心频率时,扫宽并不改变。我们还可以采用设置起始频率和终止频率的方式来代替设置中心频率和扫宽的方式。

当然这只是理论分析,甚至不够严谨,是无法纸上谈兵实现这个东西的。那么为了画出这个频谱图,我们还需要做些什么工作呢?

扫频信号频率范围原理介绍

上面我们说,频谱仪有两种设置感兴趣信号范围的方法,第一种是设定中心频率和扫频带宽(SPAN),第二种是设定起始频率和终止频率。在我们的大作业设计要求中选择了第一种。

那么设计扫频模块时,我们的频率范围就是从中心频率+中频SPAN/2中心频率+中频+SPAN/2中心频率+中频-SPAN/2\sim中心频率+中频+SPAN/2

这里注意区分中心频率和中频

生成扫频信号的方法是:使用DDS的IP核产生普通正弦信号,再通过在一定范围内连续改变频率控制字来达到扫频目的。频率步进需要扫频带宽和带通滤波器的参数共同决定。代码如下,写得很烂请多指教。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
`timescale 1ns / 1ps

module sweep_maker #(
parameter IF = 25_000 //设定的系统中频,单位为Hz
) (
input clk,
input rst_n,
input [31:0] center_fre,//设定要分析输入信号的中心频率(单位:Hz),范围1M~20M
input [19:0] span, //扫频宽度,三个档位,1MHz,100kHz,20kHz
input [1:0] RBW_mode,//解析带宽,10kHz,1kHz,300Hz,3个挡位
output [5:0] local_sweep //本地扫频信号输出
);
reg [31:0] LO_center; //扫频信号的中心频率
reg [43:0] center_var_1;//中间变量
reg [43:0] center_var_2;//中间变量
reg [19:0] F_word_begin; //开始时的频率控制字
reg [19:0] F_word_end; //结束时的频率控制字
reg ready;
reg [19:0] F_word_change = 20'd1; //变化精度
//信号定义
reg [19 : 0] config_data_reg; //频率控制字寄存器
wire [15 : 0] m_data_tdata;
reg [7 : 0] cnt_clk;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
LO_center <= 0;
F_word_begin <= 0;
F_word_end <= 0;
ready <= 0;
end
else begin //初始化计算扫频范围
LO_center <= center_fre + IF;
center_var_1<=(LO_center - span / 2) << 20;
center_var_2<=(LO_center + span / 2) << 20;
F_word_begin <= center_var_1 / 100_000_000;
F_word_end <= center_var_2 / 100_000_000;
case(RBW_mode) //根据RBW宽度自动改变扫频频率步进
2'b00:F_word_change<=20'd01;//RBW=300HZ,扫描时间最长
2'b01:F_word_change<=20'd07;//RBW=1KHZ,扫描时间减少一点
2'b10,11:F_word_change<=20'd10;//RBW=10KHZ,扫描时间最短
endcase
ready <= 1;
end
end
always @(posedge clk or negedge rst_n) begin//开始扫频
if(!rst_n)begin
config_data_reg <= 20'b0000_0000_0010_1000_1111;
cnt_clk <= 'b0;
end
else if (!ready) begin
config_data_reg <= 20'b0000_0000_0010_1000_1111;
end
else if (config_data_reg >= F_word_end) begin
config_data_reg <= F_word_begin;
end
else begin
cnt_clk<=cnt_clk+1;
if(&cnt_clk[6:0]=='b1)
config_data_reg <= config_data_reg + F_word_change;
end
end
assign local_sweep = m_data_tdata[5:0];
wire m_data_tvalid;
dds_sweep_compiler u_dds_sweep_compiler (
.aclk(clk), // input wire aclk
.aresetn(rst_n), // input wire aresetn
.s_axis_config_tvalid(1'b1), // input wire s_axis_config_tvalid
.s_axis_config_tdata(config_data_reg), // input wire [19 : 0] s_axis_config_tdata
.m_axis_data_tvalid(m_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_data_tdata) // output wire [15 : 0] m_axis_data_tdata
);
endmodule

生成的扫频控制信号与扫频信号:

image-20230713143400632

确定中频

首先要确定中频。我们的频谱仪要求能检测1M到20M的信号,一般来说,中频不选在信号范围内,因为这会造成滤波的困难,形成一段难以探测到频率的空白范围。如果想要深入了解原理请自行搜索。

所以我们的频谱仪要么选1MHZ以下的中频,要么选20M以上的中频。对于FPGA和高速DA器件来说,出于成本考虑选择125Msps左右的DA模块AD9764(不能再贵了这个要两百块),根据nyquist采样定律,这个模块最多最多能输出我们dds产生的125/2=62.5MHZ的信号,还不能保证完整性。如果本振最高频率定在62.5MHZ,那么混完的中频最高频率就是62.5-20=42.5MHZ。综合滤波器设计难易程度考虑,可以选择和国际接轨的电视机中频频率38MHZ。对于1MHZ以下的中频,我们可以选择零中频和比较低的中频。那么不同的中频会对最终输出造成什么区别呢?我们在下一段讨论。

如果选择零中频,则会有本振泄露的问题,干扰邻近信道有点缺德。出于不能缺德的准则,我们来看看剩下两段频率范围。如果不用零中频结构,我们就得用数字中频接收机结构,即,将第一中频信号送入AD,后面都在软件处理的系统结构。38MHZ,混完都不一定能从AD进来,能用的AD模块都很贵(。)那么只能选0~1M的中频了。

所以怎么确定需要多大的中频呢?让我来举个例子。

假设输入射频信号只在2M处有一根谱线,频谱仪设定观察的中心频率为2MHz,中频信号为IF。根据公式:

本振频率=感兴趣信号频率+中频频率本振频率=感兴趣信号频率+中频频率

那么实际扫频信号的范围是1.5MHz+IF2.5MHz+IF1.5MHz+IF\sim2.5MHz+IF(选择的扫频带宽为1MHz)。

需要考虑的是,当本振信号为2MHz+IF2MHz+IF时,信号经过混频后搬移到IFIF;当本振信号为2MHzIF2MHz- IF时,信号也会被搬移到IFIF;当本振信号为1.5MHz+IF1.5MHz+IF时,信号被搬移到0.5MHzIF0.5MHz-IF

即扫频频率范围在1.5MHz+IF2MHz1.5MHz+IF\sim 2MHz时,混频产物对应变化范围为0MHz0.5MHzIF0MHz\sim0.5MHz-IF;当扫频频率范围为2MHz2.5MHz+IF2MHz\sim2.5MHz+IF时,混频产物对应变化范围为0MHz0.5MHz+IF0MHz\sim0.5MHz+IF

如果代入某个小于0.5MHz的IF,可以发现会有两种扫频信号取值正好满足混频之后到达IF处,因而会产生两个峰值,但若是输入信号为1.5MHz,根据本振变化范围,混频产物从IF开始增大,因而此情况下只存在一个峰值。因而想要保证单峰的情况,应该使本振变化范围与信号频带错开,即本振最低频率大于观察信号范围最大值

RfCenter  扫频宽度 2+IF>RfCenter + 扫频宽度 2R f_{-} \text {Center }-\frac{\text { 扫频宽度 }}{2}+I F>R f_{-} \text {Center }+\frac{\text { 扫频宽度 }}{2}

得出结论:

IF>span(扫频宽度)IF>span(扫频宽度)

根据上述结论,对于最大1M的扫宽,中频最低应为1M。但对于限定带宽的中频滤波器的设计要求过于苛刻,如果带宽为10k,Q=f/B=1M/10k=10000,Q值过大,无法实现。

image-20230712193530076

如图所示,大多数频谱分析仪使用 2 至 4 个混频步骤以达到最后的中频。那么对于扫宽1M的处理思路只能是,采用比较高的第一中频和宽带通滤波器(例如500khz),再进行第二次、第三次搬移,直到搬到可以实现滤波器Q值为止。由于本项目尚属于实验项目,以观察为主,所以我们最终选取了20khz的扫宽和25khz的中频,先使用单次混频,如果效果理想且进展顺利再考虑多次混频滤波。

对模拟部分的仿真

对于射频信号的模拟,我们可以使用rom存储matlab里已经生成好的多频率信号波形(这里我设置了基频为1M,加了很多谐波频率),使用DDS把它读出来,在内部与扫频信号进行混频。

由于仿真的是前端模拟信号,我们需要根据普通AD器件位宽考虑乘法器位宽。如果使用12位ADC,在仿真时乘法器的结果就不能超过12位。为此,在生成射频信号和扫频信号时,我均选择了位宽为6的DDS。

注意,这里类似于AM调制,只有当调制信号全为正的情况下才能使用非相干解调,所以要把模拟出的射频信号设置成无符号,而扫频信号是有符号,乘法器是有符号×无符号。最后混频输出的结果是一个有符号信号。

模拟出的多频率射频信号:

image-20230713143446306

混频信号:

image-20230713143459289

image-20230713143506523

生成混频信号只是第一步。这表示我们的系统有了可仿真的原始波形。

为什么要使用CIC滤波器

接下来是RBW滤波器的设计。实际上就是一个带通滤波器,有三档,10k、1k和300。那么接下来的任务就是设计三个中心频率为465KHZ,-3dB带宽分别为这些档位的滤波器。需要注意的是,我们在前面使用了100M的时钟生成DDS信号,这意味着现在的混频信号采样率是100M。

过高的采样率会导致数字滤波器的数字域带宽特别窄、阶数特别高(相关知识请复习或自行搜索)。哪怕我们在实际中使用AD器件输入中频信号,采样率也在10M左右(依器件而定),这就需要使用抽取来降低采样率。然而抽取会带来非常大的混叠效应,因此在抽取前还需要加抗混叠滤波器。

对多速率数字处理不了解的话我这里提一嘴,并不是只有通过AD器件才算采样,你可以把FPGA里的采样率理解成数据流变化的快慢程度。例如{1,2,8,-6,4,2}中的每次变化都在100M时钟的上升沿发生,将其每隔一个数取一次得到{1,8,4},它的变化是在50M时钟的上升沿发生,即,采样率变为原来的0.5倍。抽取对频谱造成的影响(混叠)请自行搜索学习。

实际通常采用CIC降采样滤波器,这是一种多级积分梳状滤波器,它将多级抗混叠滤波器与多级抽取操作合在一起,由于使用资源少、运算量小,经常被用于降低数字信号采样率。如果我将100M采样速率下的信号通过连续三个(注意不是三级)1/10CIC降采样滤波器,采样速率会变为100M/(10*10*10)=100KHZ,高于25k的两倍但又不至于太高,这正是我们需要的。

(CIC可以用ip核做也可以用代码实现)

经过CIC的效果,可以看到少了高频分量:

image-20230713143530421

image-20230713143535553

分辨率带宽(RBW)滤波器

原理

频率分辨率是频谱分析仪明确分离出两个正弦输入信号响应的能力。傅立叶理论告诉我们正弦信号只在单点频率处有能量,两个信号无论在频率上多么接近,似乎都应在显示器上表现为两条线。但是超外差接收机的显示器上所呈现的信号响应是具有一定宽度的

由于输入信号是固定的,而本振是扫频的,故混频器的输出也是扫频的。若某个混频分量恰好扫过中频,就会在显示器上将带通滤波器的特性曲线描绘出来,如图所示。链路中最窄的滤波器带宽决定了总显示带宽。

image-20230713142546183

因此,两个输入信号频率必须间隔足够远,否则它们所形成的迹线会在顶部重叠,看起来像是只有一个响应。

image-20230713142604566

扫描时间的影响

如果把分辨率作为评价频谱仪的唯一标准,似乎将频谱仪的分辨率(IF)滤波器设计得尽可能窄就可以了。然而,分辨率会影响扫描时间,而我们又非常注重扫描时间。因为它直接影响完成一次测量所需的时间。

考虑分辨率的原因是由于中频滤波器是带限电路,需要有限的时间来充电和放电。如果混频分量扫过滤波器的速度过快,便会造成如图所示的显示幅度的丢失。

image-20230713142738842

我们得出的重要结论是:分辨率的变化对扫描时间有重大影响。老式模拟分析仪通常都能按 1、3、10 的规律或大致等于 10的平方根的比率提供步进值。所以,当分辨率每改变一档,扫描时间会受到约 10 倍的影响。

频谱分析仪一般会根据扫宽和分辨率带宽的设置自动调整扫描时间,通过调节扫描时间来维持一个被校准的显示。

实现

设计带通滤波器是在matlab里,输入fdatool命令打开滤波器设计工具箱,输入相关参数(例如采样率、截止频率和位数等),就可以导出coe文件,最后导入到vivado的fir滤波器ip核里即可实现。注意这里有三个带宽,就要导出三个滤波器文件,在vivado里也需要生成三个ip核,在程序中用case状态机来切换使用的滤波器是哪一个。

观察不同RBW对分辨率的影响:

image-20230713143606529

数字检波

在经过带通滤波器之后可以看到输出为近似AM调制波形,与理论分析一致,之后进行全波整流,将负值翻转,最后经过低通检波器之后,输出包络如wavePassJianbo所示,可以看出是将整形后的波形进行解调过程。

image-20230713143659655

增大滤波器过渡带宽度会发现产生以下变化,需要视频滤波进行平滑:

image-20230713143739045

视频滤波

最后是视频滤波(VBW)。视频滤波器是一种低通滤波器,起到了一个对检波输出波形平滑处理的作用。大作业要求的VBW带宽也是三档,我们就根据这三档设计三个参数不同的低通滤波器,导出文件就可以啦。

这里我们觉得没有什么大用就没继续仿真()

总结

回顾整个仿真过程,我们用DDS读出使用rom存储的多频率信号波形来模拟射频信号输入,与频率控制字连续改变的正弦信号混频,抽取后送入带通滤波器。随后通过取绝对值的方式实现全波整流,使用低通检波,最后用视频滤波器对检波输出波形平滑处理。

实现仿真过程中,参数设定是一个大问题。中心频率直接影响着最后结果,这是设计的第一步,也是最难的一步。我们通过合理选择中频信号中心频率,解决了单频输入信号混频滤波后产生频率双峰问题,保证混频产物频率的纯净性。除此以外,关于滤波器的过渡带、阶数和截位,我们也经过反复仿真尝试,得出相对较好的参数组合。

一点遗憾是没有尝试使用多个混频步骤这种解决方案。另外由于没有前端模拟电路支持,也没有真正上板子观察输出,我们的设计尚是不足的,对于滤波器的阶数选择过大以致不能匹配一般的板载资源,这是今后需要关注的性能优化问题。

参考文献

是德科技频谱分析基础