このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
CDL チャネルを使用した再構成可能なインテリジェント サーフェスのモデル化
この例では、連結された 2 つのクラスター遅延線 (CDL) チャネル モデルを使用して、再構成可能なインテリジェント サーフェス (RIS) チャネルをシミュレートし、各 RIS 素子の位相を制御する反復アルゴリズムを提供します。次に、6G を模した信号を RIS チャネル経由で送信し、受信した信号のコンスタレーションを表示します。
システム モデル
この例では、次の図に示すシナリオをモデル化します。 アンテナ送信機は、サイズ のプリコーディング ベクトル を使用して、複素シンボル を送信します。この例では、送信機と受信機との間に見通し線がないと仮定しています。 個の素子から成る RIS は、送信された信号を単一のアンテナ受信機に向けて反射します。 と は、それぞれ RIS 内の 1 行あたりおよび 1 列あたりの素子の数です。信号は、送信機と RIS との間のチャネルをモデル化するサイズ のチャネル行列 の影響を受けます。RIS の 番目の素子は、入射信号の振幅と位相の変化を引き起こします。これは複素数 によってモデル化されます。反射信号は、サイズ の行列 によってモデル化されたチャネルを介し、受信機に向かって伝搬します。受信信号 は、ノイズ の影響を受けます。

