メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

CDL チャネルを使用した再構成可能なインテリジェント サーフェスのモデル化

R2024a 以降

この例では、連結された 2 つのクラスター遅延線 (CDL) チャネル モデルを使用して、再構成可能なインテリジェント サーフェス (RIS) チャネルをシミュレートし、各 RIS 素子の位相を制御する反復アルゴリズムを提供します。次に、6G を模した信号を RIS チャネル経由で送信し、受信した信号のコンスタレーションを表示します。

システム モデル

この例では、次の図に示すシナリオをモデル化します。Ntx アンテナ送信機は、サイズ Ntx×1 のプリコーディング ベクトル w を使用して、複素シンボル s を送信します。この例では、送信機と受信機との間に見通し線がないと仮定しています。NRIS=NRISx×NRISy 個の素子から成る RIS は、送信された信号を単一のアンテナ受信機に向けて反射します。NRISyNRISx は、それぞれ RIS 内の 1 行あたりおよび 1 列あたりの素子の数です。信号は、送信機と RIS との間のチャネルをモデル化するサイズ NRIS×Ntx のチャネル行列 G の影響を受けます。RIS の i 番目の素子は、入射信号の振幅と位相の変化を引き起こします。これは複素数 βiejθi によってモデル化されます。反射信号は、サイズ 1×NRIS の行列 h によってモデル化されたチャネルを介し、受信機に向かって伝搬します。受信信号 y は、ノイズ n の影響を受けます。

A multiantenna transmitter sends a signal towards a RIS, which reflects it in the direction of the receiver.

この例では、CDL チャネルを使用して、送信機と RIS との間のチャネルと、RIS と受信機との間のチャネルの両方をモデル化します。この例では、RIS をモデル化するため、両方の CDL チャネルの間にある各 RIS 素子に位相回転 θi を適用します。反復アルゴリズムは、チャネル行列 Gh が既知であると仮定して、位相シフトの値 θi を計算します。この例では、パス損失と 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 が NRIS 個の素子から成り、受信機のアンテナが 1 台であると仮定しています。受信機のアンテナが 1 台であると仮定しているため、RIS 制御アルゴリズムが簡単になります。

送信アレイのサイズを指定します。[MNPMgNg] の形式を使用します。ここで、MN は、それぞれアンテナ アレイの行数と列数です。P は偏波の数 (1 または 2) です。MgNg は、それぞれ行アレイ パネルと列アレイ パネルの数です。

% Transmit array
txArraySize = [4 2 2 1 1]; % [M N P Mg Ng]
Ntx =  prod(txArraySize(1:3));

RIS 素子の位相最適化アルゴリズムを有効にするには、ris.Enabletrue に設定します。このフラグを無効にすると、各 RIS 素子にランダムな位相シフトが割り当てられるため、意図したとおりの動作を RIS に行わせられなくなります。RIS の素子の数、素子の寸法 dxdy、および素子のゲイン A を指定します。RIS のサイズは [NRISyNRISxPRIS] です。ここで、PRIS は 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 のレポートで次のように示されています。

PLRIS=64π3(dtdr)2GtGrGsNRIS2dxdyλ2F(θt,ϕt)F(θr,ϕr)A2

GtGr は送信アンテナと受信アンテナのゲインです。Gs は単一の RIS 素子の散乱ゲインです。dxdy は各 RIS 素子の幅と長さを表します。λ は波長です。F(θt,ϕt)F(θr,ϕr) は、それぞれ送信機と受信機の方向における各素子の正規化された放射パターンを表します。θtϕt は、RIS の中心から送信機までの仰角と方位角です。A は各 RIS 素子の反射係数の大きさを表します。これはすべての素子で同じであると仮定します。

一般に、RIS 素子の散乱ゲインを次のように仮定します。

Gs=4πdxdyλ2

この例では、Gt=Gr=F(θt,ϕt)=F(θr,ϕr)=1 であると仮定しています。したがって、次のようになります。

PLRIS=64π3(dtdr)2GsNRIS2dxdyλ2A2=(4πdtdrNRISdxdyA)2

% 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 素子の位相値の計算

この例では、準最適な反復的手法を使用して、プリコーディング ベクトル w と位相値 θi を計算します。この手法は、Tao Zhou および Kui Xu [2] が説明しているものと類似した反復アルゴリズムです。このアルゴリズムは、初期の位相セット θi に対し、最大比伝送 (MRT) を使用してプリコーディング重みセット w を計算します。このアルゴリズムは、プリコーディング重みの値が与えられると、G および h の両方のチャネルの結合された位相変化と RIS が一定になるように、位相セット θi を再計算します。この処理は、値が解に収束するまで繰り返し実行されます。このアルゴリズムは、少なくとも局所的に最適なソリューションを約束します。

[risElementCoeff,w,overallChannel] = calculateRISCoeff(ris.Enable,risCh,carrier);

この例では、Gh の値を計算するため、すべてのサブキャリアと 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

Figure contains an axes object. The axes object with title Achievable SNR (shows iterative algorithm convergence), xlabel Iteration Number, ylabel Achievable SNR (dB) contains an object of type line.

データの送受信

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")

Figure Scatter Plot contains an axes object. The axes object with title Equalized PDSCH Symbols, xlabel In-Phase, ylabel Quadrature contains a line object which displays its values using only markers. This object represents Channel 1.

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

参考

|

トピック