GFSK调制

GFSK(高斯频移键控,Gaussian Frequency Shift Keying)是一种在频率调制(FM)基础上引入高斯滤波的调制方式,广泛应用于低功耗无线通信协议中,尤其是在蓝牙低功耗(BLE)技术中。它是蓝牙的基本调制方式之一,其优势主要体现在低功耗和抗干扰能力较强。

一、GFSK的基本原理

  1. 频率调制(FM):在FM调制中,数据通过改变载波的频率来表示不同的符号。例如,二进制数据“0”和“1”可以分别对应于两种不同的频率。

  2. 高斯滤波器:GFSK之所以与普通的频移键控(FSK)不同,是因为它在调制过程中引入了高斯滤波器。这个滤波器对输入的基带信号进行平滑处理,使信号的频谱具有更好的频谱特性(即更低的带宽需求和较少的高频分量)。简而言之,高斯滤波使得信号的频谱变得更平滑,减少了带外辐射和干扰。

  3. 调制过程:在GFSK中,数据符号(0和1)通过频率变化表示,其中频率的变化幅度通常与高斯滤波器的特性相关。高斯滤波器的引入使得信号频率的变化更加平滑,而不是瞬间改变。

  4. 频率偏移:在BLE中,GFSK的频率偏移通常是通过两个频率进行表示,一个是基准频率(通常是一个中频),另一个是通过GFSK调制后的频率。具体来说,BLE中的频率偏移一般为±250 kHz。

二、高斯滤波器的作用

高斯滤波器在GFSK调制中,主要用于平滑数字信号的变化,减少信号频谱的扩展。这是因为简单的频率变化会引起带宽过宽,从而增加对邻道的干扰。而通过高斯滤波,我们能够使信号的频率变化更加平滑、缓和,从而减少带宽的需求,避免高频分量对通信质量的负面影响。

高斯滤波器的作用:

  • 去噪和平滑:通过对输入信号进行加权平均,高斯滤波器平滑了突变数据,降低了频率跳变的幅度。
  • 减少带宽:通过控制频率的变化速率,确保信号的频谱不会过宽,从而更有效地利用频带资源。

三、频率调制器的作用

在高斯滤波之后,频率调制器的作用是将已经平滑化的信号(通常是二进制数据流)转化为调制信号,这个调制信号通过控制载波的频率来表示数据。

为什么需要频率调制器?
  • 频率偏移:在GFSK中,通过对载波频率的偏移来表示数据。高斯滤波后的数据流将决定载波频率的变化。数据“0”和“1”通常对应两个不同的频率(或频率偏移),因此需要频率调制器根据输入的二进制数据生成相应的频率变化。

  • 模拟频率变化:频率调制器通过控制信号的频率实现调制。例如,数据“0”时频率为f0,数据“1”时频率为f1,这两个频率之间的差异体现为频率偏移。

调制过程:
  1. 频率偏移(Frequency Shift):数据01通过不同的频率偏移表示。通常,0可能对应频率f01可能对应频率f1,这两种频率在传输过程中切换。
  2. 平滑过渡(Gaussian Filter):数据的变化(例如从01或从10)需要平滑化,防止频率的剧烈跳变。高斯滤波器通过减缓变化速率来减少带宽。

因此,高斯滤波器和频率调制器是GFSK调制的核心组成部分,它们的作用是确保数据可以通过平滑的频率变化来表示。

整个GFSK调制流程:

  1. 输入数据流(Binary Data):通常是连续的比特流(0或1)。
  2. 高斯滤波器:对输入的数据进行平滑处理。它通过减少数据流的快速跳变,使得调制信号频谱更加集中,减少对邻道的干扰。确保信号的频谱更窄、更平滑。
  3. 频率调制器:在高斯滤波后的数据基础上进行频率调制,生成通过载波频率偏移来传递信息的调制信号。在GFSK中,数据的01分别对应两个不同的频率(f0f1),频率调制器根据输入数据流控制频率变化。

四、高斯滤波器(Guassian Filter)

module gaussian_filter (
    input wire clk,
    input wire reset,
    input wire [1:0] data_in,  // 输入比特流 (0或1)
    output wire [15:0] filtered_data // 滤波后的数据
);
    // 高斯滤波器的实现(例如FIR滤波器),这里只给出伪代码
    reg [15:0] memory [0:3];  // 存储历史数据
    reg [15:0] result;
    
    always @(posedge clk or posedge reset) begin
        if (reset) begin
            // 重置
            memory[0] <= 16'b0;
            memory[1] <= 16'b0;
            memory[2] <= 16'b0;
            memory[3] <= 16'b0;
            result <= 16'b0;
        end else begin
            // 将新的数据推入历史数据中
            memory[0] <= data_in;
            memory[1] <= memory[0];
            memory[2] <= memory[1];
            memory[3] <= memory[2];
            
            // 基于高斯滤波的简单加权平均(示例)
            result <= (memory[0] + memory[1] + memory[2] + memory[3]) / 4;
        end
    end
    
    assign filtered_data = result;
    
