GFSK(高斯频移键控,Gaussian Frequency Shift Keying)是一种在频率调制(FM)基础上引入高斯滤波的调制方式,广泛应用于低功耗无线通信协议中,尤其是在蓝牙低功耗(BLE)技术中。它是蓝牙的基本调制方式之一,其优势主要体现在低功耗和抗干扰能力较强。
一、GFSK的基本原理
-
频率调制(FM):在FM调制中,数据通过改变载波的频率来表示不同的符号。例如,二进制数据“0”和“1”可以分别对应于两种不同的频率。
-
高斯滤波器:GFSK之所以与普通的频移键控(FSK)不同,是因为它在调制过程中引入了高斯滤波器。这个滤波器对输入的基带信号进行平滑处理,使信号的频谱具有更好的频谱特性(即更低的带宽需求和较少的高频分量)。简而言之,高斯滤波使得信号的频谱变得更平滑,减少了带外辐射和干扰。
-
调制过程:在GFSK中,数据符号(0和1)通过频率变化表示,其中频率的变化幅度通常与高斯滤波器的特性相关。高斯滤波器的引入使得信号频率的变化更加平滑,而不是瞬间改变。
-
频率偏移:在BLE中,GFSK的频率偏移通常是通过两个频率进行表示,一个是基准频率(通常是一个中频),另一个是通过GFSK调制后的频率。具体来说,BLE中的频率偏移一般为±250 kHz。
二、高斯滤波器的作用
高斯滤波器在GFSK调制中,主要用于平滑数字信号的变化,减少信号频谱的扩展。这是因为简单的频率变化会引起带宽过宽,从而增加对邻道的干扰。而通过高斯滤波,我们能够使信号的频率变化更加平滑、缓和,从而减少带宽的需求,避免高频分量对通信质量的负面影响。
高斯滤波器的作用:
- 去噪和平滑:通过对输入信号进行加权平均,高斯滤波器平滑了突变数据,降低了频率跳变的幅度。
- 减少带宽:通过控制频率的变化速率,确保信号的频谱不会过宽,从而更有效地利用频带资源。
三、频率调制器的作用
在高斯滤波之后,频率调制器的作用是将已经平滑化的信号(通常是二进制数据流)转化为调制信号,这个调制信号通过控制载波的频率来表示数据。
为什么需要频率调制器?
-
频率偏移:在GFSK中,通过对载波频率的偏移来表示数据。高斯滤波后的数据流将决定载波频率的变化。数据“0”和“1”通常对应两个不同的频率(或频率偏移),因此需要频率调制器根据输入的二进制数据生成相应的频率变化。
-
模拟频率变化:频率调制器通过控制信号的频率实现调制。例如,数据“0”时频率为
f0
,数据“1”时频率为f1
,这两个频率之间的差异体现为频率偏移。
调制过程:
- 频率偏移(Frequency Shift):数据
0
和1
通过不同的频率偏移表示。通常,0
可能对应频率f0
,1
可能对应频率f1
,这两种频率在传输过程中切换。 - 平滑过渡(Gaussian Filter):数据的变化(例如从
0
到1
或从1
到0
)需要平滑化,防止频率的剧烈跳变。高斯滤波器通过减缓变化速率来减少带宽。
因此,高斯滤波器和频率调制器是GFSK调制的核心组成部分,它们的作用是确保数据可以通过平滑的频率变化来表示。
整个GFSK调制流程:
- 输入数据流(Binary Data):通常是连续的比特流(0或1)。
- 高斯滤波器:对输入的数据进行平滑处理。它通过减少数据流的快速跳变,使得调制信号频谱更加集中,减少对邻道的干扰。确保信号的频谱更窄、更平滑。
- 频率调制器:在高斯滤波后的数据基础上进行频率调制,生成通过载波频率偏移来传递信息的调制信号。在GFSK中,数据的
0
和1
分别对应两个不同的频率(f0
和f1
),频率调制器根据输入数据流控制频率变化。
四、高斯滤波器(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]
是存储过去四个时钟周期输入数据的寄存器。每次输入新数据时,这些寄存器会更新,记住过去的几个数据。
解释加权过程
-
输入数据:
- 假设
data_in
是输入的比特流(0 或 1)。每个时钟周期,输入会依次进入memory[0]
,并将先前的数据移入memory[1]
,memory[2]
,memory[3]
。
- 假设
-
加权平均:
- 在每个时钟周期,
result
会计算出memory[0]
,memory[1]
,memory[2]
, 和memory[3]
这四个寄存器的平均值。这相当于进行一个简单的加权平均操作: - 由于这四个数值代表了过去四个时钟周期的输入数据,
result
反映的是输入数据的平滑版本。
- 在每个时钟周期,
-
平滑跳变:
- 由于输入数据在不同周期会逐步变化(例如从
0
到1
或反之),高斯滤波器会将这些突变平滑过渡。例如:- 如果输入数据连续为
0
,result
可能会变成接近0
。 - 如果输入数据连续为
1
,result
会逐渐接近1
。 - 当数据从
0
跳变到1
时,result
会经历一个平滑的过渡。
- 如果输入数据连续为
- 由于我们使用的是简单的加权平均,输出会缓慢从一个值变到另一个值,而不会突然跳跃。
- 由于输入数据在不同周期会逐步变化(例如从
仿真结果分析

仿真结果输出
0000 -> 0001 -> 0002 -> 0001 -> 0000
这种结果反映了输入数据逐步影响输出的情况,符合加权平均的行为。具体来说:
-
0000 -> 0001
:这意味着在输入数据发生变化时(从0
到1
),result
从接近0
逐渐上升到接近1
。但是,由于加权平均的存在,变化不会是剧烈的,而是渐进的。 -
0001 -> 0002
:继续从接近1
逐渐增加到更大的值。这里可能是由于输入数据的连续性导致输出渐渐增加。 -
0002 -> 0001
:当输入数据从1
转换回0
时,输出结果没有立即跳回0
,而是逐渐下降到接近0
,这正是平滑过渡的效果。 -
0001 -> 0000
:最终输出平滑地返回到接近0
,反映出输入数据变化的结果。
结果与理论相匹配
这种“渐进变化”的结果符合高斯滤波的理论特性。理论上,高斯滤波器的作用是:
减小突变:输入数据从 0
到 1
或从 1
到 0
时,滤波器会通过加权平均,使得输出不发生突然的跳跃。
平滑变化:输出信号会有一个平滑的过渡过程,而不是急剧变化。你观察到的 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