跳转至

第四章:调制解调技术

深入解析蓝牙调制解调技术:GFSK、π/4-DQPSK、8DPSK 的原理、数学模型、硬件实现及性能分析


4.1 调制概述

4.1.1 调制的目的

为什么要调制?

基带信号特点:
├── 频率低 (0-1 MHz)
├── 波长长 (300m+)
├── 天线尺寸大
└── 无法有效辐射

调制的作用:
├── 将基带信号搬移到高频载波 (2.4 GHz)
├── 减小天线尺寸 (λ/4 ≈ 31 mm)
├── 实现频分复用 (多信道)
└── 提高抗干扰能力

调制的一般模型:

1
2
3
4
5
6
7
s(t) = A(t) · cos[2πf_c·t + φ(t)]

其中:
├── A(t): 幅度 (ASK 调制)
├── f_c: 载波频率
├── φ(t): 相位 (PSK 调制)
└── 瞬时频率 f_i = f_c + (1/2π)·dφ/dt (FSK 调制)

4.1.2 蓝牙调制方式

蓝牙版本 调制方式 数据率 频谱效率
BR (1.x) GFSK 1 Mbps 0.5 bit/s/Hz
EDR (2.x) π/4-DQPSK 2 Mbps 1 bit/s/Hz
EDR (2.x) 8DPSK 3 Mbps 1.5 bit/s/Hz
BLE (4.x-5.x) GFSK 1-2 Mbps 0.5-1 bit/s/Hz

4.2 GFSK 调制

4.2.1 GFSK 原理

高斯频移键控 (GFSK) 定义:

1
2
3
4
5
6
7
8
9
GFSK = FSK + 高斯预滤波

基本 FSK:
数据 '1' → 频率 f_c + Δf
数据 '0' → 频率 f_c - Δf

GFSK 改进:
在频率调制前,先通过高斯低通滤波器
目的:平滑相位跳变,减小带外辐射

GFSK 信号表达式:

1
2
3
4
5
6
7
8
s(t) = A · cos[2πf_c·t + φ(t)]

其中相位 φ(t) 为:
φ(t) = 2πΔf · ∫_{-∞}^{t} m(τ) · g(t-τ) dτ

m(τ): 基带数据序列 (±1)
g(t): 高斯脉冲响应
Δf: 峰值频偏 (蓝牙:160 kHz)

高斯脉冲响应:

g(t) = (1/2T) · [Q(α(t-T/2)) - Q(α(t+T/2))]

其中:
├── T: 符号周期 (1 μs for 1 Mbps)
├── α = 2πB / √(ln 2)
├── B: 高斯滤波器 3dB 带宽
└── Q(x): 高斯 Q 函数 = (1/√2π) · ∫_x^∞ e^(-u²/2) du

BT 乘积:
BT = B × T
蓝牙标准:BT = 0.5

BT 乘积的影响:

BT = 0.3 (更窄带宽)
├── 优点:频谱更集中,带外辐射小
├── 缺点:码间干扰 (ISI) 增大,需要更高 SNR
└── 应用:频谱受限场景

BT = 0.5 (蓝牙标准)
├── 优点:ISI 和频谱的折中
├── 缺点:无明显缺点,平衡设计
└── 应用:蓝牙标准

BT = 0.7 (更宽带宽)
├── 优点:ISI 小,眼图张开度大
├── 缺点:带外辐射增大
└── 应用:高速率场景

BT = 1.0 (无滤波)
├── 优点:无 ISI
├── 缺点:频谱宽,带外辐射大
└── 应用:退化为普通 FSK

4.2.2 GFSK 调制器实现

数字 GFSK 调制器架构:

                    数字域                    模拟域
输入数据 ──► 高斯滤波 ──► 相位累加 ──► CORDIC ──► DAC ──► 混频 ──► RF
              (FIR)      (累加器)    (查找表)

详细结构:

┌─────────────────────────────────────────────────────────────┐
│                    GFSK 调制器                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  data_in ──► ┌─────────┐ ──► ┌─────────┐ ──► ┌─────────┐  │
│              │ 高斯 FIR │     │ 相位累加 │     │ CORDIC  │  │
│              │ 滤波器  │     │   器     │     │  查找表  │  │
│              └─────────┘     └─────────┘     └─────────┘  │
│                   │               │               │        │
│                   │               │               ▼        │
│              h[n]系数         频率字          I/Q 输出     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

高斯 FIR 滤波器设计:

module gaussian_filter (
    input wire clk,
    input wire reset_n,
    input wire signed [7:0] data_in,  // ±1 映射为 ±127
    output reg signed [15:0] data_out,
    input wire enable
);

// 高斯 FIR 系数 (BT=0.5, 截断到 5 个符号)
// 计算得到:h = [0.0107, 0.0879, 0.4028, 0.0879, 0.0107]
// 量化为 8 位定点数
localparam [7:0] H0 = 8'sd1;   // 0.0107 × 127 ≈ 1
localparam [7:0] H1 = 8'sd11;  // 0.0879 × 127 ≈ 11
localparam [7:0] H2 = 8'sd51;  // 0.4028 × 127 ≈ 51

// 5 级移位寄存器
reg signed [7:0] delay_line [0:4];

// FIR 计算
wire signed [15:0] mult0, mult1, mult2, mult3, mult4;
wire signed [17:0] sum;

assign mult0 = $signed(delay_line[0]) * $signed(H0);
assign mult1 = $signed(delay_line[1]) * $signed(H1);
assign mult2 = $signed(delay_line[2]) * $signed(H2);
assign mult3 = $signed(delay_line[3]) * $signed(H1);
assign mult4 = $signed(delay_line[4]) * $signed(H0);

assign sum = mult0 + mult1 + mult2 + mult3 + mult4;

always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        delay_line[0] <= 8'sd0;
        delay_line[1] <= 8'sd0;
        delay_line[2] <= 8'sd0;
        delay_line[3] <= 8'sd0;
        delay_line[4] <= 8'sd0;
        data_out <= 16'sd0;
    end else if (enable) begin
        // 移位
        delay_line[4] <= delay_line[3];
        delay_line[3] <= delay_line[2];
        delay_line[2] <= delay_line[1];
        delay_line[1] <= delay_line[0];
        delay_line[0] <= data_in;

        // 输出
        data_out <= sum[17:2];  // 右移 2 位归一化
    end
end

endmodule

相位累加器:

module phase_accumulator (
    input wire clk,
    input wire reset_n,
    input wire signed [15:0] freq_dev,  // 频率偏差输入
    output reg [15:0] phase_out,
    input wire enable
);

reg [15:0] phase_reg;

// 载波相位增量 (2.4 GHz 对应值)
localparam [15:0] CARRIER_INC = 16'h4000;  // 示例值

always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        phase_reg <= 16'h0000;
        phase_out <= 16'h0000;
    end else if (enable) begin
        // 相位 = 相位 + 载波频率 + 频偏
        phase_reg <= phase_reg + CARRIER_INC + freq_dev;
        phase_out <= phase_reg;
    end
end

endmodule

CORDIC 查找表:

module cordic_lut (
    input wire [15:0] phase_in,
    output reg [11:0] sine_out,
    output reg [11:0] cosine_out
);

// 正弦查找表 (4096 点,12 位输出)
reg [11:0] sine_lut [0:4095];

// 初始化 (仿真时加载,实际可用 ROM)
initial begin
    integer i;
    real pi = 3.14159265358979;
    for (i = 0; i < 4096; i = i + 1) begin
        sine_lut[i] = $rtoi(2047 * $sin(2 * pi * i / 4096));
    end
end