この例では、CDL チャネルを使用して、送信機と RIS との間のチャネルと、RIS と受信機との間のチャネルの両方をモデル化します。この例では、RIS をモデル化するため、両方の CDL チャネルの間にある各 RIS 素子に位相回転 を適用します。反復アルゴリズムは、チャネル行列 と が既知であると仮定して、位相シフトの値 を計算します。この例では、パス損失と RIS の散乱損失もモデル化します。
この例では、必要に応じて、RIS に関する ETSI のグループ レポート [1] で定義されているパラメーターを使用します。
この例では、確率論的チャネル モデルを使用して RIS をモデル化します。決定論的チャネル モデルを使用した RIS の概要については、Introduction to Reconfigurable Intelligent Surfaces (RIS) (Phased Array System Toolbox)の例を参照してください。
キャリアおよび PDSCH のパラメーターの設定
キャリア周波数、キャリア構成オブジェクト、および PDSCH のパラメーターを設定します。対象信号のサンプリング レートを計算します。
rng('default') fc = 28e9; % Carrier frequency (Hz) carrier = pre6GCarrierConfig("NSizeGrid",50,"SubcarrierSpacing",120); pdsch = pre6GPDSCHConfig("Modulation","16QAM","NumLayers",1,"PRBSet",0:carrier.NSizeGrid-1); ofdmInfo = hpre6GOFDMInfo(carrier); fs = ofdmInfo.SampleRate;
RIS および送信アレイのパラメーターの設定
この例では、送信機のアンテナが複数台で、RIS が 個の素子から成り、受信機のアンテナが 1 台であると仮定しています。受信機のアンテナが 1 台であると仮定しているため、RIS 制御アルゴリズムが簡単になります。
送信アレイのサイズを指定します。 の形式を使用します。ここで、 と は、それぞれアンテナ アレイの行数と列数です。 は偏波の数 (1 または 2) です。 と は、それぞれ行アレイ パネルと列アレイ パネルの数です。
% Transmit array txArraySize = [4 2 2 1 1]; % [M N P Mg Ng] Ntx = prod(txArraySize(1:3));
RIS 素子の位相最適化アルゴリズムを有効にするには、ris.Enable を true に設定します。このフラグを無効にすると、各 RIS 素子にランダムな位相シフトが割り当てられるため、意図したとおりの動作を RIS に行わせられなくなります。RIS の素子の数、素子の寸法 と 、および素子のゲイン を指定します。RIS のサイズは です。ここで、 は RIS の素子 1 個あたりの偏波の数 (1 または 2) です。
% RIS parameters ris.Enable = true; ris.Size = [8 4 2]; numRISElements = prod(ris.Size); % Wavelength c = physconst("lightspeed"); lambda = c/fc; % RIS element size ris.dx = lambda/5; ris.dy = lambda/5; ris.A = 0.8; % Amplitude of reflection coefficients of each RIS element
RIS によってアシストされたチャネルの定義
この例では、連結された 2 つの CDL チャネルを使用して伝播チャネルをモデル化します。RIS は、CDL チャネル間の RIS 素子ごとの位相回転によってモデル化されます。hpre6GRISChannel オブジェクトは、CDL チャネル、および位相素子ごとの位相回転の両方を実装します。hpre6GRISChannel クラスはパス損失をモデル化しません。パス損失は外部で適用されます。
risCh = hpre6GRISChannel("SampleRate",ofdmInfo.SampleRate,"RISSize",ris.Size,"CarrierFrequency",fc); risCh.TransmitAntennaArray.Size = txArraySize; risCh.ReceiveAntennaArray.Size = [1 1 1 1 1]; % Receive array must be a single antenna in this example risCh.Seed = randi([0,(2^32)-1]); % Random seed % Calculate the overall channel delay chInfo = risCh.info; channelDelay = chInfo.TxRISChInfo.MaximumChannelDelay + chInfo.RISRXChInfo.MaximumChannelDelay;
RIS に関する ETSI のグループ レポート [1] で定義されている送信電力、ノイズ、干渉関連のパラメーターを指定します。
txPower = 20; % dBm. Average transmit power per antenna % Noise and interference parameters noiseFigure = 7; % dB thermalNoiseDensity = -174; % dBm/Hz rxInterfDensity = -165.7; % dBm/Hz % Calculate the corresponding noise power totalNoiseDensity = 10*log10(10^((noiseFigure+thermalNoiseDensity)/10)+10^(rxInterfDensity/10)); BW = 12*carrier.NSizeGrid*carrier.SubcarrierSpacing*1e3; noisePower = totalNoiseDensity+10*log10(BW); % dBm N = 10^((noisePower-30)/10); % Linear
RIS のリンク パス損失の計算
遠方界の場合の RIS シナリオのパス損失は、ETSI のレポートで次のように示されています。
と は送信アンテナと受信アンテナのゲインです。 は単一の RIS 素子の散乱ゲインです。 と は各 RIS 素子の幅と長さを表します。 は波長です。 と は、それぞれ送信機と受信機の方向における各素子の正規化された放射パターンを表します。 と は、RIS の中心から送信機までの仰角と方位角です。 は各 RIS 素子の反射係数の大きさを表します。これはすべての素子で同じであると仮定します。
一般に、RIS 素子の散乱ゲインを次のように仮定します。
この例では、 であると仮定しています。したがって、次のようになります。
% Distance between Tx and RIS and RIS and Rx dt = 105; % meters dr = 7; % meters % Path loss (power gain) PL = ((4*pi*dt*dr)/(prod(ris.Size(1:3))*ris.dx*ris.dy*ris.A)).^2; disp("RIS link path loss "+10*log10(PL)+" dB")
RIS link path loss 151.8968 dB
プリコーディング ベクトルと RIS 素子の位相値の計算
この例では、準最適な反復的手法を使用して、プリコーディング ベクトル と位相値 を計算します。この手法は、Tao Zhou および Kui Xu [2] が説明しているものと類似した反復アルゴリズムです。このアルゴリズムは、初期の位相セット に対し、最大比伝送 (MRT) を使用してプリコーディング重みセット を計算します。このアルゴリズムは、プリコーディング重みの値が与えられると、 および の両方のチャネルの結合された位相変化と RIS が一定になるように、位相セット を再計算します。この処理は、値が解に収束するまで繰り返し実行されます。このアルゴリズムは、少なくとも局所的に最適なソリューションを約束します。
[risElementCoeff,w,overallChannel] = calculateRISCoeff(ris.Enable,risCh,carrier);
この例では、 と の値を計算するため、すべてのサブキャリアと OFDM シンボルにわたるチャネル条件の平均を計算します。
1 回の反復ごとに、RIS 位相計算アルゴリズムの収束状態を確認し、達成可能な SNR をプロットします。
if ris.Enable % Consider tx array gain for the transmit power % (txPower is measured per antenna element) achievableSNR = (txPower)+10*log10(Ntx)-10*log10(PL)+10*log10(abs(overallChannel).^2)-(noisePower); plot(0:length(achievableSNR)-1,achievableSNR,'.-') xlabel("Iteration Number");ylabel("Achievable SNR (dB)") title("Achievable SNR (shows iterative algorithm convergence)") end

