OFDMのPAPR問題 — ピーク対平均電力比とその低減技術

スマートフォンで動画をストリーミングしているとき、端末はLTEや5G、Wi-Fiといった無線方式で大量のデータを受信しています。これらの通信方式はすべて OFDM(直交周波数分割多重) を物理層の根幹に採用しています。OFDMは周波数選択性フェージングに強く、高いスペクトル効率を実現できる優れた変調方式ですが、実は無視できない「弱点」を抱えています。それが本記事のテーマである PAPR(Peak-to-Average Power Ratio、ピーク対平均電力比) の問題です。

OFDM信号は、多数のサブキャリアを足し合わせて作られます。多数の正弦波がたまたま位相を揃えて加算されると、瞬間的に巨大な振幅のピークが発生します。平均電力はそれほど大きくないのに、ごくまれに発生する鋭いピークが平均の何倍にもなる — この「とがった波形」が、送信機の電力増幅器(PA)にとって悪夢のような負荷になります。PAは非線形な素子であり、大きなピークを正しく増幅できずに波形を歪ませ、その歪みが帯域外への電力漏れ(スペクトル再成長)や受信誤りの増加(EVM劣化)を引き起こします。

PAPRを理解し、その低減技術を学ぶことには、次のような具体的な意義があります。

  • 携帯端末・基地局の設計: PAPRが高いとPAを大きなバックオフで動作させる必要があり、電力効率が落ちてバッテリー持続時間や基地局の消費電力に直結します。5G NRの上り回線でDFT-s-OFDM(SC-FDMA)が採用された最大の理由は、まさにPAPRを下げるためです
  • 衛星通信・放送: 衛星中継器の進行波管増幅器(TWTA)は飽和点近くで動作させたいのに、高PAPR信号では大きなバックオフが避けられません。DVB-S2XやデジタルTV放送(ISDB-T等)でもPAPRは重要な設計指標です

本記事では、まず「なぜOFDMでピークが生じるのか」を振幅の合成という観点から導出し、PAPRを統計量(CCDF)として正確に評価します。続いてPAの非線形が引き起こす害を整理し、クリッピング、SLM、PTS、トーン予約といった代表的な低減技術の原理・効果・コストを、数式とPythonコードの両面から丁寧に解説していきます。

本記事の内容

  • OFDM信号でピークが生じる仕組み(N本のサブキャリアの同相加算と最大 $\sqrt{N}$ 倍の振幅)
  • PAPRとクレストファクタの定義、中心極限定理に基づく振幅分布
  • CCDF(相補累積分布関数)によるPAPRの統計的評価
  • 電力増幅器の非線形特性、バックオフ、スペクトル再成長とEVM劣化
  • 低減技術の原理と効果・コスト: クリッピング&フィルタリング、SLM、PTS、トーン予約
  • Python実装: PAPRのCCDF計算、クリッピング前後のスペクトルとBER、SLMの効果比較

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

OFDMの基本(サブキャリアの直交性、IFFTで時間波形を生成すること、サイクリックプレフィックス)を前提とします。また、電力増幅器の非線形を扱う際に、電力増幅器のクラス分類 — A級・B級・C級・D級の効率と原理 の知識があると、なぜバックオフが効率を下げるのかが直感的に理解できます。

なぜOFDM信号はピークを持つのか

多数の波の重ね合わせという直感

プールの水面を思い浮かべてください。1人が一定のリズムで水を叩くと、規則正しい波が広がります。ところが100人がてんでばらばらのタイミングで水面を叩くと、ほとんどの場所では波が打ち消し合って穏やかですが、ごくまれに全員の波の山がたまたま同じ場所・同じ瞬間に集まると、突然大きな水しぶきが上がります。OFDM信号のピークは、これとまったく同じメカニズムで生まれます。

OFDMでは、$N$ 本のサブキャリア(少しずつ周波数の異なる正弦波)にそれぞれデータを乗せ、それらを足し合わせて1つの時間波形を作ります。各サブキャリアの位相はデータによってばらばらです。多くの瞬間では位相がバラついて振幅は中程度に収まりますが、たまたま多数のサブキャリアの位相が揃った瞬間には、振幅が一気に積み上がって巨大なピークになります。

このピークがどれほど大きくなりうるのかを、数式で見ていきましょう。

OFDM時間信号の定義

OFDMのベースバンド時間信号は、$N$ 個の複素データシンボル $X_0, X_1, \dots, X_{N-1}$ を入力とする逆離散フーリエ変換(IDFT)として表されます。連続時間表現では、1シンボル区間 $0 \le t < T$ について次のように書けます。

$$ x(t) = \frac{1}{\sqrt{N}} \sum_{k=0}^{N-1} X_k \, e^{\,j 2\pi k \Delta f \, t} $$

ここで $\Delta f = 1/T$ はサブキャリア間隔、$X_k$ は第 $k$ サブキャリアに乗る変調シンボル(例えばQPSKや16QAMの信号点)です。$1/\sqrt{N}$ は電力を正規化するための係数で、後でPAPRを議論しやすくするために付けています。

実装ではこの連続信号を時間方向に $N$ 点(あるいはオーバーサンプリングして $LN$ 点)でサンプリングし、IFFTで計算します。サンプル番号を $n$ とすると、

