1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

初心者がデジタルプリディストーション(DPD)について調べてみた

1
Posted at

はじめに

かかれていること

この記事では、無線通信の分野でよく聞くデジタルプリディストーション(Digital Predistortion, DPD)とは何か、何が出来るのかをついて初心者なりに調べてみたのでまとめてみます。最近勉強し始めたばっかりなので、私の知識の整理のために書いている、という面が多いですもし間違っていればご指摘いただければ幸いです。

想定する知識

式はいくつか出てくる予定ですが、この記事では出来るだけ具体化することで

  • 高校数学(三角関数, 数列)
  • 簡単な行列の知識

の範囲で説明してみます。
さらに、この章の次の章では、行列計算で書くことで一般化を試みる予定です。

背景

どうやってアンテナから情報を送信するの?

送信機は送りたいデータの変調を行い、フィルタ等の処理を施したのちにパワーアンプで増幅させて、アンテナから送信します。
デジタルプリディストーションは、このパワーアンプで発生する問題を解決する技術になります。

wireless_system.png

パワーアンプにおいて発生する問題

どのような問題が発生するかというと、入力した変調波が一部歪みが発生してしまいます。これは、パワーアンプのゲインが厳密に線形ではなく、非線形性を有しているためです。これはパワーアンプを使う以上どうしても発生してくる歪みです。

dpd1.png

では、どんな波形が出てくるのでしょうか。下記のサイトを見ると、2つの周波数成分のsin波(=2トーン)を入れると、パワーアンプを通した後、下記のように余分な周波数成分が出てきてしまうそうです。

dpd2.png

まず、これが本当か、確かめてみましょう。

確認には、MathWorks社のSimulinkというブロック線図ベースでシミュレーションを記述できるソフトを活用しました。
入力としては、80Hzと100HzのSin波を入力したときに、パワーアンプを通る前後でどのような周波数成分が出てくるかを確認しました。
ここで、パワーアンプのゲイン入力値に対して非線形となっており、ピーク近くになるとサチるような特性としています。

スクリーンショット 2025-07-23 212807.png

この結果を見ると、たしかに書いてあることは正であるようです。パワーアンプ通過前には80Hz$(=f_1)$と100Hz$(=f_2)$の周波数成分が出ていますが、通過後には、60Hz$(=2f_1-f_2)$、120Hz$(=2f_2-f_1)$、260Hz$(=2f_1+f_2)$、280Hz$(=f_1+2f_2)$といった成分が出ています。
では、どのようにすれば、歪んでない信号を送信できるのでしょうか。ここで登場するのがデジタルプリディストーションになります。

デジタルプリディストーションとは?

デジタルプリディストーションでしたいこと

ディジタルプレディストーションは、非線形歪みを補償するための手法です。非線形性が問題となるパワーアンプの入力信号を、あらかじめ歪ませることで、デバイスを通過した後の出力信号が望ましい形になるよう調整します。

では、どのように歪まれせればよろしいでしょうか。
歪ませる量を求めるためには、

  1. パワーアンプの特性を数式でモデル化する
  2. パワーアンプのモデル式から、歪みをうち消すような事前の処理を求める

の手順で実行します。

デジタルプリディストーションを使った解決法

まず、パワーアンプの特性を多項式でモデル化します。

パワーアンプの非線形モデル

y(t) = \sum_{k=1}^{N}a_k x(t) ^ k

ここで:
$x(t)$:入力信号
$x(t)$:出力信号
$a_k$:非線形係数
$N$:多項式の次数

にて、適当な$a_k$を置くことで、非線形のパワーアンプの特性をモデル化できます。
$a_k$の決め方は、入力信号$x(t)$と出力信号$x(t)$のデータセットの誤差が最も小さくなるような係数を導出します。これは、最小二乗法を用いて、下記のように求めることができます。

  1. 入力信号$x(t)$・出力信号$y(t)$の$t=M$ステップのデータセットを用意
x(1), x(2),  x(3), \cdots x(M)
y(1), y(2), y(3), \cdots y(M)
  1. 行列形式に変換
 \bf{y} = \begin{bmatrix} y(1) & y(2) & y(3) & \cdots & y(M)\end{bmatrix}
 \bf{a} = \begin{bmatrix} a_1 & a_2 & a_3 & \cdots & a_N\end{bmatrix}
 \bf{X} = 
 \begin{bmatrix}
 x(1) & x(1)^2 & x(1)^3 & \cdots & x(1)^N \\
 x(2) & x(2)^2 & x(2)^3 & \cdots & x(2)^N \\
  \vdots & \vdots & \vdots & \ddots & \vdots \\
 x(M) & x(M)^2 & x(M)^3 & \cdots & x(M)^N \\
 \end{bmatrix}

としたとき、最小二乗法から

\bf{a} = (X^T X)^{-1} X^T y

で係数を決定できます。

モデル化の具体例

では、本当にモデル化できるのか、具体例を使って少し試してみましょう。
先ほどのモデルの入力を$x$、出力を$y$としてサンプリングし、そのデータを使って最小二乗法を解いてみましょう。この例では、$N=5$次の項まで計算することとします。