データの送受信
6G を模したフレームのスロットを 1 つ生成し、RIS によってアシストされたチャネルを介してそのフレームを送信します。この例では、PDSCH の符号化されていないビット (チャネル符号化されていないビット) を使用します。この信号の帯域幅とサブキャリア間隔を変更することで、6G を模した信号に対する RIS の影響を調べることができます。
w = w.'; % transmitter requires w to be of the form number of layers by number of transmit antennas
[txWaveform,pdschSym,pdschInd,dmrsSym,dmrsInd,~,pdschGrid] = generateTxWaveform(carrier,pdsch,w,txPower);チャネルを経由して信号を送信し、ノイズを付加します。
% Pad with zeros to flush full slot from the channel txWaveform = [txWaveform; zeros(channelDelay,size(txWaveform,2))]; % Send signal through RIS assisted channel rxWaveformNoisless = risCh(txWaveform,risElementCoeff); % Apply path loss rxWaveformNoisless = (1/sqrt(PL))* rxWaveformNoisless; % Add noise noise = sqrt(N)*randn(size(rxWaveformNoisless),"like",rxWaveformNoisless); rxWaveform = rxWaveformNoisless+noise; % Power measurements Ptx = mean(rms(txWaveform).^2); Prx = mean(rms(rxWaveformNoisless).^2); disp("Avg tx power (per antenna) = "+(10*log10(Ptx)+30)+" dBm")
Avg tx power (per antenna) = 19.9955 dBm
disp("Avg rx power (per antenna) = "+(10*log10(Prx)+30)+" dBm")
Avg rx power (per antenna) = -72.5773 dBm
disp("SNR (time domain) = "+10*log10(mean(rms(rxWaveformNoisless).^2)/mean(rms(noise).^2))+" dB")
SNR (time domain) = 12.1343 dB
受信信号を復号化し、イコライズされたコンスタレーションをプロットします。
% Perfect synchronization [~,~,offsetTxRIS,offsetRISRx] = risCh.channelResponse(carrier); rxWaveform = rxWaveform(1+offsetTxRIS+offsetRISRx:end,:); % PDSCH decoding [pdschEq,pdschRx] = decodePDSCH(rxWaveform,carrier,pdsch,pdschInd,dmrsSym,dmrsInd); scatterplot(pdschEq); title("Equalized PDSCH Symbols")

