パソコン・インターネット

2026年6月 5日 (金)

高周波エンジニアのためのAI・機械学習入門(GPU編29)Keras3(バックエンドはJax)を使って畳み込みニューラルネットワーク(CNN)で21次のLCバンドパスフィルタ(L,Cのパラメータ42個)のSパラメータの値から素子の値(L、C)を推定する。全パラメータ平均誤差1%台を切った。

前回はディープラーニング(DNN)で予測して42個のパラメータの平均誤差が1%前後と結構よかった。

今回はCNNをやってみよう。

コードはこんな感じで。


import os
os.environ["KERAS_BACKEND"] = "jax"
import keras
import jax
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from jax import config
config.update("jax_enable_x64", False)
plt.rcParams['font.family'] = 'Noto Sans CJK JP'

data_label = np.load("21stagefilter.npz")
data = data_label["data"].reshape(-1,200,5,1)
label = data_label["label"]
x_train, x_test, y_train, y_test = train_test_split(data, label, test_size=0.3, random_state=0)

scaler_y = StandardScaler()
y_train_f = scaler_y.fit_transform(y_train)

ord = 21
inputs = keras.Input(shape=(200, 5, 1))
x = keras.layers.Conv2D(64, kernel_size=(10, 2), activation="relu")(inputs)
x = keras.layers.Conv2D(64, kernel_size=(10, 4), activation="relu")(x)
x = keras.layers.Flatten()(x)
outputs = keras.layers.Dense(ord * 2)(x)

model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(loss = 'mean_squared_error' ,optimizer=keras.optimizers.Adam())

batch_size = 64
epochs = 500

keras.utils.set_random_seed(1)
history = model.fit(
    x_train,
    y_train_f,
    batch_size=batch_size,
    epochs=epochs,
    validation_split=0.15,
)

y_pred_f = model.predict(x_test)
y_pred = scaler_y.inverse_transform(y_pred_f)

metric = keras.metrics.R2Score()
metric.update_state(y_test, y_pred)
result = metric.result()
print(result)
error = np.abs((y_test - y_pred)/y_test*100)
print(error.mean(axis=0))

結果はこちら。

21filtercnn

全パラメータで平均誤差1%を切っている。これは結構実用的では。次はRNN(LSTM)やってみる。

 

2026年6月 3日 (水)

高周波エンジニアのためのAI・機械学習入門(GPU編28)Keras3(バックエンドはJax)を使ってディープラーニング(DNN)で21次のLCバンドパスフィルタ(L,Cのパラメータ42個)のSパラメータの値から素子の値(L、C)を推定する。全パラメータ平均誤差1%台になった。

先日は21次のチェビシェフ特性のバンドパスフィルタのデータをモンテカルロシミュレーションで10000個作った。

ではまず普通のディープラーニングで42パラメータを予測してみよう。

コードはこんな感じで。前回、LayerNormalizationを使うとよかったので今回も入れている。


import os
os.environ["KERAS_BACKEND"] = "jax"
import keras
import jax
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from jax import config
config.update("jax_enable_x64", False)
plt.rcParams['font.family'] = 'Noto Sans CJK JP'

data_label = np.load("21stagefilter.npz")
data = data_label["data"]
label = data_label["label"]
x_train, x_test, y_train, y_test = train_test_split(data, label, test_size=0.3, random_state=0)

scaler_y = StandardScaler()
y_train_f = scaler_y.fit_transform(y_train)

ord = 21
hidden_dim = 200
inputs = keras.Input(shape=(200, 5))
x = keras.layers.Flatten()(inputs)
x = keras.layers.Dense(hidden_dim, activation="relu")(x)
x = keras.layers.LayerNormalization()(x)
x = keras.layers.Dense(hidden_dim, activation="relu")(x)
x = keras.layers.LayerNormalization()(x)
x = keras.layers.Dense(hidden_dim, activation="relu")(x)
x = keras.layers.LayerNormalization()(x)
outputs = keras.layers.Dense(ord * 2)(x)

model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(loss = 'mean_squared_error' ,optimizer=keras.optimizers.Adam())

batch_size = 128
epochs = 500

keras.utils.set_random_seed(1)
history = model.fit(
    x_train,
    y_train_f,
    batch_size=batch_size,
    epochs=epochs,
    validation_split=0.15,
)

y_pred_f = model.predict(x_test)
y_pred = scaler_y.inverse_transform(y_pred_f)

metric = keras.metrics.R2Score()
metric.update_state(y_test, y_pred)
result = metric.result()
print(result)
error = np.abs((y_test - y_pred)/y_test*100)
print(error.mean(axis=0))

結果をグラフにするコードはこんな感じで。


