单载波系统QPSK的频偏估计算法

频偏对QPSK系统的影响

在单载波QPSK系统中,频偏会导致:

  • 星座图旋转:接收信号在复平面上不断旋转
  • 误码率恶化:严重的频偏会导致解调失败
  • 系统失锁:超出锁相环跟踪范围时完全失锁

常用频偏估计算法分类

1. 基于导频的频偏估计算法

A. 时域相关法(最常用)

function freq_offset = pilot_freq_estimate(received_signal, pilot_sequence, Ts)
    % received_signal: 接收信号(包含导频)
    % pilot_sequence: 已知导频序列
    % Ts: 符号周期
    
    % 提取接收信号中的导频部分
    L = length(pilot_sequence);
    received_pilot = received_signal(1:L);
    
    % 计算相关值
    correlation = sum(conj(received_pilot) .* pilot_sequence);
    
    % 计算相位差
    phase_diff = angle(correlation);
    
    % 估计频偏(Hz)
    freq_offset = phase_diff / (2 * pi * Ts * L);
end

B. 最大似然估计(MLE)

function freq_est = ml_freq_estimate(signal, pilot, Ts)
    % 最大似然频偏估计
    L = length(pilot);
    n = 0:L-1;
    
    % 构建似然函数
    likelihood = @(f) abs(sum(signal(1:L) .* conj(pilot) .* exp(-1j*2*pi*f*Ts*n)));
    
    % 在可能频偏范围内搜索最大值
    f_search = linspace(-0.1/Ts, 0.1/Ts, 1000); % 搜索范围
    likelihood_vals = arrayfun(likelihood, f_search);
    
    [~, idx] = max(likelihood_vals);
    freq_est = f_search(idx);
end

2. 基于数据辅助的频偏估计算法

A. Fitz算法(适用于QPSK)

function freq_est = fitz_algorithm(received_signal, M, Ts)
    % Fitz频偏估计算法
    % M: 观察窗口长度
    % 适用于QPSK调制
    
    N = length(received_signal);
    freq_est = 0;
    
    for k = 1:N-M
        % 计算M次方去除调制(QPSK用4次方)
        z = received_signal(k:k+M-1).^4;
        
        % 计算自相关
        R = sum(z(2:end) .* conj(z(1:end-1)));
        
        % 估计频偏
        phase_est = angle(R) / 4; % 除以4是因为之前做了4次方
        freq_est = freq_est + phase_est / (2*pi*Ts);
    end
    
    freq_est = freq_est / (N-M);
end

B. L&R算法(Luise & Reggiannini)

function freq_est = lr_algorithm(received_signal, L, Ts)
    % L&R频偏估计算法
    % L: 相关间隔
    
    N = length(received_signal);
    
    % 计算M次方去除调制(QPSK用4次方)
    z = received_signal .^ 4;
    
    % 计算加权自相关
    numerator = 0;
    denominator = 0;
    
    for m = 1:L
        R_m = sum(z(m+1:N) .* conj(z(1:N-m)));
        numerator = numerator + imag(R_m) / m;
        denominator = denominator + real(R_m);
    end
    
    % 估计频偏
    freq_est = atan(numerator / denominator) / (2 * pi * Ts);
end

3. 非数据辅助(盲估计)算法

A. 基于循环平稳特性的算法

function freq_est = cyclic_spectrum_estimate(received_signal, Ts, Nfft)
    % 基于循环平稳特性的频偏估计
    % 利用QPSK信号的循环谱特性
    
    % 计算循环相关
    [S, alpha] = cyclic_spectrum(received_signal, Nfft, Ts);
    
    % 在循环频率域寻找峰值
    [~, idx] = max(max(abs(S), [], 1));
    
    % 估计频偏(循环频率对应频偏)
    freq_est = alpha(idx) / (2 * pi);
end

function [S, alpha] = cyclic_spectrum(x, Nfft, Ts)
    % 计算循环谱
    N = length(x);
    alpha = linspace(-1/Ts, 1/Ts, Nfft);
    S = zeros(Nfft, Nfft);
    
    for k = 1:length(alpha)
        % 计算循环自相关
        R_alpha = x .* exp(-1j*2*pi*alpha(k)*(0:N-1)*Ts) .* conj(x);
        S(k, :) = fftshift(fft(R_alpha, Nfft));
    end
end