$$ x_n = \frac{1}{\sqrt{N}} \sum_{k=0}^{N-1} X_k \, e^{\,j 2\pi k n / N}, \quad n = 0, 1, \dots, N-1 $$

これがまさにIFFTの定義式です。OFDMの送信処理が「IFFTそのもの」であることが、ここからも見て取れます。

最悪の場合 — 振幅は $\sqrt{N}$ 倍になる

ピークがどこまで大きくなりうるかを評価しましょう。各サブキャリアのシンボル $X_k$ の振幅を $|X_k| = 1$(例えばPSKのように一定包絡線の信号点)と仮定します。すると瞬時電力の最大値は、すべての項が同相で加算される(位相が完全に揃う)ときに達成されます。

具体的に、最悪のケースとして $n = 0$ の瞬間を考えると $e^{\,j 2\pi k \cdot 0 / N} = 1$ なので、もし全シンボルが $X_k = 1$ なら、

$$ x_0 = \frac{1}{\sqrt{N}} \sum_{k=0}^{N-1} 1 = \frac{1}{\sqrt{N}} \cdot N = \sqrt{N} $$

となります。このとき瞬時電力は $|x_0|^2 = N$ です。一方、信号の平均電力を計算してみましょう。サブキャリアが互いに直交しており、各シンボルが独立であることを使うと、

$$ P_{\text{avg}} = \mathbb{E}\!\left[ |x_n|^2 \right] = \frac{1}{N} \sum_{k=0}^{N-1} \mathbb{E}\!\left[ |X_k|^2 \right] = \frac{1}{N} \cdot N \cdot 1 = 1 $$

ここで $\mathbb{E}[X_k X_{k’}^*] = 0 \ (k \ne k’)$ という直交性(クロス項の期待値がゼロ)を用いました。つまり、平均電力は $1$ に正規化されているのに、最悪の瞬時電力は $N$ にまで達しうるのです。

したがって、ピーク電力と平均電力の比は最大で、

$$ \text{PAPR}_{\max} = \frac{P_{\text{peak}}}{P_{\text{avg}}} = \frac{N}{1} = N $$

サブキャリアが $N = 1024$ 本なら、理論上の最悪PAPRは $1024$ 倍、デシベルで $10\log_{10}(1024) \approx 30$ dB にもなります。これは「平均より1000倍も大きい瞬間が起こりうる」という、増幅器にとって極めて厳しい条件です。

ただし、この $N$ 倍という値はあくまで全サブキャリアの位相が完璧に揃う最悪ケースであり、実際にそれが起こる確率は天文学的に小さいものです。次節では、現実のPAPRがどのような統計分布に従うのかを、振幅の確率論から明らかにします。

PAPRの定義と統計的性質

PAPRとクレストファクタの定義

PAPRは、1つのOFDMシンボル区間内で、瞬時電力の最大値を平均電力で割った量として定義されます。連続時間信号 $x(t)$ について、

$$ \text{PAPR} = \frac{\displaystyle \max_{0 \le t < T} |x(t)|^2}{\displaystyle \frac{1}{T}\int_0^T |x(t)|^2 \, dt} $$

離散信号 $x_n$ では、

$$ \text{PAPR} = \frac{\displaystyle \max_{0 \le n < N} |x_n|^2}{\displaystyle \frac{1}{N}\sum_{n=0}^{N-1} |x_n|^2} $$

通常はデシベル表記し、$\text{PAPR}_{\text{dB}} = 10\log_{10}(\text{PAPR})$ とします。

似た概念に クレストファクタ(crest factor, CF) があります。これは電力比ではなく振幅(電圧)の比で、

$$ \text{CF} = \frac{\max |x_n|}{\sqrt{\frac{1}{N}\sum_n |x_n|^2}} = \sqrt{\text{PAPR}} $$

電力は振幅の2乗なので、PAPRはクレストファクタの2乗に等しい関係にあります。電子回路や測定の文脈ではクレストファクタ、通信システム設計の文脈ではPAPRがよく使われますが、本質は同じものを見ています。

PAPRが「最悪 $N$ 倍」になりうることはわかりましたが、実際の信号でその値がどう分布するのかを知るには、振幅の確率分布を調べる必要があります。

中心極限定理による振幅分布

OFDM信号 $x_n$ は、多数の独立な複素数 $X_k e^{j2\pi kn/N}$ の和です。サブキャリア数 $N$ が大きいとき、中心極限定理 により、この和の実部 $\Re(x_n)$ と虚部 $\Im(x_n)$ はそれぞれ平均0のガウス分布に近づきます。

実部・虚部がそれぞれ独立に $\mathcal{N}(0, \sigma^2)$ に従うとすると、振幅 $r = |x_n| = \sqrt{\Re(x_n)^2 + \Im(x_n)^2}$ は レイリー分布 に従います。

$$ p(r) = \frac{r}{\sigma^2} \exp\!\left(-\frac{r^2}{2\sigma^2}\right), \quad r \ge 0 $$

そして瞬時電力 $P = r^2 = |x_n|^2$ は 指数分布 に従います。変数変換 $P = r^2$($dP = 2r\,dr$)を施すと、