row, column = 7, 6
legend = []
for i in range(ord):
    legend.append("L" + str(i+1))
    legend.append("C" + str(i+1))
fig, ax = plt.subplots(row, column, figsize=(15,16))
plt.rcParams["font.size"] = 8
for i in range(row):
    for j in range(column):
        count = column * i + j
        maxvalue = y_pred[:, count].max()
        ax[i,j].scatter(y_pred[:, count], y_test[:,count], c="r", s=5)
        ax[i,j].plot([0,maxvalue], [0,maxvalue], "--", c="black")
        ax[i,j].set_xlabel("推定した値")
        ax[i,j].set_ylabel("実際の値")
        ax[i,j].set_xlim(0, maxvalue)
        ax[i,j].set_ylim(0, maxvalue)
        ax[i,j].grid()
        ax[i,j].legend([legend[count] + f" 平均誤差{error.mean(axis=0)[count]:.2f}%"])
         
fig.tight_layout()
plt.show()

図示してみる。

21filterdnn

これだけパラメータが増えても1%前後の平均誤差でなかなかよさそう。次はCNNをやってみよう。

 

 

2026年6月 1日 (月)

高周波エンジニアのためのAI・機械学習入門(GPU編27)21次のチェビシェフ特性のLCバンドパスフィルタ(42パラメータ)のSパラメータをモンテカルロシミュレーションで10000個作る。後ほどディープラーニングなどで予測する準備。

以前もLCバンドパスフィルタのLとCの値を予測する、というのをやっていたがその時は3次のフィルタ(LとCのパラメータ6個)だったのであまりありがたみがなかった。機械学習使わなくても何とでもなりそうなので。

もっと次数を増やして、他の方法では時間がかかりそうなものを機械学習でやったほうがよさそう。ということで今回は21次のチェビシェフ特性のバンドパスフィルタ(パラメータは42個。生命、宇宙、そして万物についての究極の疑問の答え=42なので)をやってみよう。

今回は前準備としてモンテカルロシミュレーションで中心周波数と帯域幅を振ったバンドパスフィルタのSパラメータデータを10000個作る。

コードはこんな感じで。


import numpy as np
import matplotlib.pyplot as plt
import skrf as rf
import filtersynth as fs

#周波数の設定
fstart = 0.1
fstop = 20
points = 200

#モンテカルロシミュレーションでは中心周波数と比帯域幅を乱数で振るが、それの最大最小
f0min = 2
f0max = 18
dfrmax = 0.2
dfrmin = 0.1

#フィルタデータ1つ分作る関数
def filter_data(n, f0, df, fstart, fstop, points):
    """
    Kerasで読めるような形でBPFの2ポートSパラメータとその合成に使うL,Cの値をそれぞれ
    1つ分のdata, labelとして出力する。具体的にはdataは(1, points, 5), labelは(1, 6)。
    dataが5なのは奇数次のLCフィルタはS11=S22、S21=S12かつ複素数データなので
    freq, S11real, S11imag, S21real, S21imagだから。Sパラメータは絶対値1なので規格化はせず
    周波数のみ最大周波数で割っている。
    """
    LC_elements = fs.LC_BPF(n, f0, df)
    label = LC_elements.reshape(n*2+4)[2:2*n+2].reshape(1, n*2)
    bpf_cir, bpf_network = fs.BPF_synthesis(n, f0, df, fstart, fstop, points)
    freq = bpf_network.f
    Spara = bpf_network.s
    data = np.array([freq[:]/fstop*1E-9,Spara[:,0, 0].real, Spara[:,0, 0].imag,
                     Spara[:,1, 0].real, Spara[:,1, 0].imag]).T.reshape(1, Spara.shape[0],5)
    return data, label


#モンテカルロシミュレーションでデータ作成して保存する。
N = 10000
odr = 21 #オーダー21のフィルタを作る。オーダーが大きいほど合成に使うLCの数が増えるので、予測する量も増える。
np.random.seed(1)
data = np.empty((0, points, 5))
label = np.empty((0, odr*2))
for i in range(N):
    f0 = f0min + (f0max - f0min) * np.random.rand()
    df = (dfrmin + (dfrmax - dfrmin) * np.random.rand()) * f0
    x, y = filter_data(odr, f0, df, fstart, fstop, points)
    data = np.vstack((data, x))
    label = np.vstack((label, y))
#予測する量(L,C)が小さすぎるのでnH, pF単位にする。
for j in range(odr*2):
    label[:, j] *= 1.0E9 if j % 2 == 0 else 1.0E12

#保存
np.savez_compressed("21stagefilter.npz", data=data, label=label)

