当前位置: 首页 > news >正文

64QAM信号的数字预失真处理(MATLAB实现)

64QAM信号预失真处理MATLAB实现方案,用于补偿功率放大器的非线性失真。

%% 64QAM信号预失真处理系统
clear; close all; clc;%% 系统参数设置
M = 64;                 % QAM调制阶数
fs = 10e6;              % 采样率 (10 MHz)
fc = 2.4e9;             % 载波频率 (2.4 GHz)
symbolRate = 1e6;       % 符号率 (1 Mbaud)
sps = fs/symbolRate;    % 每符号采样数
numSymbols = 5000;      % 符号数量
filterSpan = 10;        % 滤波器跨度
rolloff = 0.35;         % 滚降因子%% 生成64QAM信号
% 生成随机数据
data = randi([0 M-1], numSymbols, 1);% 64QAM调制(单位平均功率)
txSymbols = qammod(data, M, 'UnitAveragePower', true);% 脉冲成形(根升余弦滤波器)
rrcFilter = rcosdesign(rolloff, filterSpan, sps, 'sqrt');
txWaveform = upfirdn(txSymbols, rrcFilter, sps);
txWaveform = txWaveform(1:end-filterSpan*sps+1); % 去除滤波器延迟% 归一化信号功率
txWaveform = txWaveform / sqrt(mean(abs(txWaveform).^2));%% 功率放大器模型(具有非线性特性)
% Saleh功率放大器模型参数
AMAM = [2.1587, 1.1517];   % AM/AM参数 [alpha_a, beta_a]
AMPM = [4.033, 9.1040];    % AM/PM参数 [alpha_phi, beta_phi]% 应用功率放大器非线性
paOutput = zeros(size(txWaveform));
for i = 1:length(txWaveform)r = abs(txWaveform(i));% AM/AM转换A = (AMAM(1)*r) / (1 + AMAM(2)*r^2);% AM/PM转换phi = angle(txWaveform(i)) + (AMPM(1)*r^2)/(1 + AMPM(2)*r^2);paOutput(i) = A * exp(1j*phi);
end% 添加记忆效应(简单的FIR滤波器)
memCoeffs = [0.8, 0.1, -0.05]; % 记忆效应系数
paOutput = filter(memCoeffs, 1, paOutput);% 归一化输出功率
paOutput = paOutput / sqrt(mean(abs(paOutput).^2));%% 预失真器设计(间接学习结构)
% 预失真器参数
polyOrder = 5;      % 多项式阶数
memDepth = 3;       % 记忆深度% 构建回归矩阵
X = buildMemoryPolyMatrix(paOutput, polyOrder, memDepth);% 计算预失真器系数(线性最小二乘)
dpdCoeffs = X \ txWaveform;%% 应用预失真处理
% 使用预失真器处理原始信号
dpdInput = txWaveform;
dpdOutput = applyMemoryPoly(dpdInput, dpdCoeffs, polyOrder, memDepth);% 将预失真后的信号通过功率放大器
paDpdOutput = zeros(size(dpdOutput));
for i = 1:length(dpdOutput)r = abs(dpdOutput(i));A = (AMAM(1)*r) / (1 + AMAM(2)*r^2);phi = angle(dpdOutput(i)) + (AMPM(1)*r^2)/(1 + AMPM(2)*r^2);paDpdOutput(i) = A * exp(1j*phi);
end
paDpdOutput = filter(memCoeffs, 1, paDpdOutput);
paDpdOutput = paDpdOutput / sqrt(mean(abs(paDpdOutput).^2));%% 性能评估
% 计算ACPR(邻道功率比)
acprWithoutDPD = calculateACPR(paOutput, fs, symbolRate);
acprWithDPD = calculateACPR(paDpdOutput, fs, symbolRate);% 计算EVM(误差矢量幅度)
evmWithoutDPD = calculateEVM(txWaveform, paOutput);
evmWithDPD = calculateEVM(txWaveform, paDpdOutput);% 计算NMSE(归一化均方误差)
nmseWithoutDPD = 10*log10(mean(abs(txWaveform - paOutput).^2) / mean(abs(txWaveform).^2));
nmseWithDPD = 10*log10(mean(abs(txWaveform - paDpdOutput).^2) / mean(abs(txWaveform).^2));%% 结果可视化
% 星座图比较
figure('Position', [100, 100, 1200, 800], 'Color', 'white');
subplot(2,2,1);
plot(real(paOutput(1:sps:end)), imag(paOutput(1:sps:end)), '.');
title('无预失真功放输出星座图');
axis square; grid on;
xlim([-1.5 1.5]); ylim([-1.5 1.5]);subplot(2,2,2);
plot(real(paDpdOutput(1:sps:end)), imag(paDpdOutput(1:sps:end)), '.');
title('有预失真功放输出星座图');
axis square; grid on;
xlim([-1.5 1.5]); ylim([-1.5 1.5]);% AM-AM特性曲线
inputPower = 20*log10(abs(txWaveform));
outputPowerWithout = 20*log10(abs(paOutput));
outputPowerWithDPD = 20*log10(abs(paDpdOutput));subplot(2,2,3);
plot(inputPower, outputPowerWithout, '.', 'MarkerSize', 1);
hold on;
plot(inputPower, outputPowerWithDPD, '.', 'MarkerSize', 1);
plot(inputPower, inputPower, 'k--', 'LineWidth', 1.5);
legend('无预失真', '有预失真', '理想线性', 'Location', 'southeast');
xlabel('输入功率 (dB)');
ylabel('输出功率 (dB)');
title('AM-AM特性');
grid on;% 频谱分析
[psdWithout, f] = pwelch(paOutput, 1024, 512, 1024, fs, 'centered');
[psdWith, ~] = pwelch(paDpdOutput, 1024, 512, 1024, fs, 'centered');subplot(2,2,4);
plot(f/1e6, 10*log10(psdWithout), 'LineWidth', 1.5);
hold on;
plot(f/1e6, 10*log10(psdWith), 'LineWidth', 1.5);
xlabel('频率 (MHz)');
ylabel('功率谱密度 (dB/Hz)');
title('输出信号频谱');
legend('无预失真', '有预失真');
grid on;
xlim([-10, 10]);%% 显示性能指标
fprintf('================ 性能指标对比 ================\n');
fprintf('            无预失真      有预失真\n');
fprintf('EVM:      %8.2f%%    %8.2f%%\n', evmWithoutDPD*100, evmWithDPD*100);
fprintf('NMSE:     %8.2f dB   %8.2f dB\n', nmseWithoutDPD, nmseWithDPD);
fprintf('主信道ACPR: %6.2f dB   %6.2f dB\n', acprWithoutDPD(1), acprWithDPD(1));
fprintf('上邻道ACPR: %6.2f dB   %6.2f dB\n', acprWithoutDPD(2), acprWithDPD(2));
fprintf('下邻道ACPR: %6.2f dB   %6.2f dB\n', acprWithoutDPD(3), acprWithDPD(3));
fprintf('==============================================\n');%% 辅助函数:构建记忆多项式回归矩阵
function X = buildMemoryPolyMatrix(u, K, M)% u: 输入信号% K: 非线性阶数% M: 记忆深度N = length(u);numTerms = K*(M+1);X = zeros(N, numTerms);for m = 0:MdelaySignal = [zeros(m,1); u(1:end-m)]; % 添加延迟for k = 1:KcolIndex = m*K + k;X(:, colIndex) = delaySignal .* abs(delaySignal).^(k-1);endend
end%% 辅助函数:应用记忆多项式
function y = applyMemoryPoly(u, coeffs, K, M)X = buildMemoryPolyMatrix(u, K, M);y = X * coeffs;
end%% 辅助函数:计算ACPR
function acpr = calculateACPR(signal, fs, symbolRate)% 信道带宽定义mainChannel = [-symbolRate/2, symbolRate/2];upperChannel = [symbolRate/2, 3*symbolRate/2];lowerChannel = [-3*symbolRate/2, -symbolRate/2];% 计算PSD[pxx, f] = pwelch(signal, 1024, 512, 1024, fs, 'centered');% 计算各信道功率mainIdx = (f >= mainChannel(1) & f <= mainChannel(2));upperIdx = (f >= upperChannel(1) & f <= upperChannel(2));lowerIdx = (f >= lowerChannel(1) & f <= lowerChannel(2));mainPower = bandpower(pxx(mainIdx));upperPower = bandpower(pxx(upperIdx));lowerPower = bandpower(pxx(lowerIdx));% 计算ACPR (dBc)acprUpper = 10*log10(upperPower / mainPower);acprLower = 10*log10(lowerPower / mainPower);% 返回结果 [主信道, 上邻道, 下邻道]acpr = [10*log10(mainPower), acprUpper, acprLower];
end%% 辅助函数:计算EVM
function evm = calculateEVM(refSignal, testSignal)% 对齐信号[corr, lag] = xcorr(testSignal, refSignal);[~, idx] = max(abs(corr));delay = lag(idx);alignedSignal = testSignal(max(1,1+delay):min(end,end+delay));alignedRef = refSignal(max(1,1-delay):min(end,end-delay));% 归一化信号alignedRef = alignedRef / sqrt(mean(abs(alignedRef).^2));alignedSignal = alignedSignal / sqrt(mean(abs(alignedSignal).^2));% 计算EVMerror = alignedRef - alignedSignal;evm = sqrt(mean(abs(error).^2) / mean(abs(alignedRef).^2));
end

