首页 > 其他分享 >数字预失真(DPD)小试

数字预失真(DPD)小试

时间:2023-10-12 11:11:06浏览次数:39  
标签:plot PA 失真 DPD sig 小试 hold out

前言

射频功放的增益响应并非线性的,受到放大管饱和效应的影响,功放不可避免地出现非线性、甚至具有记忆效应的失真。这种非线性失真不仅产生高阶谐波,还会产生互调干扰,降低带内信噪比,影响带外信号。因此,需要一种方式减弱射频功放的非线性增益,数字预失真就是方式之一。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")

sig_in = filter(b, a, sig_in);
PA_out = saleh(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 = 5;
M = 2;

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

逆模型检验效果

%% 使用逆模型构建预失真
Y_H = Y';
w = pinv(Y_H * Y) * Y_H * x;
X_pre = X * w;
PA_out2 = saleh(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("预失真补偿后")

效果

image

标签:plot,PA,失真,DPD,sig,小试,hold,out
From: https://www.cnblogs.com/maaaaark/p/17758919.html

相关文章

  • DPDK-22.11.2 [四] Virtio_user as Exception Path
    因为dpdk是把网卡操作全部拿到用户层,与原生系统驱动不再兼容,所以被dpdk接管的网卡从系统层面(ipa/ifconfig)无法看到,同样数据也不再经过系统内核。如果想把数据再发送到系统,就要用到virtiouser。这种把数据从dpdk再发送到内核的步骤,就叫做exceptionpath。有关virtiouser,又有一......
  • GDA CTF应用方向:牛刀小试ONE
    简介作者:梦幻的彼岸测试程序来源:https://github.com/num1r0/android_crackmes本篇文章涉及工具:GDAcrackme_0x01通过快捷按钮进入APK入口点进行分析,如下图所示:入口点代码代码解析这段代码定义了一个名为MainActivity的Android应用程序类,它继承自AppCompatActivity。此......
  • 手动开发-实现SpringMVC底层机制--小试牛刀
    在这里说的底层机制的实现主要是指:前端控制器、Controller、Service注入容器、对象自动装配、控制器方法获取参数、视图解析、返回json数据。前端控制器前端控制器就是核心控制器。在这里我们可以设计一个Servlet来充当核心控制器:LingDispatcherServlet.java.这个控制器的作用......
  • dpdk 编译
     引用: https://zhuanlan.zhihu.com/p/56670068720.11版本 DPDK(DataPlaneDevelopmentKit)是数据平面开发工具包,由用于加速在各种CPU架构上运行的数据包处理的库组成。DPDK需要一定的网卡硬件支持,以Intel为例,支持以下网卡: 下面带大家过一遍编译流程,扫清后续应用的......
  • dpdk lpm
    DPDKLPM(LongestPrefixMatch)是高性能前缀路由匹配库,用于数据包转发过程中快速查找与dstIP地址最长匹配的路由表项。LPM特点高性能:基于前缀树算法实现快速匹配。线程安全:多线程并发安全。灵活配置:支持动态配置路由表,可在运行时添加、删除或修改路由表项。内存管理:使用MemoryPo......
  • dpdk官方转发例子分析
    例子源码http://dpdk.org/browse/dpdk/tree/examples/skeleton/basicfwd.cmain函数主流程1.初始化环境抽象层EALintret=rte_eal_init(argc,argv);if(ret<0)rte_exit(EXIT_FAILURE,"ErrorwithEALinitialization\n");2.分配mempooldpdk使用mbuf保存packet,me......
  • yourls安装-报错AbstractExtendedPdo.php
    1`Fatalerror:UncaughtPDOException:SQLSTATE[HY000]:Generalerror:3Errorwritingfile'./example_com/yourls_url.frm'(Errcode:28)in/www/wwwroot/example.com/includes/vendor/aura/sql/src/AbstractExtendedPdo.php:565Stacktrace:#0/www/w......
  • 9.17 小试牛刀
    实操设计小米官网网站设计顶层黑色导航(9.17)遇到的问题1.如何链接css?<linkrel="stylesheet"type="text/css"href="style.css"/>2.如何去除无序列表前面的小点?list-style:none;3.如何弄走链接的下划线?text-decoration:none;小米logo如何与其他文字并排?这个......
  • DPDK基本原理
    内核处理网络数据包弊端中断处理处理大量网络数据包时,出现频繁的硬件中断,产生较高的性能开销。内存拷贝网络数据包从网卡到应用程序流程是,数据从网卡通过DMA传到内核缓冲区,从内核态拷贝到用户态。上下文切换硬件中断、多线程、锁竞争产生上下文切换开销。CPU缓存失效数据包处......
  • DPDK-22.11.2 [四] 官方basicfwd编译运行讲解
    编译安装dpdk绑定网卡驱动vfio必须有两个网口配置LD_LIBRARY_PATH和PKG_CONFIG_PATH编译运行basicfwd.c/*SPDX-License-Identifier:BSD-3-Clause*Copyright(c)2010-2015IntelCorporation*/#include<stdint.h>#include<stdlib.h>#include<inttypes.h>#incl......