$$ p(P) = p(r) \left|\frac{dr}{dP}\right| = \frac{r}{\sigma^2}e^{-r^2/(2\sigma^2)} \cdot \frac{1}{2r} = \frac{1}{2\sigma^2}\exp\!\left(-\frac{P}{2\sigma^2}\right) $$

平均電力は $\mathbb{E}[P] = 2\sigma^2$ です。これを $P_{\text{avg}} = 2\sigma^2$ と置くと、規格化された瞬時電力 $z = P/P_{\text{avg}}$ は平均1の標準指数分布、

$$ p(z) = e^{-z}, \quad z \ge 0 $$

に従います。指数分布は「ほとんどの値は小さいが、ごくまれに非常に大きな値が出る」という長い裾を持つ分布です。この裾の存在こそが、OFDMでまれに大きなピークが発生する統計的な理由です。

瞬時電力の分布がわかったので、次は「1シンボル全体の最大値」が確率的にどう振る舞うかを定式化します。これがCCDFです。

CCDFによるPAPRの評価

PAPRは「1シンボル内の最大値」なので、単一サンプルの分布ではなく、$N$ サンプルの中の最大値の分布を考える必要があります。評価には CCDF(Complementary Cumulative Distribution Function、相補累積分布関数) を用います。CCDFは「PAPRがあるしきい値 $\gamma$ を超える確率」を表します。

$$ \text{CCDF}(\gamma) = \Pr\!\left[\text{PAPR} > \gamma\right] $$

まず、1サンプルの規格化電力 $z$ がしきい値 $\gamma$ 以下である確率(CDF)は、指数分布の積分から、

$$ \Pr[z \le \gamma] = \int_0^\gamma e^{-z}\,dz = 1 – e^{-\gamma} $$

$N$ 個のサンプルが互いに独立であると近似すると、$N$ サンプルすべてが $\gamma$ 以下である確率は各確率の積になります。

$$ \Pr[\text{全サンプル} \le \gamma] = \left(1 – e^{-\gamma}\right)^N $$

PAPRが $\gamma$ を超えるのは「少なくとも1サンプルが $\gamma$ を超える」場合なので、その余事象を取って、

$$ \text{CCDF}(\gamma) = \Pr[\text{PAPR} > \gamma] = 1 – \left(1 – e^{-\gamma}\right)^N $$

この式が、OFDMのPAPR評価で最も基本的な理論曲線です。ここで重要なのは、独立サンプルの仮定が成り立つのは「ナイキストレートでサンプリングした場合」に限られる点です。実際の連続波形のピークはサンプル点の間にも現れるため、ナイキストサンプリングだけではピークを見逃します。そこで実務では信号を $L$ 倍(典型的には $L = 4$)にオーバーサンプリングしてピークを捉えます。オーバーサンプリングを考慮した近似式として、

$$ \text{CCDF}(\gamma) \approx 1 – \left(1 – e^{-\gamma}\right)^{\alpha N} $$

がよく使われます。ここで $\alpha$ は実効的な独立サンプル数を補正する係数(経験的に $\alpha \approx 2.8$ 程度)です。実効サンプル数が増えるほど、大きなピークに出会う確率も上がるため、CCDF曲線は右にシフトします。

この理論曲線を後ほどPythonでシミュレーションと比較しますが、その前に、なぜPAPRがそこまで問題なのか — 電力増幅器の非線形という物理的な原因を見ておきましょう。

電力増幅器の非線形とPAPRの害

バックオフ — 効率を犠牲にする宿命

電力増幅器(PA)は、入力電力が小さいうちは入力に比例して出力を増幅しますが、ある点を超えると出力が頭打ち(飽和)になります。この飽和点を $P_{\text{sat}}$ と呼びます。PAを最も効率よく動作させられるのは飽和点の近くですが、そこで高PAPR信号を入れると、平均は飽和点より下でもピークが飽和点を超えてしまい、波形がクリップ(頭が潰れる)します。

これを避けるには、平均電力を飽和点から十分下げて動作させる必要があります。この「下げ幅」を バックオフ と呼びます。入力換算バックオフ(IBO)は、

$$ \text{IBO} = 10\log_{10}\!\left(\frac{P_{\text{sat}}}{P_{\text{avg}}}\right) \ \text{[dB]} $$

で定義されます。PAPRが大きいほど、ピークを飽和点以下に収めるために大きなバックオフが必要になります。ところがバックオフを大きく取るとPAは「能力を持て余した」状態で動くことになり、電力効率(DC入力電力に対するRF出力電力の比)が大幅に低下します。例えばA級増幅器は理論最大効率50%ですが、バックオフを大きく取ると効率は数%まで落ちることもあります。

つまりPAPR問題の本質は、「線形性(歪まないこと)」と「効率(電池が長持ちすること)」のトレードオフです。PAPRを下げられれば、同じ線形性を保ったままバックオフを小さくでき、効率を上げられます。

では、バックオフが不十分でピークがクリップされると、具体的に何が起こるのでしょうか。次にその害を2つの側面から見ます。

スペクトル再成長(帯域外放射)

PAの非線形特性は、数学的には入力 $x$ に対する出力 $y$ を多項式(テイラー展開)で近似できます。