できたデータの最初のほうをプロットしたもの。

21filterdata

次数が高いのでめちゃくちゃ減衰が急だな。ではこれを使って機械学習をしていく(続く)。

 

2026年5月31日 (日)

RF Weekly Digest (Gemini 3.1 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ)2026/5/24-5/31





RF WeeklyDigest





Weekly Intelligence Briefing

UPDATED: 16:36:44




INDUSTRY UPDATE

本エグゼクティブ・サマリーは、2026年5月24日から2026年5月31日までの期間における無線周波数(RF)技術の重要な進展を概説したものである。




NETWORK STD

5G/6G Advancements & Standards(5G/6Gの進展と標準化)

  • 3GPP リリース20および6G研究: 2025年末のリリース19の正式なフリーズを受け、3GPPワーキンググループはリリース20への取り組みを加速させている。2026年5月31日現在、SA1グループは6Gのユースケースおよび主要業績評価指標(KPI)が80%完了したと報告している。初の6G規定技術仕様を含むリリース21については、2026年6月にタイムラインの合意が予定されている。
  • Integrated Sensing and Communication (ISAC): 今週開催されたIMS 2026シンポジウムの主要な焦点は、ISACおよびAmbient IoTの進展であった。これらはRFの反射を利用してネットワークが物体を「視覚化」し「感知」することを可能にする技術であり、現在は6G無線インターフェースのコア研究項目となっている。
  • NTN (非地上系ネットワーク): 衛星経由の5G-Advanced標準が安定し、今週SamsungおよびBroadcomから発表された新しいシリコンにおいて、NR-NTNNB-NTNの統合が標準仕様となった。



NETWORK STD

New Hardware (Chips, Antennas, Modems)(新ハードウェア:チップ、アンテナ、モデム)

  • Broadcom BroadPeak™ (BCM85021): 2026年5月27日に発表されたこの5nm集積無線デジタル・フロントエンド (DFE) SoCは、Massive MIMO向けの業界初となる「6G-ready」標準製品である。400 MHzから8.5 GHzまでのスケーラブルな範囲をサポートしており、特にn104バンド (6.425–7.125 GHz) および6G上位ミッドバンド (7–8.5 GHz) をターゲットとしている。
    • 主な統計: 消費電力を40%削減。32T32R8FB構成。DPD、キャリアアグリゲーション、および高速ADC/DACを統合。
  • Skyworks & MediaTek 6G FR3 フロントエンド: MWC 2026(以前開催されたが今週詳細が判明)の更新レポートにより、SKYR60002 6G FR3 (6.4–7+ GHz) LNAパワーアンプモジュールが明らかになった。このモジュールは、初期の6G波形に求められる高い線形性のために設計された統合フィルタを備えている。
  • Qorvo 広帯域高アイソレーション・スイッチ: 2026年5月29日に発表されたこの新しいスイッチファミリーは、マルチバンド5G無線におけるカスケード接続スイッチ・アーキテクチャを排除するように設計されており、複雑なRFフロントエンドにおけるPCBフットプリントと挿入損失を削減する。
  • Qualcomm Snapdragon X90 モデム: Snapdragon 8 Elite Gen 6(2026年9月発売予定)に関する新たな技術リークにより、X90モデムTSMCの2nmプロセスで製造されることが確認された。信号最適化のための高度なオンダイAIを搭載し、ピークダウンリンク速度15Gbpsを目指している。



HARDWARE ANALYSIS

Smartphone Teardowns: RF Analysis(スマートフォンの分解:RF分析)

  • Samsung Galaxy S26 Ultra (iFixitによる分析): 先日発売されたS26 Ultraの詳細な分解調査が今週完了した。
    • RFアーキテクチャ: デバイスはネジで固定された高度にモジュール化されたUSB-C/RFサブアセンブリを採用しており、充電コンポーネントや下部アンテナ部品の交換が容易になっている。
    • 複雑性の問題: 「プライバシー・ディスプレイ」と画面下セルフィーカメラは筐体に強力に接着されており、画面側からのRFメンテナンスはリスクの高い作業となっている。
    • バッテリー: 接着剤なしでバッテリーを取り外すことができる、新しい「スワドル(包み込み)」プルタブ機構の採用が注目される。
  • Apple iPhone 17 Pro Max (TechInsightsによる深掘り): 今週末に発表された分析は、2017年以来の主要なアーキテクチャ変更となるSTMicroelectronics製IRセンサーの再設計に焦点を当てている。
    • RF/センシングの統合: 分解により、FaceIDの信号忠実度を向上させる新しいフォトキャプチャ・アーキテクチャが明らかになった。
    • 熱設計: TechInsightsは、iPhoneで初となるベイパーチャンバーの採用を確認した。これは、高スループットの5G-AdvancedおよびAIタスク実行時におけるA19 Proチップの冷却に不可欠である。