always @(*) begin
    // 使用相位的高 12 位作为地址
    sine_out <= sine_lut[phase_in[15:4]];
    // 余弦 = 正弦相移 90 度
    cosine_out <= sine_lut[(phase_in[15:4] + 1024) & 12'hFFF];
end

endmodule

4.2.3 GFSK 解调器实现

鉴频器解调原理:

1
2
3
4
5
6
输入 GFSK 信号 → 限幅 → 鉴频器 → 低通滤波 → 判决 → 输出数据

鉴频器类型:
├── 模拟鉴频器:斜率鉴频、比例鉴频
├── 数字鉴频器:差分鉴频、CORDIC 鉴频
└── 相干解调:需要载波恢复

数字差分鉴频器:

module digital_discriminator (
    input wire clk,
    input wire reset_n,
    input wire signed [11:0] i_in,
    input wire signed [11:0] q_in,
    output reg data_out,
    input wire enable
);

reg signed [11:0] i_delay1, i_delay2;
reg signed [11:0] q_delay1, q_delay2;
reg signed [23:0] phase_diff;

// 差分鉴频公式:
// phase_diff = I[n]×Q[n-1] - Q[n]×I[n-1]
// 这近似于相位的变化率

wire signed [23:0] mult1, mult2;
assign mult1 = $signed(i_in) * $signed(q_delay1);
assign mult2 = $signed(q_in) * $signed(i_delay1);

always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        i_delay1 <= 12'sd0;
        i_delay2 <= 12'sd0;
        q_delay1 <= 12'sd0;
        q_delay2 <= 12'sd0;
        phase_diff <= 24'sd0;
        data_out <= 1'b0;
    end else if (enable) begin
        // 延迟
        i_delay2 <= i_delay1;
        i_delay1 <= i_in;
        q_delay2 <= q_delay1;
        q_delay1 <= q_in;

        // 计算相位差
        phase_diff <= mult1 - mult2;

        // 判决 (符号位)
        data_out <= phase_diff[23];
    end
end

endmodule

匹配滤波器解调:

module matched_filter_demod (
    input wire clk,
    input wire reset_n,
    input wire signed [11:0] adc_in,
    output reg data_out,
    input wire enable
);

// 匹配滤波器系数 (与高斯脉冲匹配)
localparam [7:0] MF0 = 8'sd1;
localparam [7:0] MF1 = 8'sd11;
localparam [7:0] MF2 = 8'sd51;
localparam [7:0] MF3 = 8'sd11;
localparam [7:0] MF4 = 8'sd1;

reg signed [11:0] delay_line [0:4];
wire signed [23:0] mf_output;

// 匹配滤波计算
assign mf_output = $signed(delay_line[0]) * $signed(MF0) +
                   $signed(delay_line[1]) * $signed(MF1) +
                   $signed(delay_line[2]) * $signed(MF2) +
                   $signed(delay_line[3]) * $signed(MF3) +
                   $signed(delay_line[4]) * $signed(MF4);

always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        delay_line[0] <= 12'sd0;
        delay_line[1] <= 12'sd0;
        delay_line[2] <= 12'sd0;
        delay_line[3] <= 12'sd0;
        delay_line[4] <= 12'sd0;
        data_out <= 1'b0;
    end else if (enable) begin
        // 移位
        delay_line[4] <= delay_line[3];
        delay_line[3] <= delay_line[2];
        delay_line[2] <= delay_line[1];
        delay_line[1] <= delay_line[0];
        delay_line[0] <= adc_in;

        // 采样判决 (在符号中心时刻)
        data_out <= mf_output[23];
    end
end

endmodule

4.3 π/4-DQPSK 调制

4.3.1 π/4-DQPSK 原理

差分四相相移键控:

π/4-DQPSK 是 QPSK 的改进版本

标准 QPSK 问题:
├── 180° 相位跳变时经过原点
├── 导致包络波动大
└── 对功率放大器线性度要求高

π/4-DQPSK 改进:
├── 两个 QPSK 星座交替使用
├── 星座之间旋转 π/4
├── 最大相位跳变 ±135°,不经过原点
└── 包络波动小,适合非线性 PA

星座图:

        Q
   ●    │    ●     星座 A (0°, 90°, 180°, 270°)
────────┼──────── I
   ●    │    ●     星座 B (45°, 135°, 225°, 315°)

发送时交替使用星座 A 和星座 B

差分编码规则:

输入比特对 (I_k, Q_k) 决定相位变化 Δφ_k:

(I_k, Q_k)    Δφ_k      矢量图
  (0, 0)    →  +π/4      ↗
  (0, 1)    →  +3π/4     ↖
  (1, 1)    →  -3π/4     ↙
  (1, 0)    →  -π/4      ↘

当前相位:φ_k = φ_{k-1} + Δφ_k

相位状态:
├── 偶数符号:星座 A (0°, 90°, 180°, 270°)
└── 奇数符号:星座 B (45°, 135°, 225°, 315°)

4.3.2 π/4-DQPSK 调制器

调制器架构:

module pi4_dqpsk_modulator (
    input wire clk,
    input wire reset_n,
    input wire [1:0] data_in,  // 2 bit/symbol
    output reg [11:0] i_out,
    output reg [11:0] q_out,
    input wire symbol_enable
);

// 相位累加器 (16 位,0-2π 映射到 0-65535)
reg [15:0] phase_accum;

// 差分编码表
// 输入 (I,Q) → 相位增量
wire [15:0] phase_delta;
assign phase_delta = (data_in == 2'b00) ? 16'h2000 :  // +π/4
                     (data_in == 2'b01) ? 16'h6000 :  // +3π/4
                     (data_in == 2'b11) ? 16'hA000 :  // -3π/4
                                          16'hE000;   // -π/4

// 相位累加
always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        phase_accum <= 16'h0000;
    end else if (symbol_enable) begin
        phase_accum <= phase_accum + phase_delta;
    end
end

// 正弦查找表
reg [11:0] sine_lut [0:255];
initial begin
    integer i;
    for (i = 0; i < 256; i = i + 1) begin
        sine_lut[i] = $rtoi(2047 * $sin(2 * 3.14159 * i / 256));
    end
end

// I/Q 输出
always @(posedge clk) begin
    if (symbol_enable) begin
        // 使用相位高 8 位作为查找表地址
        i_out <= sine_lut[phase_accum[15:8]];
        q_out <= sine_lut[(phase_accum[15:8] + 64) & 8'hFF];  // 相移 90°
    end
end

endmodule

4.3.3 π/4-DQPSK 解调器

差分检测解调:

module pi4_dqpsk_demodulator (
    input wire clk,
    input wire reset_n,
    input wire signed [11:0] i_in,
    input wire signed [11:0] q_in,
    output reg [1:0] data_out,
    input wire symbol_enable
);

reg signed [11:0] i_delay, q_delay;
reg signed [23:0] x, y;
reg [1:0] quadrant;

// 差分解调:计算当前符号与前一个符号的相位差
// x = I[n]×I[n-1] + Q[n]×Q[n-1]
// y = Q[n]×I[n-1] - I[n]×Q[n-1]

wire signed [23:0] mult_ii, mult_qq, mult_qi, mult_iq;
assign mult_ii = $signed(i_in) * $signed(i_delay);
assign mult_qq = $signed(q_in) * $signed(q_delay);
assign mult_qi = $signed(q_in) * $signed(i_delay);
assign mult_iq = $signed(i_in) * $signed(q_delay);

assign x = mult_ii + mult_qq;
assign y = mult_qi - mult_iq;

// 象限判决
always @(*) begin
    if (x >= 0 && y >= 0)
        quadrant = 2'b00;  // +π/4
    else if (x < 0 && y >= 0)
        quadrant = 2'b01;  // +3π/4
    else if (x < 0 && y < 0)
        quadrant = 2'b11;  // -3π/4
    else
        quadrant = 2'b10;  // -π/4
end

always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        i_delay <= 12'sd0;
        q_delay <= 12'sd0;
        data_out <= 2'b00;
    end else if (symbol_enable) begin
        i_delay <= i_in;
        q_delay <= q_in;
        data_out <= quadrant;
    end
end

endmodule

4.4 8DPSK 调制

4.4.1 8DPSK 原理

八相相移键控:

8DPSK 每个符号携带 3 bit 信息

8 个相位状态,间隔 45°:
相位 0:   0°      (000)
相位 1:   45°     (001)
相位 2:   90°     (010)
相位 3:   135°    (011)
相位 4:   180°    (100)
相位 5:   225°    (101)
相位 6:   270°    (110)
相位 7:   315°    (111)

差分编码:当前相位 = 前一相位 + 相位增量

编码规则:

输入比特 (b2, b1, b0) → 相位增量 Δφ:

(b2,b1,b0)    Δφ        格雷码排列
  (0,0,0)   →  0°       000
  (0,0,1)   →  45°      001
  (0,1,1)   →  90°      011
  (0,1,0)   →  135°     010
  (1,1,0)   →  180°     110
  (1,1,1)   →  225°     111
  (1,0,1)   →  270°     101
  (1,0,0)   →  315°     100

格雷码保证相邻相位只差 1 bit

4.4.2 8DPSK 调制器

module 8dpsk_modulator (
    input wire clk,
    input wire reset_n,
    input wire [2:0] data_in,  // 3 bit/symbol
    output reg [11:0] i_out,
    output reg [11:0] q_out,
    input wire symbol_enable
);

reg [15:0] phase_accum;

// 相位增量查找表 (格雷码映射)
wire [15:0] phase_delta;
assign phase_delta = (data_in == 3'b000) ? 16'h0000 :  // 0°
                     (data_in == 3'b001) ? 16'h2000 :  // 45°
                     (data_in == 3'b011) ? 16'h4000 :  // 90°
                     (data_in == 3'b010) ? 16'h6000 :  // 135°
                     (data_in == 3'b110) ? 16'h8000 :  // 180°
                     (data_in == 3'b111) ? 16'hA000 :  // 225°
                     (data_in == 3'b101) ? 16'hC000 :  // 270°
                                           16'hE000;   // 315°

// 相位累加
always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        phase_accum <= 16'h0000;
    end else if (symbol_enable) begin
        phase_accum <= phase_accum + phase_delta;
    end
end

// 8 点查找表 (节省资源)
reg [11:0] sine_lut [0:7];
initial begin
    sine_lut[0] = 12'd0;      // sin(0°)
    sine_lut[1] = 12'd1448;   // sin(45°)
    sine_lut[2] = 12'd2047;   // sin(90°)
    sine_lut[3] = 12'd1448;   // sin(135°)
    sine_lut[4] = 12'd0;      // sin(180°)
    sine_lut[5] = 12'sd-1448; // sin(225°)
    sine_lut[6] = 12'sd-2047; // sin(270°)
    sine_lut[7] = 12'sd-1448; // sin(315°)
end

// I/Q 输出
always @(posedge clk) begin
    if (symbol_enable) begin
        // 相位除以 45° 得到索引
        i_out <= sine_lut[(phase_accum[15:13] + 2) & 3'h7];  // cos = sin(θ+90°)
        q_out <= sine_lut[phase_accum[15:13]];
    end
end

endmodule

4.5 调制性能对比

4.5.1 误码率性能

BER vs Eb/N0 性能对比 (AWGN 信道,相干解调):

Eb/N0 (dB)    GFSK    π/4-DQPSK    8DPSK
─────────────────────────────────────────
    0         0.08      0.05        0.10
    2         0.04      0.02        0.06
    4         0.015     0.008       0.03
    6         0.004     0.002       0.01
    8         0.0008    0.0003      0.003
   10         0.0001    0.00004     0.0008

结论:
├── GFSK 最简单,性能适中
├── π/4-DQPSK 性能最优 (相同速率下)
└── 8DPSK 速率最高,但需要更高 SNR

4.5.2 频谱效率

调制方式    符号率    比特/符号    数据率    频谱效率
────────────────────────────────────────────────────
GFSK       1 Msps     1          1 Mbps    0.5 bit/s/Hz
π/4-DQPSK  1 Msps     2          2 Mbps    1.0 bit/s/Hz
8DPSK      1 Msps     3          3 Mbps    1.5 bit/s/Hz

频谱效率提升的代价:
├── 星座点更密集
├── 抗噪声能力下降
└── 需要更高 SNR 维持相同 BER

4.5.3 功率效率

达到 BER=10⁻³ 所需的 Eb/N0:

调制方式    相干解调    差分解调
─────────────────────────────────
GFSK         9.6 dB      11.0 dB
QPSK         6.9 dB      8.5 dB
π/4-DQPSK    7.2 dB      8.8 dB
8PSK        11.5 dB     13.5 dB
8DPSK       12.5 dB     14.5 dB

结论:
├── 相干解调比差分解调优 1-2 dB
├── 但需要载波恢复,复杂度高
└── 蓝牙使用差分检测,简化实现

4.6 实际实现考虑

4.6.1 非理想效应

相位噪声影响:

1
2
3
4
5
6
7
8
9
本振相位噪声会导致:
├── 星座点旋转扩散
├── 相邻符号干扰
└── BER 性能恶化

要求:
├── GFSK: <-100 dBc/Hz @ 100 kHz
├── π/4-DQPSK: <-105 dBc/Hz @ 100 kHz
└── 8DPSK: <-110 dBc/Hz @ 100 kHz

频率偏移影响:

1
2
3
4
5
6
7
8
9
收发双方频率偏差会导致:
├── 星座持续旋转
├── 解调性能下降
└── 需要频率校正

蓝牙要求:
├── 载波频率容差:±75 kHz
├── 频偏容限:±150 kHz (GFSK)
└── 频偏容限:±100 kHz (EDR)

I/Q 不平衡:

1
2
3
4
5
6
7
8
9
正交调制器的 I/Q 支路不匹配:
├── 幅度不平衡:±0.5 dB 以内
├── 相位误差:±2° 以内
└── 否则会产生镜像干扰

校正方法:
├── 出厂校准
├── 自适应校正算法
└── 数字预失真

4.6.2 同步技术

符号同步:

// 早迟门同步器
module early_late_gate (
    input wire clk,
    input wire reset_n,
    input wire signed [11:0] adc_in,
    output reg symbol_strobe,
    input wire enable
);

reg signed [11:0] early_sample, late_sample;
reg [15:0] timing_error_accum;
reg [11:0] nco_phase;

// 早迟门采样
always @(posedge clk) begin
    // 在预计符号时刻前后采样
    early_sample <= /* 早采样 */;
    late_sample  <= /* 迟采样 */;

    // 计算定时误差
    if (enable) begin
        timing_error_accum <= timing_error_accum + 
                              (early_sample - late_sample);

        // 当误差超过阈值,调整 NCO
        if (timing_error_accum > 16'h1000) begin
            nco_phase <= nco_phase - 1;
            timing_error_accum <= 0;
        end else if (timing_error_accum < 16'hF000) begin
            nco_phase <= nco_phase + 1;
            timing_error_accum <= 0;
        end
    end
end

// 符号时刻生成
always @(posedge clk) begin
    if (nco_phase[11:0] == 12'h000) begin
        symbol_strobe <= 1'b1;
    end else begin
        symbol_strobe <= 1'b0;
    end
end

endmodule

帧同步:

蓝牙包前导码用于帧同步:

经典蓝牙:
├── 前导码:01010101... (72 bit)
├── 同步字:访问地址 (64 bit)
└── 检测:相关器检测同步字

BLE:
├── 前导码:10101010... 或 01010101... (80 μs)
├── 访问地址:32 bit
└── 检测:匹配滤波器

4.7 本章小结

本章详细讲解了蓝牙调制解调技术:

  1. GFSK:高斯滤波 + FSK,BT=0.5,用于 BR 和 BLE
  2. π/4-DQPSK:差分 QPSK,星座旋转,用于 EDR 2Mbps
  3. 8DPSK:8 相调制,用于 EDR 3Mbps
  4. 硬件实现:Verilog 代码展示调制器和解调器设计
  5. 性能对比:BER、频谱效率、功率效率分析
  6. 实际考虑:相位噪声、频率偏移、I/Q 不平衡、同步技术

下一章将讲解基带处理架构,包括包结构、链路管理、ARQ 机制等。


上一章:03-编码解码原理
下一章:05-基带处理架构