$$ y = a_1 x + a_3 x^3 + a_5 x^5 + \cdots $$

偶数次の項は差動構成で打ち消されることが多いため、3次・5次といった奇数次の非線形項が支配的になります。ここで入力が2つの周波数成分 $x = \cos(\omega_1 t) + \cos(\omega_2 t)$ を持つ場合を考え、3次項 $a_3 x^3$ を展開すると、三角関数の積和公式を繰り返し適用することで、

$$ 2\omega_1 – \omega_2, \quad 2\omega_2 – \omega_1 $$

といった 相互変調歪み(IMD) の周波数成分が新たに生まれます。これらは元の信号帯域のすぐ外側に現れます。OFDMのように帯域内に多数の成分がある信号では、無数の相互変調積が帯域外に漏れ出し、スペクトルの裾が盛り上がります。これが スペクトル再成長(spectral regrowth) です。

帯域外放射は隣接チャネルに干渉を与えるため、各無線規格は ACLR(隣接チャネル漏洩電力比)スペクトラムマスク で厳しく規制しています。スペクトル再成長は、これらの規制に違反する最大の原因の1つです。

EVM劣化(帯域内歪み)

非線形歪みは帯域外に漏れるだけでなく、帯域内の信号点そのものも歪ませます。クリッピングによって信号点が本来あるべき位置からずれると、受信側のコンスタレーション(信号点配置)が広がってにじみます。このにじみの大きさを定量化するのが EVM(Error Vector Magnitude、誤差ベクトル振幅) です。

理想信号点を $s_i$、実際に受信した信号点を $\hat{s}_i$ とすると、EVMは誤差ベクトルの実効値を基準振幅で割った量として、

$$ \text{EVM}_{\text{rms}} = \sqrt{\frac{\frac{1}{M}\sum_{i=1}^{M} |\hat{s}_i – s_i|^2}{\frac{1}{M}\sum_{i=1}^{M}|s_i|^2}} $$

で定義されます($M$ はシンボル数)。EVMが大きいほど信号点が散らばり、判定誤りが増えてBER(ビット誤り率)が悪化します。特に64QAMや256QAMのように信号点が密集した高次変調では、わずかなEVM劣化でも誤りが急増します。5Gで256QAM以上を使う場合、EVM要求は数%以下と非常に厳しく、PAPR対策が必須になります。

ここまでで、PAPRがなぜ生じ、なぜ害になるのかが整理できました。いよいよ、その害を抑えるための代表的な低減技術を見ていきましょう。

PAPR低減技術

PAPR低減技術は数多く提案されていますが、考え方で大きく3つに分類できます。第1は信号を歪ませて無理やりピークを潰す 歪み系(クリッピング等)、第2は複数の候補信号から最もPAPRの低いものを選ぶ 確率系(SLM, PTS)、第3は一部のサブキャリアを犠牲にしてピークを打ち消す 符号化・予約系(トーン予約等) です。それぞれの原理と効果・コストを順に見ていきます。

クリッピング&フィルタリング

最も単純で直接的な方法が クリッピング です。信号の振幅があるしきい値 $A$ を超えたら、強制的に $A$ に切り詰めます。複素信号では位相を保ったまま振幅だけを制限します。

$$ \tilde{x}_n = \begin{cases} x_n & (|x_n| \le A) \\ A \, e^{\,j\angle x_n} & (|x_n| > A) \end{cases} $$

しきい値 $A$ は平均電力との比で クリッピング比(clipping ratio) $\rho = A / \sqrt{P_{\text{avg}}}$ として指定するのが一般的です。$\rho$ を小さくするほどPAPRは下がりますが、信号の歪みは大きくなります。

クリッピングは送信側で意図的に非線形を加える操作なので、PAと同じくスペクトル再成長を引き起こします。そこでクリッピング後に 帯域制限フィルタ をかけて帯域外成分を除去します。ところがフィルタをかけると、抑えたはずのピークが再び少し復活する(peak regrowth)という問題があり、クリッピングとフィルタリングを数回反復して落ち着かせる「反復クリッピング&フィルタリング」が実用的に用いられます。

  • 効果: クリッピング比次第で数dBのPAPR低減が可能。実装が極めて軽量
  • コスト: 帯域内歪み(EVM劣化・BER悪化)と、フィルタによるピーク復活。受信側に追加処理は不要

SLM(Selected Mapping)

歪みを一切加えずにPAPRを下げたい場合の代表が SLM(選択マッピング) です。アイデアはシンプルで、同じデータから位相だけ異なる複数の候補波形を作り、その中で最もPAPRが低いものを選んで送信します。

具体的には、$U$ 種類の位相回転ベクトル $\bm{\phi}^{(u)} = [\phi_0^{(u)}, \dots, \phi_{N-1}^{(u)}]$(各要素は $e^{j\theta}$ の形)をあらかじめ用意します。$u$ 番目の候補信号は、各サブキャリアシンボルに位相を掛けてからIFFTした、

$$ \bm{x}^{(u)} = \text{IFFT}\!\left( \left[ X_0 \phi_0^{(u)}, X_1 \phi_1^{(u)}, \dots, X_{N-1}\phi_{N-1}^{(u)} \right] \right) $$