CONNECTIVITY

IoT & Connectivity (Wi-Fi 8 & Bluetooth)(IoTとコネクティビティ:Wi-Fi 8およびBluetooth)

  • Broadcom BCM677x Wi-Fi 8 エコシステム: 2026年5月27日、Broadcomはメッシュルーターおよびゲートウェイ向けに初の統合Wi-Fi 8 (IEEE 802.11bn) SoCのサンプル出荷を開始した。
    • 技術: 「Ultra High Reliability (UHR:超高信頼性)」に焦点を当てている。4096-QAM320MHzチャネルを維持しつつ、高密度環境でのジッターとパケット損失を低減するための「協調型信頼性」機能が追加されている。
  • TP-Link Archer 8 ロードマップ: TP-Linkは2026年5月28日Wi-Fi 8のロードマップを発表した。Archer 8ルーターは2026年10月に予定されており、Wi-Fi 7製品と比較して実効スループットが最大33%向上することを目指している。
  • u-blox エッジAI Bluetooth LE: Nordic Semiconductorと共同開発された新しいモジュールが2026年5月29日に発売された。モジュール上でAIアクセラレーションを行うことでエッジ側でのデータ処理を可能にし、RF送信時間を短縮。これにより、産業用IoTのバッテリー寿命を大幅に延長する。



NETWORK STD

Illustrations & Diagrams(図表およびダイアグラム)

  • Broadcom BroadPeak ブロック図: 5nm DFEとADC/DACブロックの統合を示すハイレベルな回路図。情報源: Broadcom Newsroom
  • Samsung Galaxy S26 Ultra 内部レイアウト: モジュール式USB-Cおよびバッテリー・プルタブ・システムを示す写真シリーズ。情報源: iFixit / GSMArena
  • Skyworks 6G FR3 モジュール・フットプリント: 統合フィルタの配置を示すSKYR60002の技術レンダリング。情報源: Semiconductor Today
  • 3GPP リリース20 タイムライン・グラフィック: R19(フリーズ済)からR21(6G規定仕様)までの道のりを示す公式ビジュアル。情報源: 3GPP.org

2026年5月29日 (金)

高周波エンジニアのためのAI・機械学習入門(GPU編26)異常検知として、良品のみで学習して不良品を見つける畳み込みオートエンコーダー(Convolutional Autoencoder)をPythonとKerasでバンドパスフィルタを題材にやってみる。

前回はDNN系のオートエンコーダをやってみた。今回はCNN系のをやってみよう。

コードはこちら。


import os
os.environ["KERAS_BACKEND"] = "jax"
import keras
import numpy as np
import matplotlib.pyplot as plt
from jax import config
config.update("jax_enable_x64", False)
plt.rcParams['font.family'] = 'Noto Sans CJK JP'

data_label = np.load("G_NG.npz")
data = data_label["data"].reshape(-1,200,5,1)
label = data_label["label"]

# GとNGを分割
g_data = data[label[:, 0] == 1]
ng_data = data[label[:, 0] == 0]

# Convolutional Autoencoder
inputs = keras.Input(shape=(200, 5, 1))
x = keras.layers.Conv2D(64, kernel_size=(10, 2), activation="relu", padding="same")(inputs)
x = keras.layers.Conv2D(32, kernel_size=(10, 2), activation="relu", padding="same")(x)
x = keras.layers.Conv2D(16, kernel_size=(10, 2), activation="relu", padding="same")(x)
x = keras.layers.Conv2D(32, kernel_size=(10, 2), activation="relu", padding="same")(x)
x = keras.layers.Conv2D(64, kernel_size=(10, 2), activation="relu", padding="same")(x)
outputs = keras.layers.Conv2D(1, kernel_size=(10, 2), activation="linear", padding="same")(x)
model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(loss = 'mean_squared_error' ,optimizer=keras.optimizers.Adam())
model.summary()
# 学習
epochs = 1000
keras.utils.set_random_seed(1)
history = model.fit(
    g_data, g_data,
    batch_size=128,
    epochs=epochs,
    validation_split=0.15,
    verbose=1
)

# 予測
g_pred = model.predict(g_data)
ng_pred = model.predict(ng_data)

# MSEの計算
loss = keras.losses.MeanSquaredError(reduction = "none")
# GとNGのMSEを計算
ng_accuracy = loss(ng_data, ng_pred).mean(axis=1).mean(axis = 1)
g_accuracy = loss(g_data, g_pred).mean(axis=1).mean(axis = 1)[:ng_accuracy.shape[0]]