完整的QPSK系统频偏估计

%% QPSK系统频偏估计与补偿完整仿真
clear all; close all; clc;

%% 仿真参数设置
N_symbols = 1000;       % 符号数
Ts = 1e-6;             % 符号周期(秒)
fs = 10/Ts;            % 采样率
f_carrier = 2e6;       % 载波频率(Hz)
f_offset = 500;        % 频偏(Hz)
SNR_dB = 20;           % 信噪比

%% 生成QPSK信号
% 生成随机QPSK符号
data = randi([0 3], 1, N_symbols);
qpsk_symbols = exp(1j*(pi/4 + data*pi/2));

% 上采样(脉冲成形)
sps = 10; % 每符号采样点数
tx_signal = reshape(repmat(qpsk_symbols, sps, 1), 1, []);

%% 加入频偏和噪声
t = (0:length(tx_signal)-1) * Ts/sps;
% 加入频偏
rx_signal = tx_signal .* exp(1j*2*pi*f_offset*t);

% 加入AWGN噪声
SNR_linear = 10^(SNR_dB/10);
noise_power = 1/SNR_linear;
noise = sqrt(noise_power/2) * (randn(size(rx_signal)) + 1j*randn(size(rx_signal)));
rx_signal = rx_signal + noise;

%% 频偏估计(使用Fitz算法)
estimated_offset = fitz_algorithm_qpsk(rx_signal, sps, Ts/sps);

fprintf('真实频偏: %.2f Hz\n', f_offset);
fprintf('估计频偏: %.2f Hz\n', estimated_offset);
fprintf('估计误差: %.2f Hz\n', abs(f_offset - estimated_offset));

%% 频偏补偿
% 生成补偿信号
compensation = exp(-1j*2*pi*estimated_offset*t);
compensated_signal = rx_signal .* compensation;

%% 性能评估
% 计算补偿前后的星座图
figure('Position', [100, 100, 1200, 500]);

subplot(1,3,1);
plot(real(qpsk_symbols), imag(qpsk_symbols), 'ro', 'MarkerSize', 8);
title('发射星座图'); grid on; axis equal;

subplot(1,3,2);
plot(real(rx_signal(1:sps:end)), imag(rx_signal(1:sps:end)), 'b.');
title('频偏影响下的星座图'); grid on; axis equal;

subplot(1,3,3);
plot(real(compensated_signal(1:sps:end)), imag(compensated_signal(1:sps:end)), 'g.');
title('频偏补偿后的星座图'); grid on; axis equal;

%% 改进的Fitz算法实现(针对QPSK优化)
function freq_est = fitz_algorithm_qpsk(received_signal, sps, Ts)
    % 针对QPSK优化的Fitz算法
    
    % 下采样到符号率
    symbols = received_signal(1:sps:end);
    
    % QPSK需要4次方去除调制
    z = symbols .^ 4;
    
    L = min(20, floor(length(z)/4)); % 相关窗口长度
    
    % 计算自相关
    R = zeros(1, L);
    for m = 1:L
        R(m) = sum(z(m+1:end) .* conj(z(1:end-m)));
    end
    
    % 加权求和(Fitz算法核心)
    numerator = 0;
    for m = 1:L
        numerator = numerator + angle(R(m));
    end
    
    % 频偏估计(除以4是因为做了4次方)
    freq_est = numerator / (2 * pi * Ts * L * 4);
end

参考代码 单载波系统QPSK的频偏估计算法 www.youwenfan.com/contentcnj/59505.html

算法性能比较

算法类型 估计精度 计算复杂度 适用场景
导频辅助 突发通信、帧结构系统
Fitz算法 中高 连续传输、中等频偏
L&R算法 高精度要求、小频偏
循环平稳 很高 盲估计、认知无线电

实际应用

  1. 初始捕获阶段:使用导频辅助算法进行粗同步
  2. 跟踪阶段:使用Fitz或L&R算法进行精同步
  3. 计算资源受限:优先选择Fitz算法
  4. 高精度要求:使用L&R算法或最大似然估计
  5. 盲估计场景:考虑循环平稳特性算法

这些算法可以根据具体系统需求进行组合使用,形成"粗同步+精同步"的两级频偏估计结构,以达到最佳的性能和复杂度平衡。

posted @ 2025-10-17 15:09  老夫写代码  阅读(21)  评论(0)    收藏  举报