です。位相ベクトルは振幅を変えないので、$U$ 個の候補はどれも同じデータを表していますが、サブキャリア間の位相関係が異なるため時間波形のピークの出方が変わります。送信側はこのうち最小PAPRの候補 $u^\star = \arg\min_u \text{PAPR}(\bm{x}^{(u)})$ を選んで送ります。

$$ u^\star = \arg\min_{u \in \{1,\dots,U\}} \ \text{PAPR}\!\left(\bm{x}^{(u)}\right) $$

受信側で元のデータを復元するには、どの位相ベクトルが使われたか(インデックス $u^\star$)を知る必要があります。このインデックスを サイドインフォメーション として送る必要があり、$\log_2 U$ ビットのオーバーヘッドが生じます。

  • 効果: $U$ を増やすほどPAPR低減量が増える($U=16$ で1〜2%のCCDF点で3〜4dB程度改善)。歪みを一切加えないのでBER劣化なし
  • コスト: $U$ 回のIFFT演算が必要(計算量 $U$ 倍)。サイドインフォメーションの送信が必要で、これを誤ると全データを失う

PTS(Partial Transmit Sequence)

SLMが「全サブキャリアに同じ位相ベクトルの集合」を試すのに対し、PTS(部分送信系列) は、サブキャリアをいくつかのブロックに分割し、ブロックごとに独立な位相回転を掛けて組み合わせを最適化します。

サブキャリアを $V$ 個のブロック $\bm{X}^{(1)}, \dots, \bm{X}^{(V)}$ に分け、それぞれを個別にIFFTして部分時間信号 $\bm{x}^{(v)}$ を得ます。各部分信号に位相回転係数 $b_v = e^{j\theta_v}$ を掛けて足し合わせた合成信号は、

$$ \bm{x} = \sum_{v=1}^{V} b_v \, \bm{x}^{(v)} $$

位相係数の組 $\{b_1, \dots, b_V\}$ を、PAPRが最小になるように探索します。係数を $W$ 通り(例えば $b_v \in \{1, -1, j, -j\}$ なら $W=4$)に制限すると、探索すべき組み合わせは $W^{V}$ 通り(1つは基準に固定できるので実質 $W^{V-1}$)です。

PTSは部分信号の組み合わせを細かく調整できるため、同程度の計算量ならSLMより高いPAPR低減効果が得られることが多いです。ただし組み合わせ探索が指数的に増えるため、$V$ を大きくしすぎると計算量が爆発します。

  • 効果: SLMと同等以上のPAPR低減。歪みなし
  • コスト: $V$ 回のIFFTと $W^{V-1}$ 通りの探索。位相係数のインデックス($\log_2 W^{V-1}$ ビット)をサイドインフォメーションとして送る必要がある

トーン予約(Tone Reservation, TR)

トーン予約 は、データを乗せない予約済みサブキャリア(予約トーン)を少数用意し、それらに「ピークを打ち消すような信号」を載せる方法です。データを表現する信号 $\bm{x}$ に、予約トーンが作るピーク打ち消し信号 $\bm{c}$ を足して、

$$ \tilde{\bm{x}} = \bm{x} + \bm{c} $$

とします。$\bm{c}$ はデータ用サブキャリアの周波数では成分を持たない(予約トーンの周波数だけに成分を持つ)ように作るため、受信側でデータ用サブキャリアだけを取り出せば $\bm{c}$ の影響を受けず、サイドインフォメーション不要・BER劣化なし で復調できます。$\bm{c}$ の最適化は凸最適化問題として解け、クリッピングノイズを予約トーンに「集める」ように設計します。

  • 効果: サイドインフォメーション不要、データの歪みなし。標準化(DVB-T2やxDSL等)でも採用実績がある
  • コスト: 予約トーンに割いたぶんスペクトル効率と電力が低下する。最適化の計算量が必要

これらの技術の効果は、理論だけでは実感しにくいものです。次節では実際にOFDM信号を生成し、PAPRのCCDF、クリッピングの影響、SLMの効果をPythonで確かめます。

Pythonによる実装と検証

OFDM信号の生成とPAPR分布

まず、QPSKを乗せたOFDM信号を多数生成し、PAPRの分布を調べます。あわせてオーバーサンプリングの有無でPAPRがどう変わるかも確認します。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(0)

def qpsk_symbols(num, rng):
    """QPSKシンボル(単位電力)をnum個生成"""
    bits = rng.integers(0, 2, size=(num, 2))
    # 00->(1+1j), 01->(1-1j) ... を1/sqrt(2)で正規化
    re = 2 * bits[:, 0] - 1
    im = 2 * bits[:, 1] - 1
    return (re + 1j * im) / np.sqrt(2)