スクリーンショット 2025-07-23 214525.png
入力を$x$、出力を$y$としてデータを保存します。
ここから、下記のMATLABスクリプトを使って

\bf{a} = (X^T X)^{-1} X^T y

の計算を行います。(MATLABは簡単に書けて便利ですね!)

calc_a.m
X = zeros(1001,5); % 5行10001列の行列を初期化

for N = 1:5 % 1~5乗
    for M = 1:10001 % サンプリングしたデータ(10001点)
        X(M,N) = out.x.Data(M)^N;
    end
end

y = out.y.Data;

%最小二乗法
a = inv(transpose(X)*X)*transpose(X)*y

この結果、このケースでは

a(1) = 1.37425974455905
a(2) = 1.09785708712156e-15
a(3) = -0.435604489266163
a(4) = 1.66864029531160e-16
a(5) = 0.0597975372466293

という結果が得られたので、この値を代入して、パワーアンプが模擬(モデル化)できているかを確認します。

早速

y(t) = \sum_{k=1}^{N}a_k x(t) ^ k

の内、$N=1\cdots5$まで

y(t) = a_1 x(t) + a_2 x(t) ^ 2 + a_3 x(t) ^ 3 + a_4 x(t) ^ 4 + a_5 x(t) ^ 5

の式に$a$を代入してみますが、
よく見ると、$a(2)\approx0$、$a(4)\approx0$ですので、さらに簡単のため

y(t) = a_1 x(t) + a_3 x(t) ^ 3 + a_5 x(t) ^ 5

でシミュレーションを行ってみましょう。

スクリーンショット 2025-07-23 223157.png

これを見ると、出力側ではパワーアンプと同じ周波数成分が出ているため、モデル式によってパワーアンプの非線形成分をモデル化(模擬)できていることがわかるかと思います。
では、この数式を使ってどのように歪みを打ち消せばよろしいでしょうか。

補正係数の導出

上記の議論によって

y(t) = a_1 x(t) + a_3 x(t)^3 + a_5 x(t) ^ 5 \tag{3}

の$a_1, a_3, a_5$が導出しました。これを線形にするための補正係数を決めていきます。
では、補正信号を以下のように仮定します。この補正信号をパワーアンプに入力することとします。

y_{dpd}(t) = x(t) - c_2 x(t)^3 -c_3 x(t) ^ 5 \tag{4}

$(3)$に$(4)$を代入し、主要な項を計算すると(5次以上は無視)

  1. $a_1 x_{dpd}(t)$の項:
\begin{align}
 & a_1 x_{dpd}(t) = a_1 x(t) - c_2 a_1 x(t)^3 - c_3 a_1 x(t)^5 
\end{align}
  1. $a_3 x_{dpd}(t)^3$の項:
\begin{align}
 & a_3 (x(t) - c_2 x(t)^3 -c_3 x(t) ^ 5)^3 \\
  &= a_3 (x(t)^3 - 3c_2 x(t)^5 +\cdots )\\
  &= a_3 x(t)^3 - 3a_3 c_2 x(t)^5 
\end{align}
  1. $a_5 x_{dpd}(t)^5$の項:
\begin{align}
 & a_5 (x(t) - c_2 x(t)^3 -c_3 x(t) ^ 5)^5 \\
  &= a_5 x(t)^5 +\cdots
\end{align}

よって

\begin{align}
y(t) &= a_1 x_{dpd}(t) + a_3 x_{dpd}(t)^3 + a_5 x_{dpd}(t)^5 \\
& = a_1 x(t) - c_2 a_1 x(t)^3 - c_3 a_1 x(t)^5 \\
& + a_3 x(t)^3 + 3 a_3 c_2 x(t)^5 \\
& + a_5 x(t)^5 \\
& = a_1 x(t) + (a_3 - c_2 a_1)x(t)^3 + (a_5 - 3 a_3c_2 - c_3 a_1) x(t)^5
\end{align}

この式が線形になるように補正すれば良いので、$x(t)^3$および$x(t)^5$の項の係数が0になるようにすればよく

\left\{
\begin{array}{ll}
a_3-c_2 a_1  = 0 \\
a_5 - 3 a_3 c_2 -c_3 a_1 = 0
\end{array}
\right.
\Leftrightarrow\left\{
\begin{array}{ll}
c_2  =  \frac{a_3}{a_1} \\
c_3 = \frac{a_5-3 a_3 c_2}{a_1}
\end{array}
\right.

と導出することが出来ました。これを入れたものをシミュレーションしてみます。

calc_c.m
c2 = a(3)/a(1);
c3 = (a(5) - a(3)*c2)/a(1);
c2 = -0.316973913403781
c3 = -0.0569599180375016

スクリーンショット 2025-07-23 224837.png

これを見ると、補正有り/無しを比較し、余分な周波数成分が減少していることが分かります。上手く打ち消せていそうですね。

メモリ効果のある場合

ここまでの議論では、パワーアンプのゲイン特性が過去の入力に依存しないことを前提にしてきましたが、実際には過去の入力にも依存します。この特性をメモリ効果といいます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?