FPGA数字信号处理(23)FSK解调技术(包络检波法)

介绍FSK信号的非相干解调方法——包络检波法,并通过MATLAB和FPGA实现,验证不同频移指数h对解调性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇介绍了数字通信系统中FSK调制技术的FPGA实现。调制信号经过DAC、可选的带通滤波器、功率放大器、天线发送出去后,在接收端收到FSK信号后需要对其解调,提取出包含的信息(基带信号)。


FSK解调

由上一篇可知,FSK调制信号可以视作两路ASK调制信号的合成,因此可以得到与ASK解调原理相似的FSK解调方法(ASK解调在第11篇中有讨论)。对应的包络检波法(非相干解调)的系统框图如下:
这里写图片描述
带通滤波器用于分出两路ASK调制信号,使用ASK解调方法解调,得到两路ASK信号的包络,加法器将两路保罗信号相减,再进行判决。假设f1代表1,f2代表0,则减法结果大于0则表示对应的基带信息为1;减法结果小于0则表示对应的基带信息为0。

包络检波法对FSK信号的相位特征没有要求,因此可用于FSK和CPFSK信号解调。但该方法只有在频移指数h>2时才有较好的性能,因为当h较小时,两个频率成分之间间隔较小,两路ASK信号之间频谱混叠和干扰严重,会影响到解调性能。
实际应用中多采用非相干解调,因为:

  • 提取FSK信号中的相干载波比较困难;
  • 码率相同时,非相干解调所需的信噪比只比相干解调高1~2dB。

除了本文将讨论的包络检波法外,非相干解调还有FFT分析法、自适应滤波解调法、差分检波算法、AFC环解调法、过零检测法等多种方法,会在以后的文章中详述。


MATLAB设计

MATLAB中可以设计程序仿真在使用包络检波法时,不同的h对检波效果的影响,验证上述结果。当h>2时,带通滤波才能得到区分度明显的ASK信号,解调得到的包络波也更规则,解调性能更好。解调关键代码如下:

%对FSK信号进行带通滤波
Wnf1=[(fc-m*ps)*2/Fs fc*2/Fs];
Wnf2=[fc*2/Fs (fc+m*ps)*2/Fs];
b1=fir1(60,Wnf1);
b2=fir1(60,Wnf2);
bs1_fsk=filter(b1,1,fsk);
bs2_fsk=filter(b2,1,fsk);
%对带通滤波后的数据进行全波整流
abs1_fsk=abs(bs1_fsk);
abs2_fsk=abs(bs2_fsk);
%对整流后的数据进行低通滤波
Lb=fir1(60,ps*2/Fs);
Lpf1_fsk=filter(Lb,1,abs1_fsk);
Lpf2_fsk=filter(Lb,1,abs2_fsk);
%对低通滤波后的两路信号相减,形成基带信号波形
Demod_fsk=Lpf1_fsk-Lpf2_fsk;

带通滤波器分别筛选两路ASK信号。以上一篇中的系统参数为例:系统时钟32Mhz,码元速率1Mhz,载波频率6Mhz,频移指数h=3.5,f1=4.25Mhz,f2=7.75MHz。带通滤波器通带可分别选为(6Mhz-h*1Mhz)~6Mhz和6Mhz~(6MHz+h*1Mhz)。

低通滤波器用于提取出基带信号包络,截止频率设置为码元速率即可。所有的滤波器系数经过量化后存储为txt(coe)文件,在FPGA设计中调用。


FPGA设计

采用包络检波法,在Vivado开发环境下完成2FSK解调技术的设计并进行仿真(调制信号参数与上节相同)。模块接口如下:

`timescale 1ns / 1ps
//--------------------------------------------------------
//   包络检波法(非相干解调)实现FSK信号解调
//--------------------------------------------------------
module FSKdem_EnvelopeDet
(
    input clk,          //32MHz系统时钟
    input rst,
    input din,          //基带信号输入,码元速率1MHz
    output [15:0] dout  //FSK解调数据输出
);

//-----------------------------------------------------
//   CPFSK调制,连续相位,h=3.5
//-----------------------------------------------------
wire [15:0] fsk;

CPFSK_liuqi fskmod
(
    .clk  (clk),     
    .rst  (rst),  
    .din  (din),     
    .dout (fsk)
);

这里实例化一个上一篇设计的FSK调制模块,用来产生FSK调制信号,简化后面的仿真及testbench的编写。接下来实例化两个带通滤波器模块,提取出两路ASK信号:

//--------------------------------------------------------
//   带通滤波器分为两路ASK信号
//--------------------------------------------------------
wire signed [31:0] data1, data2;
wire signed [15:0] bpf1 = data1[29:14]; 
wire signed [15:0] bpf2 = data2[29:14]; 

bpf1_fir fir1 (
  .aclk(clk),                           
  .s_axis_data_tvalid(1'b1), 
  .s_axis_data_tready(),
  .s_axis_data_tdata(fsk),  
  .m_axis_data_tvalid(),  
  .m_axis_data_tdata(data1)    
);
bpf2_fir fir2 (
  .aclk(clk),                           
  .s_axis_data_tvalid(1'b1), 
  .s_axis_data_tready(),
  .s_axis_data_tdata(fsk),  
  .m_axis_data_tvalid(),  
  .m_axis_data_tdata(data2)    
);      

带通滤波器及后面的低通滤波器都使用Vivado提供的FIR Compiler IP核,滤波器系数使用MATLAB生成的coe文件,具体使用方法可参考https://blog.youkuaiyun.com/fpgadesigner/article/details/80621411

接下来便是分别对两路ASK信号进行解调(方法见第11篇)代码如下:

//--------------------------------------------------------
//    整流,即求绝对值
//--------------------------------------------------------
reg signed [15:0] bpf1_abs, bpf2_abs;

always @ (posedge clk or posedge rst)
    if (rst) begin bpf1_abs <= 'd0; bpf2_abs <= 'd0; end
    else begin
        if (bpf1[15]) bpf1_abs <= -bpf1;
        else bpf1_abs <= bpf1;

        if (bpf2[15]) bpf2_abs <= -bpf2;
        else bpf2_abs <= bpf2;
    end

//--------------------------------------------------------
//    低通滤波得到基带信号包络
//--------------------------------------------------------
wire signed [31:0] lpf1, lpf2;

lpf_fir fir3 (
  .aclk(clk),                           
  .s_axis_data_tvalid(1'b1), 
  .s_axis_data_tready(),
  .s_axis_data_tdata(bpf1_abs),  
  .m_axis_data_tvalid(),  
  .m_axis_data_tdata(lpf1)    
);

lpf_fir fir4 (
  .aclk(clk),                           
  .s_axis_data_tvalid(1'b1), 
  .s_axis_data_tready(),
  .s_axis_data_tdata(bpf2_abs),  
  .m_axis_data_tvalid(),  
  .m_axis_data_tdata(lpf2)    
);

滤波器的输出便是两路ASK信号的包络,将两路信号相减:

//--------------------------------------------------------
//    减法得到解调信号
//--------------------------------------------------------
reg signed [15:0] sub;

always @ (posedge clk or posedge rst)
    if (rst) sub <= 'd0;
    else sub <= lpf1[29:14] - lpf2[29:14];

assign dout = sub;

减法器结果即为解调后信号,对此信号进行判决输出即可恢复出原始基带数据。需要注意,从下面的仿真中可以看出2FSK解调信号中不含直流分量,因此判决门限直接设置为0即可。判决门限及锁相环位同步技术在本系列12、13篇中有记录。


仿真测试

编写testbench,生成一个矩形脉冲周期信号,模拟二进制基带数据,设计中有模块调制产生FSK调制信号,再解调,仿真结果如下:
这里写图片描述
经过带通滤波后,bpf1和bpf2都只保留了一路ASK信号;整流及低通滤波后得到ASK的基带信号包络lpf1和lpf2。两者相减的结果dout即为解调信号。注意,虽然看起来dout与lpf1很像,但根据前面文章对ASK调制解调的讨论,基带包络lpf1是一个含直流分量的信号(所有值都大于0);而dout中有正有负,不含直流分量。

### FPGA 实现调制解调技术方案 #### 1. FPGA 的优势 FPGA(Field Programmable Gate Array)因其高灵活性和可重构性,在数字信号处理领域得到了广泛应用。特别是在调制解调技术中,FPGA 提供了强大的并行计算能力和硬件加速能力,能够满足实时性和性能的要求[^1]。 #### 2. 基于 FPGA 的 QAM 调制解调器设计 QAM(Quadrature Amplitude Modulation)是一种常用的调制方式,广泛应用于现代通信系统中。基于 FPGA 的 QAM 调制解调器设计方案利用其灵活的架构实现了高性能的数字通信技术。这种设计可以通过合理分配硬件资源、优化功耗以及改进软件算法来提升整体性能[^2]。 以下是实现 QAM 调制解模器的关键步骤: - **硬件资源配置**:选择合适的 FPGA 器件作为目标平台,例如 Xilinx Spartan-6 或 Virtex 系列。这些器件提供了丰富的逻辑单元和 DSP Slice,支持复杂的数学运算。 - **时序约束设定**:为工程项目添加必要的时序约束文件(如 ASKMod.ucf),以确保系统运行在指定的工作频率下。例如,设置系统时钟信号 clk 频率为 8 MHz 并重新编译项目[^3]。 - **代码编写与仿真验证**:使用 HDL (Hardware Description Language) 编写完整的工程代码,并对其进行功能测试和时序分析。下面是一个简单的 VHDL 示例用于说明如何生成正弦波形的基础部分: ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity sine_wave_generator is Port ( clk : in std_logic; reset : in std_logic; sin_out : out signed(7 downto 0) ); end sine_wave_generator; architecture Behavioral of sine_wave_generator is signal phase_accumulator : unsigned(15 downto 0) := (others => '0'); constant increment_value : unsigned(15 downto 0) := to_unsigned(1024, 16); begin process(clk, reset) begin if reset = '1' then phase_accumulator <= (others => '0'); elsif rising_edge(clk) then phase_accumulator <= phase_accumulator + increment_value; end if; end process; -- Lookup table or CORDIC algorithm can be used here for actual SIN calculation. sin_out <= signed(std_logic_vector(phase_accumulator(15 downto 8))); end Behavioral; ``` #### 3. 数据格式的选择 在实际应用中,考虑到 FPGA 中浮点数运算会显著增加资源消耗并降低效率,通常推荐采用定点数表示法来进行数值计算。尽管如此,某些特殊场景可能仍需依赖浮点数据格式。此时可以根据具体需求定制简化版的浮点格式,从而平衡精度与资源利用率之间的关系[^5]。 #### 结论 综上所述,借助 FPGA 技术可以高效地构建各类调制解调设备,尤其是在追求高速率传输的同时保持较低延迟的情况下表现尤为突出。未来随着半导体制造工艺进步和技术革新,此类解决方案还将持续演进而适应更加多样化的需求。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值