def ofdm_time(symbols, N, L=1):
    """周波数領域シンボルからOFDM時間波形を生成(Lはオーバーサンプリング率)"""
    # 長さL*Nの周波数ベクトルにゼロパディングしてオーバーサンプリング
    X = np.zeros(L * N, dtype=complex)
    X[:N // 2] = symbols[:N // 2]
    X[-(N // 2):] = symbols[N // 2:]
    # IFFTで時間波形に。電力正規化のため sqrt(L*N) を掛ける
    return np.fft.ifft(X) * np.sqrt(L * N)

def papr_db(x):
    """時間波形のPAPRをdBで返す"""
    p = np.abs(x) ** 2
    return 10 * np.log10(p.max() / p.mean())

ここではQPSKシンボル生成、OFDM時間波形生成(オーバーサンプリング対応)、PAPR計算の3つの関数を定義しました。ofdm_time ではゼロパディングによって周波数軸を $L$ 倍に拡張し、サンプル点の間に隠れたピークを捉えられるようにしています。次に、これらを使って多数のシンボルのPAPRを集計します。

N = 256          # サブキャリア数
num_symbols = 20000

papr_nyquist = []   # L=1 (ナイキストサンプリング)
papr_over = []      # L=4 (オーバーサンプリング)

for _ in range(num_symbols):
    syms = qpsk_symbols(N, rng)
    papr_nyquist.append(papr_db(ofdm_time(syms, N, L=1)))
    papr_over.append(papr_db(ofdm_time(syms, N, L=4)))

papr_nyquist = np.array(papr_nyquist)
papr_over = np.array(papr_over)

print(f"平均PAPR  (L=1): {papr_nyquist.mean():.2f} dB")
print(f"平均PAPR  (L=4): {papr_over.mean():.2f} dB")
print(f"99%ile PAPR(L=4): {np.percentile(papr_over, 99):.2f} dB")

このコードは $N=256$ のOFDMシンボルを2万個生成し、ナイキストサンプリングとオーバーサンプリングそれぞれでPAPRを集計します。出力を見ると、オーバーサンプリング版(L=4)の方が平均PAPRが0.5〜1dB程度大きくなることがわかります。これは、ナイキストサンプリングではサンプル点の間に隠れた真のピークを見逃しており、PAPRを過小評価してしまうためです。実際のアナログ波形のPAPRを正しく評価するには、オーバーサンプリングが不可欠だと確認できます。

CCDFの計算と理論曲線との比較

次に、シミュレーションで得たPAPRからCCDFを計算し、先に導出した理論式と比較します。

def ccdf(papr_values, gammas_db):
    """PAPR値の配列から、各しきい値を超える確率(CCDF)を計算"""
    return np.array([(papr_values > g).mean() for g in gammas_db])

gammas = np.linspace(3, 13, 60)  # しきい値 [dB]

ccdf_nyq = ccdf(papr_nyquist, gammas)
ccdf_ovr = ccdf(papr_over, gammas)

# 理論式 CCDF = 1 - (1 - exp(-gamma))^(alpha*N)
gamma_lin = 10 ** (gammas / 10)        # dB -> 線形
theory_nyq = 1 - (1 - np.exp(-gamma_lin)) ** N           # alpha=1
theory_ovr = 1 - (1 - np.exp(-gamma_lin)) ** (2.8 * N)   # alpha=2.8

plt.figure(figsize=(9, 6))
plt.semilogy(gammas, ccdf_nyq, 'o', ms=3, label='Sim (L=1, Nyquist)')
plt.semilogy(gammas, ccdf_ovr, 's', ms=3, label='Sim (L=4, oversampled)')
plt.semilogy(gammas, theory_nyq, '-', label=r'Theory $\alpha=1$')
plt.semilogy(gammas, theory_ovr, '--', label=r'Theory $\alpha=2.8$')
plt.xlabel('PAPR threshold $\\gamma$ [dB]')
plt.ylabel(r'CCDF = Pr[PAPR > $\gamma$]')
plt.title(f'PAPR CCDF of OFDM (N={N}, QPSK)')
plt.ylim(1e-4, 1)
plt.grid(True, which='both', alpha=0.3)
plt.legend()
plt.tight_layout()
plt.savefig('ofdm_papr_ccdf.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフから、いくつかの重要な点が読み取れます。第1に、ナイキストサンプリングのシミュレーション(丸)は $\alpha=1$ の理論曲線とよく一致し、独立サンプル近似の妥当性が確認できます。第2に、オーバーサンプリング版(四角)は右にシフトしており、$\alpha=2.8$ の補正理論曲線とほぼ重なります。これは実効的な独立サンプル数が増えてピークを見逃さなくなったためです。第3に、CCDFが $10^{-3}$ 程度(千シンボルに1回起こるピーク)でPAPRは約10〜11dBに達しており、PAをこのピークに合わせて設計するのは非現実的で、なんらかの低減策が必要だと実感できます。

クリッピングの効果 — スペクトルとPAPR

次にクリッピングを適用し、PAPRがどれだけ下がるか、その代償としてスペクトルがどう再成長するかを観察します。

def clip_signal(x, clip_ratio):
    """振幅をクリッピング比rho*rms以下に制限(位相は保持)"""
    rms = np.sqrt(np.mean(np.abs(x) ** 2))
    A = clip_ratio * rms
    mag = np.abs(x)
    scale = np.minimum(1.0, A / np.maximum(mag, 1e-12))
    return x * scale

N = 256
syms = qpsk_symbols(N, rng)
x = ofdm_time(syms, N, L=4)

x_clip2 = clip_signal(x, 2.0)   # rho=2.0 (緩いクリップ)
x_clip13 = clip_signal(x, 1.3)  # rho=1.3 (強いクリップ)

print(f"PAPR  原信号        : {papr_db(x):.2f} dB")
print(f"PAPR  rho=2.0 clip  : {papr_db(x_clip2):.2f} dB")
print(f"PAPR  rho=1.3 clip  : {papr_db(x_clip13):.2f} dB")

出力から、クリッピング比 $\rho$ を小さくするほどPAPRが大きく下がることが確認できます。$\rho=2.0$ では原信号より2〜3dB、$\rho=1.3$ ではさらに大きく低減されます。クリッピングは振幅の頭を物理的に切り落とすので、PAPR低減効果は確実です。続いて、その代償であるスペクトル再成長を見てみましょう。

def psd_db(x):
    """電力スペクトル密度(正規化, dB)を返す"""
    X = np.fft.fftshift(np.fft.fft(x))
    p = np.abs(X) ** 2
    return 10 * np.log10(p / p.max() + 1e-12)

# 多数シンボルを平均して滑らかなスペクトルを得る
def avg_psd(clip_ratio, N, trials=400):
    acc = None
    for _ in range(trials):
        s = qpsk_symbols(N, rng)
        x = ofdm_time(s, N, L=4)
        if clip_ratio is not None:
            x = clip_signal(x, clip_ratio)
        X = np.abs(np.fft.fftshift(np.fft.fft(x))) ** 2
        acc = X if acc is None else acc + X
    acc /= trials
    return 10 * np.log10(acc / acc.max() + 1e-12)

freq = np.linspace(-0.5, 0.5, 4 * N)
psd_orig = avg_psd(None, N)
psd_c2 = avg_psd(2.0, N)
psd_c13 = avg_psd(1.3, N)

plt.figure(figsize=(9, 6))
plt.plot(freq, psd_orig, label='No clipping')
plt.plot(freq, psd_c2, label=r'Clip $\rho=2.0$')
plt.plot(freq, psd_c13, label=r'Clip $\rho=1.3$')
plt.xlabel('Normalized frequency')
plt.ylabel('PSD [dB]')
plt.title('Spectral regrowth due to clipping')
plt.ylim(-50, 2)
plt.grid(True, alpha=0.3)
plt.legend()
plt.tight_layout()
plt.savefig('ofdm_clip_spectrum.png', dpi=150, bbox_inches='tight')
plt.show()

このスペクトル図から、クリッピングの代償がはっきり見えます。クリッピングなしの信号は帯域内(中央付近)にエネルギーが集中し、帯域外は急峻に落ちています。一方、クリッピングを強くする($\rho$ を小さくする)ほど、帯域外(両端)の電力レベルが持ち上がっていきます。これがスペクトル再成長であり、$\rho=1.3$ では帯域外漏洩が無視できないレベルまで増大します。PAPR低減と帯域外放射が明確なトレードオフ関係にあることが、視覚的に確認できます。

クリッピングによるBER劣化

クリッピングは帯域内も歪ませるため、BERにも影響します。AWGN通信路でクリッピングありとなしのBERを比較します。

def simulate_ber(clip_ratio, N, ebn0_db, n_sym=4000):
    """指定クリッピング比でのQPSK-OFDMのBERをシミュレーション"""
    total_bits, total_errors = 0, 0
    snr_lin = 10 ** (ebn0_db / 10)
    for _ in range(n_sym):
        bits = rng.integers(0, 2, size=(N, 2))
        re = 2 * bits[:, 0] - 1
        im = 2 * bits[:, 1] - 1
        syms = (re + 1j * im) / np.sqrt(2)
        x = np.fft.ifft(syms) * np.sqrt(N)
        if clip_ratio is not None:
            x = clip_signal(x, clip_ratio)
        # 雑音付加 (Eb/N0ベース, QPSKは1シンボル2ビット)
        sig_p = np.mean(np.abs(x) ** 2)
        noise_p = sig_p / (2 * snr_lin)
        noise = np.sqrt(noise_p / 2) * (rng.standard_normal(N) + 1j * rng.standard_normal(N))
        y = x + noise
        # 受信: FFTで周波数領域へ
        Y = np.fft.fft(y) / np.sqrt(N)
        rx_bits = np.zeros((N, 2), dtype=int)
        rx_bits[:, 0] = (Y.real > 0).astype(int)
        rx_bits[:, 1] = (Y.imag > 0).astype(int)
        total_errors += np.sum(rx_bits != bits)
        total_bits += bits.size
    return total_errors / total_bits

ebn0_range = np.arange(0, 11, 2)
ber_noclip = [simulate_ber(None, 256, e) for e in ebn0_range]
ber_clip13 = [simulate_ber(1.3, 256, e) for e in ebn0_range]

plt.figure(figsize=(9, 6))
plt.semilogy(ebn0_range, ber_noclip, 'o-', label='No clipping')
plt.semilogy(ebn0_range, ber_clip13, 's--', label=r'Clip $\rho=1.3$')
plt.xlabel('Eb/N0 [dB]')
plt.ylabel('BER')
plt.title('BER degradation due to clipping (QPSK-OFDM, AWGN)')
plt.grid(True, which='both', alpha=0.3)
plt.legend()
plt.tight_layout()
plt.savefig('ofdm_clip_ber.png', dpi=150, bbox_inches='tight')
plt.show()

このBER曲線から、クリッピングが帯域内に与えるダメージが定量的にわかります。クリッピングなしの曲線は理論的なQPSKのBERに沿って急速に低下しますが、$\rho=1.3$ の強いクリッピングでは、高Eb/N0領域でBERが下げ止まる「エラーフロア」が現れます。これはクリッピングによる歪みが雑音とは別の誤り要因として残り続けるためで、いくら信号電力を上げても消えません。クリッピングはPAPRを確実に下げる反面、強くかけすぎるとBERが原理的に改善しなくなることが読み取れます。

SLMによるPAPR低減

最後に、歪みを加えないSLMの効果を確認します。$U$ 種類の位相ベクトルから最小PAPRの候補を選び、CCDFがどれだけ改善するかを見ます。

def slm_papr(symbols, N, U, rng):
    """SLM: U個の位相回転候補から最小PAPRを返す"""
    best = np.inf
    for u in range(U):
        if u == 0:
            phase = np.ones(N)             # 1つ目は無変換
        else:
            # ランダムな位相回転 {1, -1, j, -j}
            phase = rng.choice([1, -1, 1j, -1j], size=N)
        x = ofdm_time(symbols * phase, N, L=4)
        best = min(best, papr_db(x))
    return best

N = 256
n_trial = 4000
papr_u1, papr_u4, papr_u16 = [], [], []

for _ in range(n_trial):
    s = qpsk_symbols(N, rng)
    papr_u1.append(slm_papr(s, N, 1, rng))
    papr_u4.append(slm_papr(s, N, 4, rng))
    papr_u16.append(slm_papr(s, N, 16, rng))

gammas = np.linspace(4, 12, 50)
c1 = ccdf(np.array(papr_u1), gammas)
c4 = ccdf(np.array(papr_u4), gammas)
c16 = ccdf(np.array(papr_u16), gammas)

plt.figure(figsize=(9, 6))
plt.semilogy(gammas, c1, '-', label='U=1 (no SLM)')
plt.semilogy(gammas, c4, '--', label='U=4')
plt.semilogy(gammas, c16, ':', label='U=16')
plt.xlabel('PAPR threshold $\\gamma$ [dB]')
plt.ylabel(r'CCDF = Pr[PAPR > $\gamma$]')
plt.title('PAPR reduction by SLM')
plt.ylim(1e-3, 1)
plt.grid(True, which='both', alpha=0.3)
plt.legend()
plt.tight_layout()
plt.savefig('ofdm_slm_ccdf.png', dpi=150, bbox_inches='tight')
plt.show()

このCCDF図から、SLMの効果と原理が明確に読み取れます。候補数 $U$ を増やすほどCCDF曲線が左に移動し、同じ確率レベルでのPAPRが下がっていきます。CCDF $=10^{-3}$ の点で見ると、$U=1$(SLMなし)に対して $U=4$ で約2dB、$U=16$ でさらに1〜2dBのPAPR低減が得られます。クリッピングと違いSLMは振幅を歪ませないため、このPAPR低減はBER劣化やスペクトル再成長を伴いません。ただし $U$ 倍のIFFT計算と、選んだインデックスを送るサイドインフォメーションが必要というコストが、低減効果と引き換えになっていることを忘れてはいけません。

これらのシミュレーションを通じて、「歪みを許容して軽量にピークを潰すクリッピング」と「計算量とオーバーヘッドを払って歪みなくピークを下げるSLM」という、PAPR低減技術の根本的な設計トレードオフが体感できたと思います。

まとめ

本記事では、OFDMの弱点であるPAPR問題を、発生の仕組みから低減技術まで一貫して解説しました。

  • ピーク発生の仕組み: OFDM信号は $N$ 本のサブキャリアの和であり、全位相が揃う最悪ケースで振幅は $\sqrt{N}$ 倍、瞬時電力は平均の $N$ 倍に達しうる
  • 統計的性質: 中心極限定理により振幅はレイリー分布、瞬時電力は指数分布に従う。PAPRの評価には $\text{CCDF}(\gamma) = 1 – (1 – e^{-\gamma})^{\alpha N}$ を用い、オーバーサンプリングでピークを正しく捉える
  • PAPRの害: PAの非線形により、大きなバックオフ(効率低下)が必要になり、不足するとスペクトル再成長(帯域外放射)とEVM劣化(BER悪化)が生じる
  • 低減技術: クリッピングは軽量だが歪みを伴いエラーフロアを生む。SLM/PTSは歪みなしだが計算量とサイドインフォメーションが必要。トーン予約はサイドインフォメーション不要だがスペクトル効率を犠牲にする

PAPR低減に「ただで効く」万能策はなく、歪み・計算量・スペクトル効率・サイドインフォメーションのいずれかを支払うトレードオフであることが、本記事の最も重要なメッセージです。実システムでは、PAPR対策とPAの線形化(プリディストーション)を組み合わせて使うのが一般的です。

OFDMのPAPRをさらに深く理解し、応用へ広げるために、以下の記事も参考にしてください。