# MSEの分布の可視化
plt.figure(figsize=(10, 6))
plt.hist(np.log10(ng_accuracy), bins=50, alpha=0.5, label="NG")
plt.hist(np.log10(g_accuracy), bins=50, alpha=0.5, label="G")
plt.legend()
plt.xlabel("log10(MSE)")
plt.ylabel("Frequency")
plt.title("Distribution of MSE for G and NG")
plt.show()

良品で予測したときの誤差と、不良品で予測した時の誤差をヒストグラムにしたものが出てくる。

Cnnautoencoder1

重なっている部分はあるものの、閾値を-6.42とかにすると不良品が検知できそうだ。なるほど。

 

2026年5月27日 (水)

CodexにTypeScriptでSパラメータのTouchstoneフォーマットを扱うライブラリを仕様書pdfを読んで作ってもらった。dB, 位相, スミスチャートはPlotlyを使用。前回は指示のせいでいまいちだったので、今回はGoogle Antigravityに出したのと同じにするとかなり良くなった。

CodexとAntigravityにSパラメータのTouchstoneフォーマットを扱うTypeScriptのライブラリを作ってもらったが、Codexがいまいちだった。これは指示が悪いんだろうな、と思ってAntigravityと全く同じ指示にしてみた。

Codex2touchstonetypescript1

すると何回かやり取りするとできた。

Codex2touchstonetypescript3

マニュアル。

Codex2touchstonetypescript2

例題。

Codex2touchstonetypescript4

前回よりかなりよくなった。これは普通に使えそう。

ファイルはこちら。

ダウンロード - sparalibcodex2.zip

 

2026年5月25日 (月)

高周波エンジニアのためのAI・機械学習入門(GPU編25)異常検知として、良品のみで学習して不良品を見つけるオートエンコーダー(Deep Autoencoder)をPythonとKerasでバンドパスフィルタを題材にやってみる。

Interface誌を読んでいると、オートエンコーダを使うと良品だけで学習して異常検知できることを知った。

さらにKerasブログで詳しく書いてくれている。

https://blog.keras.io/building-autoencoders-in-keras.html

そこでバンドパスフィルタを題材にしてみよう。

事例はこのとき使ったもの。

高周波エンジニアのためのAI・機械学習入門(GPU編12)教師あり学習でバンドパスフィルタ(BPF)の中心周波数ずれのG/NG判定をPythonとKeras 3.0を使って畳み込みニューラルネットワーク(CNN)で行う。

使うデータはこんな感じになる。

G_ngdnn01_20260504171401

ではオートエンコーダーを書いてみよう。

コードはこんな感じで。


import os
os.environ["KERAS_BACKEND"] = "jax"
import keras
import numpy as np
import matplotlib.pyplot as plt
from jax import config
config.update("jax_enable_x64", False)
plt.rcParams['font.family'] = 'Noto Sans CJK JP'

data_label = np.load("G_NG.npz")
data = data_label["data"]
label = data_label["label"]

# GとNGを分割
g_data = data[label[:, 0] == 1]
ng_data = data[label[:, 0] == 0]

# Deep Autoencoder
inputs = keras.Input(shape=(200, 5))
x = keras.layers.Flatten()(inputs)
encoded = keras.layers.Dense(256, activation='relu')(x)
encoded = keras.layers.Dense(128, activation='relu')(encoded)
encoded = keras.layers.Dense(64, activation='relu')(encoded)
encoded = keras.layers.Dense(32, activation='relu')(encoded)

decoded = keras.layers.Dense(64, activation='relu')(encoded)
decoded = keras.layers.Dense(128, activation='relu')(decoded)
decoded = keras.layers.Dense(256, activation='relu')(decoded)
decoded = keras.layers.Dense(200 * 5, activation='linear')(decoded)
outputs = keras.layers.Reshape((200, 5))(decoded)

model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(loss = 'mean_squared_error' ,optimizer=keras.optimizers.Adam())

# 学習
epochs = 1000
keras.utils.set_random_seed(1)
history = model.fit(
    g_data, g_data,
    batch_size=128,
    epochs=epochs,
    validation_split=0.15,
    verbose=1
)

# 予測
g_pred = model.predict(g_data)
ng_pred = model.predict(ng_data)

# MSEの計算
loss = keras.losses.MeanSquaredError(reduction = "none")

# GとNGのMSEを計算
ng_accuracy = loss(ng_data, ng_pred).mean(axis=1)
g_accuracy = loss(g_data, g_pred).mean(axis=1)[:ng_accuracy.shape[0]]

