前言

射频功放的增益响应并非线性的,受到放大管饱和效应的影响,功放不可避免地出现非线性、甚至具有记忆效应的失真。这种非线性失真不仅产生高阶谐波,还会产生互调干扰,降低带内信噪比,影响带外信号。因此,需要一种方式减弱射频功放的非线性增益,数字预失真就是方式之一。ADI有篇文章不错,看完之后基本可以独立实现DPD算法。

RF通信的数字预失真:从等式到实现方案

本文将从 信号产生->失真模拟->失真模型检验->逆模型检验效果 四个部分验证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);
    end
  • plt_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

数字预失真(DPD)小试的更多相关文章

  1. GaN助力运营商和基站OEM实现5G sub-6GHz和mmWave大规模MIMO

    到2021年,估计全球会有更多的人拥有移动电话(55亿),将超过用上自来水的人数(53亿).与此同时,带宽紧张的视频应用将进一步增加对移动网络的需求,其会占移动流量的78%.使用大规模多输入多输出(M ...

  2. FMC子卡设计资料原理图:FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡

    FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡 一.产品概述 ADRV9002 是一款高性能.高线性度.高动态范围收发器,旨在针对性能与功耗系统进行优化.该设备是可配置的,非常适合要 ...

  3. 基于AD9361的双收双发射频FMC子卡

    FMC177-基于AD9361的双收双发射频FMC子卡 一.板卡介绍 FMC177射频模块分别包含两个接收通道与发射通道,其频率可覆盖达到70MHz~6GHz,AD9361芯片提供具有成本效益的实验平 ...

  4. L230 RF可靠性测试-RF指标

    最近调试Zigbee 和2.4G产品时需要做一些认证,查找到常用的RF指标. ----------http://www.52rd.com/S_TXT/2016_5/TXT83303.htm------ ...

  5. JavaScript知识点

    Day 01 1.Javascript 概述 1.什么是Javascript (JS) Javascript 是一种运行于 JS解释器/引擎 中的解释型脚本语言 JS解释器/引擎 :JS运行环境 1. ...

  6. JavaScript原生对象总纲

    一. javascript之Array类 创建js数组两种方式: var arr = [];  或var arr = new Array(); ()里可以指定长度,也可以不指定,指不指定都无所谓,因为 ...

  7. 论文翻译: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- ...

  8. java中多个数字运算后值不对(失真)处理方法

    最近遇到一个bug ,在java里面计算两个数字相减,633011.20-31296.30 得到的结果居然是601714.8999999999,丢失精度了,原来这是Java浮点运算的一个bug. 解决 ...

  9. js中多个数字运算后值不对(失真)处理方法

    最近遇到一个bug ,在js里面计算两个数字相减,633011.20-31296.30 得到的结果居然是601714.89,领导不乐意了说怎么少了0.01,我一听,噶卵达,来达鬼,不可能啊,我Goog ...

  10. python预课02 time模块,文本进度条示例,数字类型操作,字符串操作

    time模块 概述:time库是Python中处理时间的标准库,包含以下三类函数 时间获取: time(), ctime(), gmtime() 时间格式化: strftime(), strptime ...

随机推荐

  1. Mapper that could not be found

    现象1 mapper 资源扫不到 resources 建的是 目录 ,不是 package 所以如果直接 a.b 的方式创建,会扫描不到 mapper.xml 文件 现象2 缺少配置文件 HisDru ...

  2. dom4j selectNodes 取不到值 因为XML带有命名空间 HL7

    xml 如下: <?xml version="1.0" encoding="UTF-8"?> <POOR_IN200901UV ITSVers ...

  3. django基本流程

    创建项目 django-admin startproject web cd web python manage.py startapp weblist 生成迁移文件 python manage.py ...

  4. git一个空分支

    如果不想要当前创建的分支拥有创建节点之前的内容,就需要一个完全为空的分支,可以参考知乎这篇文章. 使用git checkout -b命令创建的分支是有父节点的,这意味着新的分支包含了历史提交,所以我们 ...

  5. 用 three.js 绘制三维带箭头线 (线内箭头)

    在LineMaterial.js基础上修改的ArrowLineMaterial.js代码: /** * @author WestLangley / http://github.com/WestLang ...

  6. 七、手动制作docker镜像

    系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...

  7. vue学习笔记 五、创建子组件实例

    系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...

  8. Asp .Net Core 系列:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现

    目录 简介 什么是 Ocelot ? 什么是 Nacos ? 什么是 Swagger ? 什么是 Cors ? Asp .Net Core 集成 Ocelot 网关集成 Nacos 下游配置 Naco ...

  9. 【驱动】SPI驱动分析(六)-RK SPI驱动分析

    前言 Linux的spi接口驱动实现目录在kernel\drivers\spi下.这个目录和一些层次比较明显的驱动目录布局不同,全放在这个文件夹下,因此还是只好通过看Kconfig 和 Makefil ...

  10. 【调试】kprobes(二)使用方法

    前言 上一节介绍了kprobe的基本概念,下面我们将使用几个具体的例子,看下kprobe在实际使用中有那些应用场景. kprobe 内核的samples/kprobe目录下有kprobe相关的例子,我 ...