В этом примере показано, как гибрид beamforming используется в конце передачи крупной системы связи MIMO, с помощью методов и для многопользовательских и для однопользовательских систем. Пример использует полный канал, звучащий для определения информации о состоянии канала в передатчике. Это делит необходимое предварительное кодирование на цифровые основополосные и аналоговые компоненты RF, с помощью различных методов для многопользовательских и однопользовательских систем. Упрощенные полностью цифровые приемники восстанавливают несколько потоков передаваемых данных, чтобы подсветить общие показатели качества для системы связи, а именно, EVM и BER.
Пример использует основанную на рассеивании пространственную модель канала, которая составляет передавание/получение пространственных местоположений и шаблонов антенны. Более простой статически-плоский канал MIMO также предлагается в целях валидации ссылки.
Пример требует Communications Toolbox™ и Phased Array System Toolbox™.
Постоянно растущий спрос на высокую скорость передачи данных и больше пользовательской способности повышается потребность использовать доступный спектр более эффективно. Многопользовательский MIMO (MU-MIMO) повышает эффективность спектра, позволяя передатчику базовой станции (BS) связаться одновременно с несколькими приемниками мобильных станций (MS) с помощью тех же ресурсов частоты времени. Крупный MIMO позволяет количеству антенных элементов BS быть на порядке десятков или сотен, таким образом, также увеличивая число потоков данных в ячейке к большому значению.
Следующее поколение, 5G, беспроводные системы используют волну миллиметра (mmWave) полосы, чтобы использовать в своих интересах их более широкую пропускную способность. Системы 5G также развертывают крупномасштабные антенные решетки, чтобы смягчить серьезную потерю распространения в mmWave полосе.
По сравнению с текущими беспроводными системами длина волны в mmWave полосе намного меньше. Несмотря на то, что это позволяет массиву содержать больше элементов в той же физической размерности, становится намного более дорого обеспечить, одна передача - получают (TR) модуль или цепь RF, для каждого антенного элемента. Гибридные приемопередатчики являются практическим решением, когда они используют комбинацию аналоговых формирователей луча в RF и цифровых формирователей луча в основополосных областях с меньшим количеством цепей RF, чем количество элементов передачи [1].
Этот пример использует многопользовательскую систему MIMO-OFDM, чтобы подсветить разделение необходимого предварительного кодирования в его цифровую основную полосу и аналоговые компоненты RF в конце передатчика. Основываясь на системе, подсвеченной в Предварительном кодировании MIMO-OFDM с примером Фазированных решеток, этот пример показывает формулировку матриц конца передачи перед кодированием и их приложения к системе MIMO-OFDM.
s = rng(67); % Set RNG state for repeatability
Задайте системные параметры для примера. Измените эти параметры, чтобы исследовать их удар на систему.
% Multi-user system with single/multiple streams per user prm.numUsers = 4; % Number of users prm.numSTSVec = [3 2 1 2]; % Number of independent data streams per user prm.numSTS = sum(prm.numSTSVec); % Must be a power of 2 prm.numTx = prm.numSTS*8; % Number of BS transmit antennas (power of 2) prm.numRx = prm.numSTSVec*4; % Number of receive antennas, per user (any >= numSTSVec) % Each user has the same modulation prm.bitsPerSubCarrier = 4; % 2: QPSK, 4: 16QAM, 6: 64QAM, 8: 256QAM prm.numDataSymbols = 10; % Number of OFDM data symbols % MS positions: assumes BS at origin % Angles specified as [azimuth;elevation] degrees % az in range [-180 180], el in range [-90 90], e.g. [45;0] maxRange = 1000; % all MSs within 1000 meters of BS prm.mobileRanges = randi([1 maxRange],1,prm.numUsers); prm.mobileAngles = [rand(1,prm.numUsers)*360-180; ... rand(1,prm.numUsers)*180-90]; prm.fc = 28e9; % 28 GHz system prm.chanSRate = 100e6; % Channel sampling rate, 100 Msps prm.ChanType = 'Scattering'; % Channel options: 'Scattering', 'MIMO' prm.NFig = 8; % Noise figure (increase to worsen, 5-10 dB) prm.nRays = 500; % Number of rays for Frf, Fbb partitioning
Задайте параметры модуляции OFDM, используемые для системы.
prm.FFTLength = 256; prm.CyclicPrefixLength = 64; prm.numCarriers = 234; prm.NullCarrierIndices = [1:7 129 256-5:256]'; % Guards and DC prm.PilotCarrierIndices = [26 54 90 118 140 168 204 232]'; nonDataIdx = [prm.NullCarrierIndices; prm.PilotCarrierIndices]; prm.CarriersLocations = setdiff((1:prm.FFTLength)', sort(nonDataIdx)); numSTS = prm.numSTS; numTx = prm.numTx; numRx = prm.numRx; numSTSVec = prm.numSTSVec; codeRate = 1/3; % same code rate per user numTails = 6; % number of termination tail bits prm.numFrmBits = numSTSVec.*(prm.numDataSymbols*prm.numCarriers* ... prm.bitsPerSubCarrier*codeRate)-numTails; prm.modMode = 2^prm.bitsPerSubCarrier; % Modulation order % Account for channel filter delay numPadSym = 3; % number of symbols to zeropad prm.numPadZeros = numPadSym*(prm.FFTLength+prm.CyclicPrefixLength);
Задайте передачу и получите массивы и позиционные параметры для системы.
prm.cLight = physconst('LightSpeed'); prm.lambda = prm.cLight/prm.fc; % Get transmit and receive array information [isTxURA,expFactorTx,isRxURA,expFactorRx] = helperArrayInfo(prm,true); % Transmit antenna array definition % Array locations and angles prm.posTx = [0;0;0]; % BS/Transmit array position, [x;y;z], meters if isTxURA % Uniform Rectangular array txarray = phased.PartitionedArray(... 'Array',phased.URA([expFactorTx numSTS],0.5*prm.lambda),... 'SubarraySelection',ones(numSTS,numTx),'SubarraySteering','Custom'); else % Uniform Linear array txarray = phased.ULA(numTx, 'ElementSpacing',0.5*prm.lambda, ... 'Element',phased.IsotropicAntennaElement('BackBaffled',false)); end prm.posTxElem = getElementPosition(txarray)/prm.lambda; spLoss = zeros(prm.numUsers,1); prm.posRx = zeros(3,prm.numUsers); for uIdx = 1:prm.numUsers % Receive arrays if isRxURA(uIdx) % Uniform Rectangular array rxarray = phased.PartitionedArray(... 'Array',phased.URA([expFactorRx(uIdx) numSTSVec(uIdx)], ... 0.5*prm.lambda),'SubarraySelection',ones(numSTSVec(uIdx), ... numRx(uIdx)),'SubarraySteering','Custom'); prm.posRxElem = getElementPosition(rxarray)/prm.lambda; else if numRx(uIdx)>1 % Uniform Linear array rxarray = phased.ULA(numRx(uIdx), ... 'ElementSpacing',0.5*prm.lambda, ... 'Element',phased.IsotropicAntennaElement); prm.posRxElem = getElementPosition(rxarray)/prm.lambda; else rxarray = phased.IsotropicAntennaElement; prm.posRxElem = [0; 0; 0]; % LCS end end % Mobile positions [xRx,yRx,zRx] = sph2cart(deg2rad(prm.mobileAngles(1,uIdx)), ... deg2rad(prm.mobileAngles(2,uIdx)), ... prm.mobileRanges(uIdx)); prm.posRx(:,uIdx) = [xRx;yRx;zRx]; [toRxRange,toRxAng] = rangeangle(prm.posTx,prm.posRx(:,uIdx)); spLoss(uIdx) = fspl(toRxRange,prm.lambda); end
Для пространственно мультиплексированной системы доступность информации о канале в передатчике позволяет, чтобы предварительное кодирование было применено, чтобы максимизировать энергию сигнала в направлении и канале интереса. Под предположением о медленно различном канале это упрощено путем звучания каналом сначала. BS звучит как канал при помощи ссылочной передачи, что использование приемника MS, чтобы оценить канал. MS передает информацию об оценке канала назад к BS для вычисления предварительного кодирования, необходимого для последующей передачи данных.
Следующие схематические показы обработка для канала, звучащего смоделированным.
Для выбранной системы MIMO сигнал преамбулы отправляется по всем элементам передающей антенны и обрабатывается в приемнике, составляющем канал. Антенные элементы приемника выполняют предварительное усиление, демодуляцию OFDM и оценку канала частотного диапазона для всех ссылок.
% Generate the preamble signal prm.numSTS = numTx; % set to numTx to sound out all channels preambleSig = helperGenPreamble(prm); % Transmit preamble over channel prm.numSTS = numSTS; % keep same array config for channel [rxPreSig,chanDelay] = helperApplyMUChannel(preambleSig,prm,spLoss); % Channel state information feedback hDp = cell(prm.numUsers,1); prm.numSTS = numTx; % set to numTx to estimate all links for uIdx = 1:prm.numUsers % Front-end amplifier gain and thermal noise rxPreAmp = phased.ReceiverPreamp( ... 'Gain',spLoss(uIdx), ... % account for path loss 'NoiseFigure',prm.NFig,'ReferenceTemperature',290, ... 'SampleRate',prm.chanSRate); rxPreSigAmp = rxPreAmp(rxPreSig{uIdx}); % scale power for used sub-carriers rxPreSigAmp = rxPreSigAmp * (sqrt(prm.FFTLength - ... length(prm.NullCarrierIndices))/prm.FFTLength); % OFDM demodulation rxOFDM = ofdmdemod(rxPreSigAmp(chanDelay(uIdx)+1: ... end-(prm.numPadZeros-chanDelay(uIdx)),:),prm.FFTLength, ... prm.CyclicPrefixLength,prm.CyclicPrefixLength, ... prm.NullCarrierIndices,prm.PilotCarrierIndices); % Channel estimation from preamble % numCarr, numTx, numRx hDp{uIdx} = helperMIMOChannelEstimate(rxOFDM(:,1:numTx,:),prm); end
Для многопользовательской системы оценка канала возвращается от каждого MS и используется BS, чтобы определить веса перед кодированием. Пример принимает совершенную обратную связь без задержек квантования или реализации.
Пример использует алгоритм ортогонального преследования соответствия (OMP) [3] для однопользовательской системы и метода объединенного пространственного мультиплексирования деления (JSDM) [2, 4] для многопользовательской системы, чтобы определить цифровой основополосный Fbb
и аналог RF Frf
предварительное кодирование весов для выбранной конфигурации системы.
Для однопользовательской системы OMP разделение алгоритма чувствительно к векторам отклика массивов At
. Идеально, эти векторы отклика составляют все рассеиватели, замеченные каналом, но они неизвестны для фактической системы и реализации канала, таким образом, случайный набор лучей в 3 мерных пространствах, чтобы покрыть как можно больше рассеивателей используется. prm.nRays
параметр задает количество лучей.
Для многопользовательской системы пользователи групп JSDM с подобной ковариацией канала передачи вместе и подавляют межгрупповую интерференцию аналоговым предварительным кодером на основе метода диагонализации блока [5]. Здесь каждый пользователь присвоен быть в его собственной группе, таким образом, не ведя ни к какому сокращению звучания или обратной связи наверху.
% Calculate the hybrid weights on the transmit side if prm.numUsers==1 % Single-user OMP % Spread rays in [az;el]=[-180:180;-90:90] 3D space, equal spacing % txang = [-180:360/prm.nRays:180; -90:180/prm.nRays:90]; txang = [rand(1,prm.nRays)*360-180;rand(1,prm.nRays)*180-90]; % random At = steervec(prm.posTxElem,txang); AtExp = complex(zeros(prm.numCarriers,size(At,1),size(At,2))); for carrIdx = 1:prm.numCarriers AtExp(carrIdx,:,:) = At; % same for all sub-carriers end % Orthogonal matching pursuit hybrid weights [Fbb,Frf] = omphybweights(hDp{1},numSTS,numSTS,AtExp); v = Fbb; % set the baseband precoder (Fbb) % Frf is same across subcarriers for flat channels mFrf = permute(mean(Frf,1),[2 3 1]); else % Multi-user Joint Spatial Division Multiplexing [Fbb,mFrf] = helperJSDMTransmitWeights(hDp,prm); % Multi-user baseband precoding % Pack the per user CSI into a matrix (block diagonal) steeringMatrix = zeros(prm.numCarriers,sum(numSTSVec),sum(numSTSVec)); for uIdx = 1:prm.numUsers stsIdx = sum(numSTSVec(1:uIdx-1))+(1:numSTSVec(uIdx)); steeringMatrix(:,stsIdx,stsIdx) = Fbb{uIdx}; % Nst-by-Nsts-by-Nsts end v = permute(steeringMatrix,[1 3 2]); end % Transmit array pattern plots if isTxURA % URA element response for the first subcarrier pattern(txarray,prm.fc,-180:180,-90:90,'Type','efield', ... 'ElementWeights',mFrf.'*squeeze(v(1,:,:)), ... 'PropagationSpeed',prm.cLight); else % ULA % Array response for first subcarrier wts = mFrf.'*squeeze(v(1,:,:)); pattern(txarray,prm.fc,-180:180,-90:90,'Type','efield', ... 'Weights',wts(:,1),'PropagationSpeed',prm.cLight); end prm.numSTS = numSTS; % revert back for data transmission
Для широкополосной смоделированной системы OFDM, аналоговые веса, mFrf
, усредненные веса по нескольким поднесущим. Диаграмма направленности массивов показывает отличные потоки данных, представленные более сильными лепестками. Эти лепестки указывают на распространение или отделимость, достигнутую beamforming. Введение в Гибридный пример Beamforming сравнивает шаблоны, осознанные оптимальным, полностью цифровым подходом, с понятыми от выбранного гибридного подхода, для однопользовательской системы.
Пример демонстрирует архитектуру, где каждый поток данных сопоставляет с отдельной цепью RF, и каждый антенный элемент соединяется с каждой цепью RF. Это показывают в следующей схеме.
Затем мы конфигурируем передатчик данных системы. Эта обработка включает кодирование канала, побитовое отображение, чтобы объединить символы, разделение отдельного потока данных к нескольким потокам передачи, основополосному предварительному кодированию потоков передачи, модуляции OFDM с экспериментальным отображением и аналогом RF beamforming для всех используемых антенн передачи.
% Convolutional encoder encoder = comm.ConvolutionalEncoder( ... 'TrellisStructure',poly2trellis(7,[133 171 165]), ... 'TerminationMethod','Terminated'); txDataBits = cell(prm.numUsers, 1); gridData = complex(zeros(prm.numCarriers,prm.numDataSymbols,numSTS)); for uIdx = 1:prm.numUsers % Generate mapped symbols from bits per user txDataBits{uIdx} = randi([0,1],prm.numFrmBits(uIdx),1); encodedBits = encoder(txDataBits{uIdx}); % Bits to QAM symbol mapping mappedSym = qammod(encodedBits,prm.modMode,'InputType','bit', ... 'UnitAveragePower',true); % Map to layers: per user, per symbol, per data stream stsIdx = sum(numSTSVec(1:(uIdx-1)))+(1:numSTSVec(uIdx)); gridData(:,:,stsIdx) = reshape(mappedSym,prm.numCarriers, ... prm.numDataSymbols,numSTSVec(uIdx)); end % Apply precoding weights to the subcarriers, assuming perfect feedback preData = complex(zeros(prm.numCarriers,prm.numDataSymbols,numSTS)); for symIdx = 1:prm.numDataSymbols for carrIdx = 1:prm.numCarriers Q = squeeze(v(carrIdx,:,:)); normQ = Q * sqrt(numTx)/norm(Q,'fro'); preData(carrIdx,symIdx,:) = squeeze(gridData(carrIdx,symIdx,:)).' ... * normQ; end end % Multi-antenna pilots pilots = helperGenPilots(prm.numDataSymbols,numSTS); % OFDM modulation of the data txOFDM = ofdmmod(preData,prm.FFTLength,prm.CyclicPrefixLength,... prm.NullCarrierIndices,prm.PilotCarrierIndices,pilots); % scale power for used sub-carriers txOFDM = txOFDM * (prm.FFTLength/ ... sqrt((prm.FFTLength-length(prm.NullCarrierIndices)))); % Generate preamble with the feedback weights and prepend to data preambleSigD = helperGenPreamble(prm,v); txSigSTS = [preambleSigD;txOFDM]; % RF beamforming: Apply Frf to the digital signal % Each antenna element is connected to each data stream txSig = txSigSTS*mFrf;
Для выбранной, полностью связанной архитектуры RF каждый антенный элемент использует prm.numSTS
фазовращатели, как дано отдельными столбцами mFrf
матрица.
Обработку для передачи данных и смоделированный прием показывают ниже.
Пример предлагает опцию для пространственного канала MIMO и более простого статически-плоского канала MIMO в целях валидации.
Рассеивающаяся модель использует приближение трассировки лучей одно возврата с параметрическим количеством рассеивателей. В данном примере номер рассеивателей определяется к 100. 'Рассеивающаяся' опция моделирует рассеиватели, помещенные случайным образом в сфере вокруг приемника, похожего на модель [6] с одним звонком.
Модели канала позволяют моделирование потери пути и и угол обзора (LOS) и условия распространения не-LOS. Пример принимает распространение не-LOS и изотропные шаблоны антенного элемента с линейной или прямоугольной геометрией.
% Apply a spatially defined channel to the transmit signal
[rxSig,chanDelay] = helperApplyMUChannel(txSig,prm,spLoss,preambleSig);
Тот же канал используется и для звучания и для передачи данных. Передача данных имеет более долгую длительность и управляется количеством параметра символов данных, prm.numDataSymbols
. Эволюция канала между звучанием и этапами передачи моделируется путем предварительного ожидания сигнала преамбулы к сигналу данных. Начала преамбулы канал к допустимому состоянию для передачи данных, и проигнорированы от канала выход.
Для многопользовательской системы моделируются независимые каналы на пользователя.
Приемник, смоделированный на пользователя, компенсирует ущерб пути от усиления и добавляет тепловой шум. Как передатчик, приемник, используемый в системе MIMO-OFDM, содержит много этапов включая демодуляцию OFDM, эквализацию MIMO, QAM demapping, и декодирование канала.
hfig = figure('Name','Equalized symbol constellation per stream'); scFact = ((prm.FFTLength-length(prm.NullCarrierIndices))... /prm.FFTLength^2)/numTx; nVar = noisepow(prm.chanSRate,prm.NFig,290)/scFact; decoder = comm.ViterbiDecoder('InputFormat','Unquantized', ... 'TrellisStructure',poly2trellis(7, [133 171 165]), ... 'TerminationMethod','Terminated','OutputDataType','double'); for uIdx = 1:prm.numUsers stsU = numSTSVec(uIdx); stsIdx = sum(numSTSVec(1:(uIdx-1)))+(1:stsU); % Front-end amplifier gain and thermal noise rxPreAmp = phased.ReceiverPreamp( ... 'Gain',spLoss(uIdx), ... % account for path loss 'NoiseFigure',prm.NFig,'ReferenceTemperature',290, ... 'SampleRate',prm.chanSRate); rxSigAmp = rxPreAmp(rxSig{uIdx}); % Scale power for occupied sub-carriers rxSigAmp = rxSigAmp*(sqrt(prm.FFTLength-length(prm.NullCarrierIndices)) ... /prm.FFTLength); % OFDM demodulation rxOFDM = ofdmdemod(rxSigAmp(chanDelay(uIdx)+1: ... end-(prm.numPadZeros-chanDelay(uIdx)),:),prm.FFTLength, ... prm.CyclicPrefixLength,prm.CyclicPrefixLength, ... prm.NullCarrierIndices,prm.PilotCarrierIndices); % Channel estimation from the mapped preamble hD = helperMIMOChannelEstimate(rxOFDM(:,1:numSTS,:),prm); % MIMO equalization % Index into streams for the user of interest [rxEq,CSI] = helperMIMOEqualize(rxOFDM(:,numSTS+1:end,:),hD(:,stsIdx,:)); % Soft demodulation rxSymbs = rxEq(:)/sqrt(numTx); rxLLRBits = qamdemod(rxSymbs,prm.modMode,'UnitAveragePower',true, ... 'OutputType','approxllr','NoiseVariance',nVar); % Apply CSI prior to decoding rxLLRtmp = reshape(rxLLRBits,prm.bitsPerSubCarrier,[], ... prm.numDataSymbols,stsU); csitmp = reshape(CSI,1,[],1,numSTSVec(uIdx)); rxScaledLLR = rxLLRtmp.*csitmp; % Soft-input channel decoding rxDecoded = decoder(rxScaledLLR(:)); % Decoded received bits rxBits = rxDecoded(1:prm.numFrmBits(uIdx)); % Plot equalized symbols for all streams per user scaler = ceil(max(abs([real(rxSymbs(:)); imag(rxSymbs(:))]))); for i = 1:stsU subplot(prm.numUsers, max(numSTSVec), (uIdx-1)*max(numSTSVec)+i); plot(reshape(rxEq(:,:,i)/sqrt(numTx), [], 1), '.'); axis square xlim(gca,[-scaler scaler]); ylim(gca,[-scaler scaler]); title(['U ' num2str(uIdx) ', DS ' num2str(i)]); grid on; end % Compute and display the EVM evm = comm.EVM('Normalization','Average constellation power', ... 'ReferenceSignalSource','Estimated from reference constellation', ... 'ReferenceConstellation', ... qammod((0:prm.modMode-1)',prm.modMode,'UnitAveragePower',1)); rmsEVM = evm(rxSymbs); disp(['User ' num2str(uIdx)]); disp([' RMS EVM (%) = ' num2str(rmsEVM)]); % Compute and display bit error rate ber = comm.ErrorRate; measures = ber(txDataBits{uIdx},rxBits); fprintf(' BER = %.5f; No. of Bits = %d; No. of errors = %d\n', ... measures(1),measures(3),measures(2)); end
User 1 RMS EVM (%) = 0.38361 BER = 0.00000; No. of Bits = 9354; No. of errors = 0 User 2 RMS EVM (%) = 1.0311 BER = 0.00000; No. of Bits = 6234; No. of errors = 0 User 3 RMS EVM (%) = 2.1462 BER = 0.00000; No. of Bits = 3114; No. of errors = 0 User 4 RMS EVM (%) = 1.0024 BER = 0.00000; No. of Bits = 6234; No. of errors = 0
Для смоделированной системы MIMO отображенные получают созвездие компенсируемых предложений символов качественная оценка приема. Фактическая частота ошибок по битам предлагает количественной фигуре путем сравнения фактических переданных битов с полученными декодируемыми битами на пользователя.
rng(s); % restore RNG state
Пример подсвечивает использование гибрида beamforming для многопользовательских систем MIMO-OFDM. Это позволяет вам исследовать различные конфигурации системы для множества моделей канала путем изменения нескольких параметров в масштабе всей системы.
Набор конфигурируемых параметров включает количество пользователей, количество потоков данных на пользователя, количество передают/получают антенные элементы, местоположения массивов и модели канала. При корректировке этих параметров можно изучить отдельное или совместное воздействие параметров на полную систему. Как примеры, варьируйтесь:
количество пользователей, prm.numUsers
, и их соответствующие потоки данных, prm.numSTSVec
, переключаться между многопользовательскими и однопользовательскими системами, или
тип канала, prm.ChanType
, или
количество лучей, prm.nRays
, используемый для однопользовательской системы.
Исследуйте следующие функции помощника, используемые примером:
Molisch, A. F. и др. "Гибридный Beamforming для Крупного MIMO: Обзор". Журнал IEEE® Communications, Издание 55, № 9, сентябрь 2017, стр 134-141.
Ли З., С. Ен и А. Ф. Молиш. "Гибридный проект Beamforming для многопользовательского крупного нисходящего канала MIMO волны миллиметром". IEEE ICC 2016, обработка сигналов для коммуникационного симпозиума.
El Ayach, Oma, и др. "Пространственно Разреженное Предварительное кодирование в Волне Миллиметра Системы MIMO". Транзакции IEEE на Радиосвязях, Издании 13, № 3, март 2014, стр 1499-1513.
Адхикэри А., Дж. Нэм, J-Y Ан и Г. Кэр. "Соедините Пространственное Деление и Мультиплексирующий - Режим Большого массива". Транзакции IEEE на Теории информации, Издании 59, № 10, октябрь 2013, стр 6441-6463.
Спенсер К., А. Свиндлехерст, М. Хардт, "Обеспечивающие нуль Методы для Нисходящего Пространственного Мультиплексирования в Многопользовательских Каналах MIMO". Транзакции IEEE на Обработке сигналов, Издании 52, № 2, февраль 2004, стр 461-471.
Шуй, D. S. Г. Й. Фоскини, М. Дж. Гэнс и Дж. М. Кан. "Исчезающая Корреляция и ее Эффект на Способности Многоэлементных Систем Антенны". Транзакции IEEE на Коммуникациях, Издании 48, № 3, март 2000, стр 502-513.