# MSEの分布の可視化
plt.figure(figsize=(10, 6))
plt.hist(np.log10(ng_accuracy), bins=50, alpha=0.5, label="NG")
plt.hist(np.log10(g_accuracy), bins=50, alpha=0.5, label="G")
plt.legend()
plt.xlabel("log10(MSE)")
plt.ylabel("Frequency")
plt.title("Distribution of MSE for G and NG")
plt.show()

良品のみで学習して、不良品を予測した時の誤差を指標にする。ヒストグラムをプロットしたものがこちら。

Autoencoder1

ちょっと重なっている部分があるが、なるほど結構分離されている。使えるかもしれない。

次は畳み込みオートエンコーダをやってみよう。

 

2026年5月24日 (日)

RF Weekly Digest (Gemini 3.1 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ)2026/5/17-5/24





RF WeeklyDigest





Weekly Intelligence Briefing

UPDATED: 15:55:08




INDUSTRY UPDATE

インテリジェンス・レポート:RF技術および半導体の進展 報告期間: 2026年5月17日 – 2026年5月24日 アナリスト: Elite RF Intelligence Unit




NETWORK STD

1. 5G-Advancedおよび6Gの標準化

過去7日間において、3GPPの枠組みの中で、5G-Advanced(リリース19)から6G(リリース20)の定式化への大きな転換が見られました。

  • 3GPP リリース19の策定完了へ: リリース19は最終的な規定フェーズ(Normative Phase)に入ったとの報告があります。主なハイライトとして、NR無線インターフェース向けAI/MLの標準化や、技術調査の75%以上が完了したアンビエントIoTプロトコルの成熟が挙げられます。
  • 6Gサービス要件(SA1): 2026年5月現在、SA1ワーキンググループ内での6G調査は80%完了しており、200以上のユースケースを網羅しています。今週確認された主な焦点領域には、通信・センシング一体型技術(ISAC)、およびGiga-MIMO展開のための**7-16 GHz「アッパーミッドバンド」**の利用が含まれます。
  • スペクトラムの進化: 業界のコンセンサスは、広域6Gカバレッジの「スイートスポット」として7-16 GHz帯に固まってきています。この帯域は、サブテラヘルツ(sub-THz)帯と比較して実現可能なリンクバジェットを維持しつつ、AI駆動のデータ集約型アプリケーションに必要な帯域幅を提供します。



NETWORK STD

2. 新規ハードウェア(チップ、モデム、モジュール)

主要メーカー各社は、AI駆動型RFフロントエンドに最適化された次世代シリコンを発表、またはサンプル出荷を開始しました。

  • Qualcomm Snapdragon X85 Modem-RF: 最近の技術公開で、第2世代の6Rxアンテナ管理を特徴とするSnapdragon X85の詳細が明らかになりました。このシステムは、AI強化アンテナスイッチングを活用して「ハンドブロッキング(手による遮蔽)」干渉を軽減し、困難な都市環境におけるセルエッジのスループットを最大20%向上させると報告されています。
  • Broadcom AIネットワーキング(2026年5月20日): Broadcomは、高性能な400G RoCE/RDMA イーサネットNICの発売を発表しました。主にデータセンター向けですが、この技術は現在サンプル出荷中の高密度Wi-Fi 8および6Gインフラのバックホール要件を支えるものです。
  • SkyworksおよびQorvoのインフラストラクチャ: スモールセル展開向けの新しいGaN-on-Si(シリコン上窒化ガリウム)パワーアンプ(PA)が発表されました。特にN77およびN78帯をターゲットとしており、電力付加効率(PAE)は50%を超える改善を見せています。



HARDWARE ANALYSIS

3. スマートフォンおよびウェアラブルの分解解析(Teardown)

近年のデバイス分解調査(TechInsights/iFixit)によると、コンポーネントの極限までの高密度化とRFフロントエンドの統合化が進んでいます。

  • Apple Watch Series 11 5G(2026年5月14日-22日公開の深掘り分析):
    • RF構成: 5Gモデム、Bluetooth 6.0、および**超広帯域無線(UWB)を統合した高度なSiP(システム・イン・パッケージ)**を搭載。
    • 分析: Apple独自の設計による**RFフロントエンド(RFFE)**モジュールを採用しており、Series 10と比較してフットプリントを15%削減しています。
  • Sony Xperia 1 VI(TechInsightsによる発売後分析):
    • モデム/トランシーバー: Qualcomm Snapdragon 8 Gen 3プラットフォームと、専用のQualcomm RFトランシーバー + GPS ICを搭載。
    • RFFE戦略: SkyworksのローバンドPAと村田製作所のデュアルSAWフィルタのハイブリッド構成を採用。
    • 接続性: Wi-Fi 7/Bluetooth 5.4用にBroadcom BCM4390を搭載し、独自の**マルチリンクオペレーション(MLO)**アンテナアレイを利用して5.8 Gbpsのピーク速度を維持しています。
  • Google Pixel 8a(RFFE分解):
    • フロントエンド: Skyworksの2.4 GHz Wi-Fi FEMとQualcommのSAWフィルタを搭載。
    • 基板設計: 高密度相互接続(HDI)基板を採用。Tensor G3の統合モデムから高利得カメラセンサーへの信号漏洩を防ぐため、特殊なシールド処理が施されています。