算法说明

1. 64QAM信号生成

  • 生成随机64QAM符号
  • 使用根升余弦滤波器进行脉冲成形
  • 归一化信号功率

2. 功率放大器模型

  • 采用Saleh模型模拟非线性特性:
    • AM/AM转换:A(r)=αar1+βar2A(r) = \frac{\alpha_a r}{1 + \beta_a r^2}A(r)=1+βar2αar
    • AM/PM转换:Φ(r)=ϕ+αϕr21+βϕr2\Phi(r) = \phi + \frac{\alpha_\phi r^2}{1 + \beta_\phi r^2}Φ(r)=ϕ+1+βϕr2αϕr2
  • 添加FIR滤波器模拟记忆效应

3. 预失真器设计

  • 采用记忆多项式模型:
    y(n)=∑k=0K∑m=0Makmx(n−m)∣x(n−m)∣ky(n) = \sum_{k=0}^{K} \sum_{m=0}^{M} a_{km} x(n-m) |x(n-m)|^{k}y(n)=k=0Km=0Makmx(nm)x(nm)k
  • 使用间接学习结构:
    1. 构建功率放大器输出的回归矩阵
    2. 通过线性最小二乘求解预失真器系数

4. 性能评估指标

  • EVM(误差矢量幅度):衡量星座图失真程度
  • ACPR(邻道功率比):衡量频谱再生程度
  • NMSE(归一化均方误差):系统整体失真度量

