数字预失真(DPD)小试
前言
射频功放的增益响应并非线性的,受到放大管饱和效应的影响,功放不可避免地出现非线性、甚至具有记忆效应的失真。这种非线性失真不仅产生高阶谐波,还会产生互调干扰,降低带内信噪比,影响带外信号。因此,需要一种方式减弱射频功放的非线性增益,数字预失真就是方式之一。ADI有篇文章不错,看完之后基本可以独立实现DPD算法。
本文将从 信号产生->失真模拟->失真模型检验->逆模型检验效果 四个部分验证DPD算法在双音与多音通信系统中的matlab验证。
信号产生
采样率1MHz 生成90kHz、100kHz、110kHz三音信号,采样点数16384。
%% 信号产生
fs = 1e6;
f1 = 90e3;
f2 = 100e3;
f3 = 110e3;
N = 1024 * 16;
N_FFT = N;
tmax = N / fs;
t = linspace(0, tmax, N);
sig_in = sin(2 * pi * f1 .* t) + sin(2 * pi * f2 .* t) + sin(2 * pi * f3 .* t);
sig_in = sig_in / max(sig_in);
失真模型
射频功放PA部分,使用saleh模型模拟无记忆失真,使用FIR滤波器模拟记忆效应。
%% 建立带记忆功放失真模型
b = [0.7692 0.1538 0.0769]; %《射频功放数字预失真线性化技术研究_詹鹏》
a = [1];
% 使用saleh模型模拟无记忆失真,使用FIR滤波器模拟记忆效应,检测该模型的AM/AM与AM/PM
u = linspace(0, 1, N);
PA_out_u = saleh(filter(b, a, u));
figure(1)
subplot(2, 1, 1)
plot(u, abs(PA_out_u));
hold on
plot(u, u);
hold off;
title("AM/AM")
xlabel("sig in")
ylabel("PA out")
subplot(2, 1, 2)
plot(u, angle(PA_out_u));
title("AM/PM")
xlabel("sig in")
ylabel("PA out")
PA_out = saleh(filter(b, a, sig_in););
figure(2)
clf
plot(real(PA_out))
hold on
plot(real(sig_in))
hold off
plt_fft(PA_out', fs, 3, 1);
ylim([-80 0])
xlim([0 200e3])
ylabel("功率谱")
xlabel("f/Hz")
title("预失真补偿前")
其中saleh模型如下:
点击查看代码
function y = saleh(x)
%para = [2.1587 1.1517 4.0033 9.1040];
para = [1.5 0.5 pi/3 1];
a1 = para(1); b1 = para(2);
a2 = para(3); b2 = para(4);
ain = abs(x);
thetain = angle(x);
aout = a1 .* ain ./ (1 + b1 .* ain .^ 2);
thetapm = a2 * ain .^ 2 ./ (1 + b2 .* ain .^ 2);
thetaout = thetain + thetapm;
y = aout .* exp(1j * thetaout);
endplt_fft是画图部分,代码如下
点击查看代码
function []=plt_fft(x, fs, num,t1)
L = length(x);
Y = fft(real(x.*hann(L)));
P2 = abs(Y / L);
P1 = P2(1:L / 2 + 1);
P1(2:end - 1) = 2 * P1(2:end - 1);
f = fs * (0:(L / 2)) / L;
if t1==1
P1=20*log10(abs(P1/max(P1)));
else
P1=20*log10(abs(P1));
end
figure(num)
plot(f, P1)
end
失真模型检验
预失真部分,使用简化的广义记忆多项式模型,不包含交叉项,这样虽然丢失了一部分记忆效应,但是计算量骤减。
%% 建立预失真
x = sig_in;
y = PA_out;
x = x.';
y = y.';
K = 7;
M = 3;
X = MP_model(x, K, M);
Y = MP_model(y, K, M);
% 拟合测试,判断阶数与记忆深度是否匹配
U = MP_model(u.', K, M);
X_H = X';
w_test = pinv(X_H * X) * X_H * y;
y_dis = U * w_test;
figure(6)
subplot(2, 1, 1)
plot(u, u);
hold on
plot(u, abs(PA_out_u));
hold on
plot(u, abs(y_dis));
hold off;
legend(["line" "PA_out_u" "GMP_u"])
title("AM/AM")
xlabel("sig in")
ylabel("PA out")
subplot(2, 1, 2)
plot(u, angle(y_dis));
title("AM/PM")
xlabel("sig in")
ylabel("PA out")
hold off;
其中MP_model是构建GMP部分,代码如下
点击查看代码
function [Y] = MP_model(x_i, K, M) for m=0:M
x=mat_delay(x_i, m);
for k=0:K
if k==0
H=x;
else
H=[H,x.*(abs(x).^k)];
end
end
if m==0
Y=H;
else
Y=[Y,H];
end
end其中mat_delay是记忆部分,代码如下
点击查看代码
function x_d = mat_delay(x, dd) if dd == 0
x_d = x;
else
x_d = circshift(x, dd);
x_d(1:dd, 1) = 0;
end end
逆模型检验效果
%% 使用逆模型构建预失真
Y_H = Y';
w = pinv(Y_H * Y) * Y_H * x;
X_pre = X * w;
PA_out2 = saleh(filter(b,a,X_pre));
figure(4)
plot(real(PA_out2))
hold on
plot(real(PA_out))
hold off
plt_fft(PA_out2, fs, 5, 1);
ylim([-80 0])
xlim([0 200e3])
ylabel("功率谱")
xlabel("f/Hz")
title("预失真补偿后")
效果

github
- 主文件为main_detail.m,详见注释
github地址
数字预失真(DPD)小试的更多相关文章
- GaN助力运营商和基站OEM实现5G sub-6GHz和mmWave大规模MIMO
到2021年,估计全球会有更多的人拥有移动电话(55亿),将超过用上自来水的人数(53亿).与此同时,带宽紧张的视频应用将进一步增加对移动网络的需求,其会占移动流量的78%.使用大规模多输入多输出(M ...
- FMC子卡设计资料原理图:FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡
FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡 一.产品概述 ADRV9002 是一款高性能.高线性度.高动态范围收发器,旨在针对性能与功耗系统进行优化.该设备是可配置的,非常适合要 ...
- 基于AD9361的双收双发射频FMC子卡
FMC177-基于AD9361的双收双发射频FMC子卡 一.板卡介绍 FMC177射频模块分别包含两个接收通道与发射通道,其频率可覆盖达到70MHz~6GHz,AD9361芯片提供具有成本效益的实验平 ...
- L230 RF可靠性测试-RF指标
最近调试Zigbee 和2.4G产品时需要做一些认证,查找到常用的RF指标. ----------http://www.52rd.com/S_TXT/2016_5/TXT83303.htm------ ...
- JavaScript知识点
Day 01 1.Javascript 概述 1.什么是Javascript (JS) Javascript 是一种运行于 JS解释器/引擎 中的解释型脚本语言 JS解释器/引擎 :JS运行环境 1. ...
- JavaScript原生对象总纲
一. javascript之Array类 创建js数组两种方式: var arr = []; 或var arr = new Array(); ()里可以指定长度,也可以不指定,指不指定都无所谓,因为 ...
- 论文翻译:2020_Nonlinear Residual Echo Suppression using a Recurrent Neural Network
论文地址:https://indico2.conference4me.psnc.pl/event/35/contributions/3367/attachments/779/817/Thu-1-10- ...
- java中多个数字运算后值不对(失真)处理方法
最近遇到一个bug ,在java里面计算两个数字相减,633011.20-31296.30 得到的结果居然是601714.8999999999,丢失精度了,原来这是Java浮点运算的一个bug. 解决 ...
- js中多个数字运算后值不对(失真)处理方法
最近遇到一个bug ,在js里面计算两个数字相减,633011.20-31296.30 得到的结果居然是601714.89,领导不乐意了说怎么少了0.01,我一听,噶卵达,来达鬼,不可能啊,我Goog ...
- python预课02 time模块,文本进度条示例,数字类型操作,字符串操作
time模块 概述:time库是Python中处理时间的标准库,包含以下三类函数 时间获取: time(), ctime(), gmtime() 时间格式化: strftime(), strptime ...
随机推荐
- 火山引擎 DataTester 背后,抖音的名字原来是 AB 测试来的
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 抖音的名字是怎么来的? 在字节跳动火山引擎技术开放日上,字节跳动副总裁杨震原曾透露过"抖音"名 ...
- Axure 表单元件
文本框:一条 文本域:整个区域多行 单选:指定单元按钮组
- Spring事务传播机制解析
确保数据一致性的关键 在Java的Spring框架中,事务管理是保证应用数据一致性和可靠性的关键.Spring提供了灵活的事务传播机制,它定义了事务边界,以及在嵌套方法调用时如何处理事务.本文旨在深入 ...
- 解决延迟有 Wi-Fi 6 就够了!
最近二狗子家里的路由器坏了,而家里的数据网络信号又非常差,失去了路由器基本上就等于和世界隔离,所以二狗子打算去附近商城随便买一个新的路由器,结果售货员张口就问:"买 Wi-Fi 6 的路由器 ...
- 【HZERO】分支管理
分支管理 分支类型 feature-[任务编号]-简单描述: 任务开发分支,针对迭代子任务建立的开发分支 bugfix :修复分支,用于缺陷修复. develop:开发分支,所有开发人员都可以提交代码 ...
- OS | 读者写者问题(读者优先,写者优先 ,读写公平)
读者优先 读者优先的解决方案: 互斥信号量 wrt,初值是 \(1\),代表一个共享文件,解决 "读-写"互斥,"写-写"互斥. 一个记数器,即整型变量 rea ...
- ACM:快读读入技巧
快速读入:当数据输入较大时,比scanf快 inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9') ...
- java bean和String之间相互转化
开发中有的表字段特别多,在数据传递过程中要写很多类似实体类的get.set方法把字符串型的数据放到对象里然后,在做存储之类的操作,如果实体的字段少不会觉得多麻烦,但是字段如果有几十个或者更多那么这种简 ...
- util工具函数
1 /** 2 * @param {Function} fn 防抖函数 3 * @param {Number} delay 延迟时间 4 */ 5 export function debounce(f ...
- 05_二叉树的层次遍历II
二叉树的层序遍历 II 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 . (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 示例 1: 输入:root = [3,9,20 ...