CONNECTIVITY

4. IoTおよびコネクティビティ(Wi-Fi 8 および Bluetooth)

コネクティビティ標準は、産業用およびXR(クロスリアリティ)アプリケーション向けの決定論的な低遅延へとシフトしています。

  • Wi-Fi 8 (802.11bn): BroadcomQualcommは、Wi-Fi 8チップセットのマスマーケット向けサンプル出荷を開始しました。この新規格では**協調空間再利用(coordinated spatial reuse)**が導入され、スタジアムのような高密度環境において複数のアクセスポイントが通信を調整し、干渉を最小限に抑えることが可能になります。
  • Bluetoothチャネルサウンディング: 2026年のフラッグシップスマートフォンにおいて標準機能となったこの技術は、近接検知のための従来のRSSIに代わるものであり、デジタルカーキーやアセットトラッキングにおいて10cm未満の測距精度を実現します。



HARDWARE ANALYSIS

5. 図表およびダイアグラム

最近の業界レポートからの主要な視覚データ:

  • Sony Xperia 1 VI メインボード写真: Qualcomm/Skyworks RFFEレイアウトの詳細。
  • Snapdragon X80/X85 ブロック図: モデムの信号パスに直接統合された専用AIテンソルアクセラレータの図解。
  • Pixel 8a RFコンポーネント・マップ: Broadcom BCM4383およびSkyworks FEMの配置レイアウト。



NETWORK STD

エグゼクティブ・サマリー: 現在のRF業界は、リリース20(6G)への移行と、物理層(PHY)へのAI統合によって定義されています。焦点は単なる通信速度から、スペクトラム・インテリジェンスやセンシング機能を有するネットワークへと移っています。QualcommBroadcomといったハードウェアメーカーは、次世代のAIウェアラブルの熱および空間的制約を満たすため、複数の無線プロトコルをシングルダイまたはSiPソリューションへと順調に集約させています。

Microsoft 365 Copilot Chat(GPT-5.5 Think Deeper)でサザエさんじゃんけん予測アプリをいろいろな予測アルゴリズムを扱えるように作り直してもらう。5/24は勾配ブースティング系だけがパーを出すと予測、ランダムフォレストやLSTM、マルコフ連鎖などは全てチョキと予想。

以前にMicrosoft 365 Copilot Chat(GPT-5.5 Think Deeper)でサザエさんじゃんけん予測アプリを作ってもらったが、実は私がひどいミスをしていて、パーがちゃんと考慮されていなかった。そこで作り直してもらうが、アルゴリズムをいろいろ試せるようにしてもらった。

具体的には以下。

=== モデル比較結果 ===
評価方法: 時系列順を維持し、直近データを検証用として評価
Accuracy は高いほど良く、LogLoss は低いほど良いです。

モデル Accuracy Balanced LogLoss 備考
------------------------------------------------------------
HistGradientBoosting 0.5944 0.5891 1.8622
SGD-LogLoss 0.5778 0.5783 1.0027
MLP 0.5722 0.5716 1.0221
LogisticRegression 0.5611 0.5600 1.0066
RandomForest 0.5556 0.5546 0.9445
GradientBoosting 0.5556 0.5494 1.0474
SVM-RBF 0.5500 0.5498 0.9924
AdaBoost 0.5444 0.5395 1.0828
KNN 0.5278 0.5275 1.0054
ExtraTrees 0.5167 0.5164 0.9838
PyTorch-LSTM 0.5167 0.5168 2.9990
GaussianNB 0.5000 0.4994 1.8112
PyTorch-GRU 0.4944 0.4955 3.1201
MarkovChain 0.3889 0.3877 1.0698
Dummy-most-frequent 0.3444 0.3333 23.6286

自動選択された最良モデル: HistGradientBoosting

で5/27を予測してもらうと最良モデルのHistGradientBoostingとGradientBoosting, AdaBoost, GRUがパー。
Sazaejanken_m365copilot1

それ以外のランダムフォレスト、LSTMなどは全てチョキと予測。

Sazaejanken_m365copilot2