Sre = (1/ofdmInfo.Nfft.^2)*rms(pdschRx).^2; Nre = (1/ofdmInfo.Nfft)*rms(noise).^2; disp("SNR (per RE) = " + string(pow2db(Sre/Nre)) + " dB");
SNR (per RE) = 14.7863 dB
受信信号のエラー ベクトル振幅 (EVM) を計算します。
evm = comm.EVM(); symbolsEVM = evm(pdschSym,pdschEq); disp("PDSCH symbols EVM: "+symbolsEVM+"%")
PDSCH symbols EVM: 19.3054%
参考文献
[1] ETSI GR RIS 003 V1.1.1. "Reconfigurable Intelligent Surfaces (RIS); Communication Models, Channel Models, Channel Estimation and Evaluation Methodology."
[2] Tao Zhou, Kui Xu. Multi-Intelligent Reflecting Surface-Aided Wireless Network With Achievable Rate Maximization. 2020 International Conference on Wireless Communications and Signal Processing (WCSP).
ローカル関数
function [risElementCoeff,w,Htot] = calculateRISCoeff(enableRIS,risCh,carrier) % Initialize RIS element coefficients (gain = 1 and random phase) numRISElements = prod(risCh.RISSize); theta = 2*pi*rand(1,numRISElements); % uniformly distributed phases in [0, 2*pi] risElementCoeff = exp(1i*theta); % If the RIS algorithm is disabled, this is the value used in the % simulation [G,h] = getRISChannelFreqResponse(risCh,carrier); H = h*diag(risElementCoeff)*G; % Calculate precoding weights using MRT (maximum ratio transmission) w = H'/norm(H); if enableRIS numIter = 10; % Number of iterations Htot = zeros(numIter+1,1); % Total channel H*wf. Used to check convergence Htot(1) = H*w; for n = 1:numIter % Need to calculate B = h*diag(G*w), where w is the transmitter % precoding vector, G is the transmitter to RIS channel matrix and % h is the RIS to receiver channel matrix. B is used to calculate % the new RIS phase values theta as -angle(B) B = h*diag(G*w); % Calculate the new phase vector phi that compensates for the phase changes in hr, G and w theta = -angle(B); % New RIS coefficients risElementCoeff = exp(1i*theta); % New combined channel matrix H H = h*diag(risElementCoeff)*G; % Get new weights w based on new channel matrix H w = H'/norm(H); % Overall channel response for this iteration. Used to check % convergence Htot(n+1) = H*w; end else Htot = H*w; end end function [G,h] = getRISChannelFreqResponse(risCh,carrier) % Calculate the overall RIS channel response averaging the % channel response, that is, one channel matrix for the whole % bandwidth, and not per resource element. [TxRISGrid,RISRxGrid] = channelResponse(risCh,carrier); h = zeros(size(RISRxGrid,3),size(RISRxGrid,4)); RISRxGrid = mean(RISRxGrid,[1 2]); % assume flat in time and freq h(:,:) = RISRxGrid(1,1,:,:); G = zeros(size(TxRISGrid,3),size(TxRISGrid,4)); TxRISGrid = mean(TxRISGrid,[1 2]); % assume flat in time and freq G(:,:) = TxRISGrid(1,1,:,:); end function [txWaveform,pdschSymbols,pdschIndices,dmrsSymbols,dmrsIndices,waveformInfo,pdschGrid] ... = generateTxWaveform(carrier,pdsch,wtx,txPower) nTxAnts = length(wtx); % PDSCH and PDSCH DM-RS [pdschIndices,pdschInfo] = hpre6GPDSCHIndices(carrier,pdsch); pdschBits = randi([0 1],pdschInfo.G,1); pdschSymbols = hpre6GPDSCH(carrier,pdsch,pdschBits); dmrsSymbols = hpre6GPDSCHDMRS(carrier,pdsch); dmrsIndices = hpre6GPDSCHDMRSIndices(carrier,pdsch); % PDSCH precoding pdschSymbolsPrecoded = pdschSymbols*wtx; % Grid pdschGrid = hpre6GResourceGrid(carrier,nTxAnts); [~,pdschAntIndices] = nrExtractResources(pdschIndices,pdschGrid); pdschGrid(pdschAntIndices) = pdschSymbolsPrecoded; % PDSCH DM-RS precoding and mapping for p = 1:size(dmrsSymbols,2) [~,dmrsAntIndices] = nrExtractResources(dmrsIndices(:,p),pdschGrid); pdschGrid(dmrsAntIndices) = pdschGrid(dmrsAntIndices) + dmrsSymbols(:,p)*wtx(p,:); end % OFDM Modulation [txWaveform,waveformInfo] = hpre6GOFDMModulate(carrier,pdschGrid); % Scale power of transmitted signal to desired value. txWaveform = scalePower(txWaveform,txPower); end function waveform = scalePower(waveform,desiredPower) % Scale input WAVEFORM to achieve the desiredPower in dBm K = sqrt((1/mean(rms(waveform).^2))*10^((desiredPower-30)/10)); waveform = K*waveform; end function [pdschEq,pdschRx] = decodePDSCH(rxWaveform,carrier,pdsch,pdschIndices,dmrsSymbols,dmrsIndices) % OFDM demodulation rxGrid = hpre6GOFDMDemodulate(carrier,rxWaveform); % Channel estimation [estChGridLayers,noiseEst] = hpre6GChannelEstimate(carrier,rxGrid,dmrsIndices,dmrsSymbols,... 'CDMLengths',pdsch.DMRS.CDMLengths); % Equalization [pdschRx,pdschHest] = nrExtractResources(pdschIndices,rxGrid,estChGridLayers); [pdschEq,~] = nrEqualizeMMSE(pdschRx,pdschHest,noiseEst); end
参考
pre6GCarrierConfig | pre6GPDSCHConfig
トピック
- Get Started with 6G Exploration Library
- Introduction to Reconfigurable Intelligent Surfaces (RIS) (Phased Array System Toolbox)