endmodule
module tb_gaussian_filter;

    reg clk;
    reg reset;
    reg [1:0] data_in;  // 输入比特流(0或1)
    wire [15:0] filtered_data;  // 滤波后的数据
    
    // 实例化高斯滤波器模块
    gaussian_filter gf_inst (
        .clk(clk),
        .reset(reset),
        .data_in(data_in),
        .filtered_data(filtered_data)
    );
    
    // 时钟生成:周期为10时间单位
    always #5 clk = ~clk;  // 每5个时间单位切换时钟
    
    // 测试过程
    initial begin
        // 初始化
        clk = 0;
        reset = 0;
        data_in = 2'b00;  // 初始输入数据为00
        
        // 复位高斯滤波器
        reset = 1;
        #10 reset = 0;  // 在复位信号有效10个时间单位后关闭复位
        
        // 模拟数据输入并观察输出
        data_in = 2'b01;
        #20;
        
        data_in = 2'b10;
        #20;
        
        data_in = 2'b11;
        #20;
        
        data_in = 2'b00;
        #20;
        
        // 结束仿真
        $finish;
    end
    
    // 监视输出信号
    initial begin
        $monitor("Time=%0t, Data_in=%b, Filtered_Data=%b", $time, data_in, filtered_data);
    end

endmodule

在代码中,简化地模拟了一个加权平均过程:

result <= (memory[0] + memory[1] + memory[2] + memory[3]) / 4;

这里,memory[0], memory[1], memory[2], 和 memory[3] 是存储过去四个时钟周期输入数据的寄存器。每次输入新数据时,这些寄存器会更新,记住过去的几个数据。

解释加权过程

  1. 输入数据

    • 假设 data_in 是输入的比特流(0 或 1)。每个时钟周期,输入会依次进入 memory[0],并将先前的数据移入 memory[1], memory[2], memory[3]
  2. 加权平均

    • 在每个时钟周期,result 会计算出 memory[0], memory[1], memory[2], 和 memory[3] 这四个寄存器的平均值。这相当于进行一个简单的加权平均操作:result=\frac{memory[0]+memory[1]+memory[2]+memory[3]}{4} 
    • 由于这四个数值代表了过去四个时钟周期的输入数据,result 反映的是输入数据的平滑版本。
  3. 平滑跳变

    • 由于输入数据在不同周期会逐步变化(例如从 01 或反之),高斯滤波器会将这些突变平滑过渡。例如:
      • 如果输入数据连续为 0result 可能会变成接近 0
      • 如果输入数据连续为 1result 会逐渐接近 1
      • 当数据从 0 跳变到 1 时,result 会经历一个平滑的过渡。
    • 由于我们使用的是简单的加权平均,输出会缓慢从一个值变到另一个值,而不会突然跳跃。

 仿真结果分析

高斯滤波器仿真结果
仿真结果输出
0000 -> 0001 -> 0002 -> 0001 -> 0000

这种结果反映了输入数据逐步影响输出的情况,符合加权平均的行为。具体来说:

  1. 0000 -> 0001:这意味着在输入数据发生变化时(从 01),result 从接近 0 逐渐上升到接近 1。但是,由于加权平均的存在,变化不会是剧烈的,而是渐进的。

  2. 0001 -> 0002:继续从接近 1 逐渐增加到更大的值。这里可能是由于输入数据的连续性导致输出渐渐增加。

  3. 0002 -> 0001:当输入数据从 1 转换回 0 时,输出结果没有立即跳回 0,而是逐渐下降到接近 0,这正是平滑过渡的效果。

  4. 0001 -> 0000:最终输出平滑地返回到接近 0,反映出输入数据变化的结果。

结果与理论相匹配

这种“渐进变化”的结果符合高斯滤波的理论特性。理论上,高斯滤波器的作用是:

        减小突变:输入数据从 01 或从 10 时,滤波器会通过加权平均,使得输出不发生突然的跳跃。

        平滑变化:输出信号会有一个平滑的过渡过程,而不是急剧变化。你观察到的 0000 -> 0001 -> 0002 -> 0001 -> 0000 就是这种平滑变化的体现。

五、频率调制器(Frequency Modulator)

module gfsf_modulator (
    input wire clk,
    input wire reset,
    input wire [1:0] data_in,  // 输入数据(0或1)
    input wire [15:0] filtered_data,  // 滤波后的数据
    output wire modulated_signal // 输出调制信号
);
    // 设定基准频率和频率偏移
    parameter BASE_FREQUENCY = 1000; // 基准频率(Hz)
    parameter FREQ_OFFSET_0 = 50;    // 频率偏移(Hz),表示0
    parameter FREQ_OFFSET_1 = 100;   // 频率偏移(Hz),表示1
    
    // 计算调制后的频率
    reg [31:0] frequency;
    reg [15:0] signal_output;
    
    always @(posedge clk or posedge reset) begin
        if (reset) begin
            frequency <= BASE_FREQUENCY;
        end else begin
            if (filtered_data == 16'b0) begin
                frequency <= BASE_FREQUENCY + FREQ_OFFSET_0;  // 0对应偏移频率
            end else begin
                frequency <= BASE_FREQUENCY + FREQ_OFFSET_1;  // 1对应偏移频率
            end
        end
    end
    
    // 生成调制信号(这里简化为方波信号,实际需要生成频率变化的信号)
    always @(posedge clk) begin
        if (frequency == BASE_FREQUENCY + FREQ_OFFSET_0) begin
            signal_output <= 16'b0;  // 频率偏移后生成的信号(伪代码)
        end else begin
            signal_output <= 16'b1;
        end
    end
    
    assign modulated_signal = signal_output;
    
endmodule

FM的仿真验证结果是错误的,其他部分符合理论,只有调制结果一直显示为0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值