さてどちらが当たるだろうか?

2026年5月22日 (金)

高周波エンジニアのためのAI・機械学習入門(GPU編24)TDRでは出せない複素特性インピーダンスの周波数特性を予測する。今回はkerasとバックエンドにJaxを使ったTransformerで。

DNN,CNN,RNN(LSTM)とやってきて今回はTransformer。

コードはこちら。


import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import os
os.environ["KERAS_BACKEND"] = "jax"
import keras
from jax import config
config.update("jax_enable_x64", False)
plt.rcParams['font.family'] = 'Noto Sans CJK JP'

data_label = np.load("tl_freq_data.npz")
data = data_label["data"]
label = data_label["label"]
x_train, x_test, y_train, y_test = train_test_split(data, label, test_size=0.3, random_state=0)
y_train_list = [y_train[:,:,1], y_train[:,:,2]]
y_test_list = [y_test[:,:,1], y_test[:,:,2]]

scaler_y = [StandardScaler() for _ in range(2)]
y_train_list_f = [None for _ in range(2)]
for i in range(2):
    scaler_y[i] = StandardScaler()
    y_train_list_f[i] = scaler_y[i].fit_transform(y_train_list[i])

# ==========================
# Positional Encoding
# ==========================
def positional_encoding(seq_len, d_model):
    pos = np.arange(seq_len)[:, np.newaxis]
    i = np.arange(d_model)[np.newaxis, :]
    angle_rates = 1 / np.power(10000, (2 * (i // 2)) / np.float32(d_model))
    angle_rads = pos * angle_rates

    pe = np.zeros((seq_len, d_model))
    pe[:, 0::2] = np.sin(angle_rads[:, 0::2])
    pe[:, 1::2] = np.cos(angle_rads[:, 1::2])
    return keras.ops.convert_to_tensor(pe, dtype="float32")

# ==========================
# Transformer Encoder Block
# ==========================
def transformer_encoder(x, head_size, num_heads, ff_dim, dropout=0.1):
    # Self Attention
    attn_out = keras.layers.MultiHeadAttention(
        num_heads=num_heads,
        key_dim=head_size
    )(x, x)

    #attn_out = keras.layers.Dropout(dropout)(attn_out)
    x = keras.layers.LayerNormalization(epsilon=1e-6)(x + attn_out)

    # Feed Forwardネットワーク
    ffn = keras.layers.Dense(ff_dim, activation="relu")(x)
    ffn = keras.layers.Dense(x.shape[-1])(ffn)
    #ffn = keras.layers.Dropout(dropout)(ffn)

    x = keras.layers.LayerNormalization(epsilon=1e-6)(x + ffn)
    return x

seq_len = 200
feat_dim = 5
embed_dim = 64

inputs = keras.Input(shape=(seq_len, feat_dim))

# 入力を高次元に射影
x = keras.layers.Dense(embed_dim)(inputs)

# Positional Encodingを加算
pe = positional_encoding(seq_len, embed_dim)
x = x + pe

# Transformer ブロック
x = transformer_encoder(x, head_size=64, num_heads=4, ff_dim=128)
#x = transformer_encoder(x, head_size=64, num_heads=4, ff_dim=128)


# 時系列次元を集約
x = keras.layers.GlobalAveragePooling1D()(x)

# 全結合
x = keras.layers.Dense(128, activation="relu")(x)

outputs = [keras.layers.Dense(200)(x) for i in range(2)]

model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(loss = 'mean_squared_error' ,optimizer=keras.optimizers.Adam())

batch_size = 128
epochs = 1000
keras.utils.set_random_seed(1)
history = model.fit(
    x_train,
    y_train_list_f,
    batch_size=batch_size,
    epochs=epochs,
    validation_split=0.15,
)

y_pred_list_f = model.predict(x_test)
y_pred_list = [None for _ in range(2)]
for i in range(2):
    y_pred_list[i] = scaler_y[i].inverse_transform(y_pred_list_f[i])

metric = keras.metrics.R2Score()
for idx in range(2):
    print(f"R2 score for label {idx}:")
    metric.update_state(y_test_list[idx], y_pred_list[idx])
    result = metric.result()
    print(result)



R2スコアはこちら。まずまず。

R2 score for label 0:
0.99998623
R2 score for label 1:
0.9999977

代表例。ちょっとずれてるか。

Gpuz0freqtransformer01

最大誤差をヒストグラムにしたもの。

Gpuz0freqtransformer02

そこそこいいが、今回の例ではCNNが一番精度、速度ともによさそう。

より以前の記事一覧

最近の記事

2026年6月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

最近のコメント

無料ブログはココログ
フォト