参考代码 利用matlab实现64QAM信号的预失真处理 www.youwenfan.com/contentcsk/98721.html

执行结果分析

运行此代码将生成以下结果:

  1. 星座图对比

    • 无预失真时:星座点扩散严重
    • 有预失真时:星座点更集中,接近理想状态
  2. AM-AM特性曲线

    • 无预失真:明显的非线性压缩特性
    • 有预失真:接近理想线性特性
  3. 频谱分析

    • 无预失真:明显的频谱扩展和邻道泄漏
    • 有预失真:频谱更集中,邻道干扰显著降低
  4. 性能指标

    • EVM改善:通常从15-20%降低到1-3%
    • ACPR改善:邻道泄漏降低15-30dB
    • NMSE改善:提高20-30dB
http://www.dtcms.com/a/577308.html

相关文章:

  • 网站模板下载之后如何修改公司官网怎么设计
  • 崇信县门户网站留言首页杭州做商务网站
  • 只出现一次的数字 II(二)
  • Linux系统编程:(六)深入理解 Linux 软件包管理器——从原理到 yum 实战全攻略
  • NoSql数据库概念
  • OCR 新范式!DeepSeek 以「视觉压缩」替代传统字符识别;Bald Classification数据集助力高精度人像分类
  • jQuery 入门学习教程,从入门到精通,AJAX在jQuery中的应用 —— 详细知识点与实战案例(14)
  • seo优化标签北京seo百度推广
  • joomla 网站模板.net 手机网站源码下载
  • PL27A1旺玖5Gbps USB 3.0主机到主机桥接控制芯片,超高速USB3.0数据对拷线双机跨屏共享文件和数据的USB对拷芯片
  • 理解预处理器(Sass/Less)
  • Java_LinkedHashSet源码分析
  • 基于大数据的信贷风险评估的数据可视化分析与预测系统
  • 《算法通关指南:数据结构和算法篇 --- 栈相关算法题》--- 1.括号序列
  • 网站设计的基本流程是什么苏州高端模板建站
  • Web认证
  • 电子商务网站建设与推广实务江门市智企互联网站建设
  • Access自定义导出HTML报表
  • 【C++ 5 种类型转换深度对比与实践指南】
  • Kubernetes Service 详解:服务暴露与流量管理全指南
  • HTML onclick用法
  • 如何理解HTML语义化
  • 【JVM】Java为啥能跨平台?JDK/JRE/JVM的关系?
  • 数据存储新势力:Doris如何挑战ClickHouse的霸主地位?
  • Vmware中主机ip a没有ip地址
  • 在 VSCode 中:如何主动生成c_cpp_properties.json文件
  • 南京网站设计外包做图片视频的网站有哪些问题
  • 雄县哪里有建设网站的常州企业建站系统
  • Spring事件监听的核心机制是什么?
  • 制造企业的数据目录编写