Целью данного курсового проекта является проектирование радиосети предназначенной для беспроводного сбора данных с подвижных объектов в процессе их движения по определенному маршруту. 

Основные требования к системе:

Точки доступа располагаются вдоль трассы предполагаемого движения подвижного объекта и обеспечивают получение оперативных данных с датчиков, расположенных на подвижных объектах. 

Исходные данные к проекту:

Радиус зоны радиопокрытия терминала: 200м

Вероятность ошибки на бит Pb: 3*10-6 

Мощность излучения подвижной станции Ризл : < 150 мВт

Тип CRC: CRC-8 

PR: 95%

 

1.7. Построение результирующих иерархических моделей терминала и выделенных узлов сети (в соответствии с концепцией OSI) с отражением путей доставки служебных, так и информационных сообщений.

    Модель OSI описывает схему взаимодействия сетевых объектов, определяет перечень задач и правила передачи данных. Ее можно представить следующим образом (рисунок 1):


Рис.1 - Модель OSI

Подробно рассмотрим физический уровень модели OSI. Это нижний уровень модели, необходимый для непосредственной передачи потока данных.

К Основный задачам, выполняемым на физическом уровне, относится сформирование необходимого для L2 уровня количество/тип ФК и обеспечение достоверной доставки битов по назначению.

Для выполнения задачи достоверной доставки применяются меры:

·         синхронизация;

·         помехоустойчивое кодирование;

·         модуляция;

·         применение технологии OFDM;

·         эквалайзинг.

Ниже представлена результирующая иерархическая модель сети в соответствии с концепцией OSI.

 

Рис.2- Иерархическая модель системы

 

Физический уровень – нижний уровень модели OSI. Обеспечивает установление и управление физическим каналом. Реализует механические, электрические, функциональные и процедурные аспекты взаимодействия двух сетевых устройств. Основной задачей ФУ является надежная передача потока битов, поступающего с верхнего (канального уровня). На физическом уровне могут быть реализованы любые технические решения, направленные на повышение достоверности приема битов. Для эффективной реализации поставленных задач необходимо оптимальным образом подобрать параметры функционирования системы связи на физическом уровне.

 

    Канальный уровень определяет функции, отвечающие за организацию канала передачи данных. Канальный уровень необходим для осуществления надежной доставки пакетов между узлами сети. На канальном уровне решаются следующие задачи: формирование пакетов, выделение пакетов из потока бит, организация доступа к физическому каналу связи, проверка целостности пакетов, адресация сообщений, пакетная синхронизация.

 

    Уровень принятия решений является управляющим ядром узла сети. Он обрабатывает  данные полученные с нижних уровней и принимает решения на основе анализа этих данных. Например, он обрабатывает данные радиоизмерений и передает на физический уровень команды о выборе профиля передачи и регулировки мощности. А так же, на ряду с пользовательским устройством, он может являться источником служебных сообщений.

 

            С уровня принятия решений на физический уровень поступают результаты радиоизмерений (профиль передачи и мощность излучения) и информация о том, по какому каналу будет происходить передача. От канального уровня на физический поступают пакеты L2. Пакеты L2 проходят через следующие процедуры: канальное кодирование, квадратурная модуляция, OFDM-модуляция и образуется информационное поле сообщения физического уровня. 

             На основе профиля передачи, типа сообщения, извлеченного из первого пакета L2, формируется служебное поле. Служебное и информационное поля объединяются с заранее сформированной (а так же записанной в память, поскольку она всегда имеет одинаковый вид) преамбулой и образуют полное сообщение физического уровня. Оно усиливается до необходимого уровня и излучается в радиоканал.

               На приемной стороне происходят аналогичные преобразования, которые так же отображены на рисунке1.
  

              Для физического уровня разделения на служебные сообщения и сообщения трафика не существует, принятые сообщения будут подвергаться одинаковым преобразованиям.

 

2. Экспериментальная часть. Разработка и экспериментальное исследование программной модели канала передачи данных

 

2.1. Разработка и описание блок-схемы алгоритма модели

 

На рисунке 3 и рисунке 4 отображены  блок схемы алгоритмов передающей и приемной части системы, на основании алгоритмов , проработанных во второй части (физический уровень).


Рис.3- Блок схема передающей части модели


Рис.4- Блок схема приемной части модели

Передающая часть модели.

В первую очередь определяются параметры профиля передачи, таких как: мощность передачи, тип модуляции и др. затем формируется служебное поле, выбирается вид модуляции в зависимости от помеховой обстановки и кодирование служебного поля. Служебное поле всегда модулируется BPSK в пользу защищенности.

После того как служебное поле закодировано начинается цикл канального кодирования каждого L2 пакета и их накопление для последующих преобразований.

Далее символы OFDM проверяется на полноту и если символы не полные, то они дополняются случайными битами (вариант с заполнением нулями или единицами повлияет на работу и эффективность FEC не с лучшей стороны) .  После этого происходит квадратурная модуляция, которая выбирается в зависимости от флага (если флаг равен нулю, то BPSK модуляция, если нет - QAM16), и цикл сборки OFDM символов. Информация о количестве OFDM символов передается с первым символом.

Дальше служебное и информационное поля объединяются, формируется преамбула и происходит сборка сообщения L1 уровня.

 

Приемная часть модели.

При приеме сообщения сначала происходят определение преамбулы, первичные радиоизмерения и выделение полей сообщения и преамбулы.

Затем происходит квадратурная демодуляция и канальное декодирование служебного поля  и извлечение из него информации о профиле передачи и типе сообщения.

Потом  начинается цикл чтения OFDM- символов и извлечение из них пилот сигналов, настройка фильтра эквалайзера и формирование потока данных из поднесущих.

Сформировав поток данных осуществляется квадратурная демодуляция ( если значение флага: 0- BPSK , 1- QAM-16), определение СКО и, наконец, происходит сравнение длины информационного поля на передающей и приемной стороне (FEC).  Возможны несколько исходов: если длина поля больше - лишние биты убираются, если длина поля меньше - устанавливается флаг об ошибке, если длина соответствует - начинается дальнейшая обработка сообщения.

При обнаружении ошибки - происходит оповещение КУ, если же ошибки не обнаружены - начинается цикл чтения пакетов L2 и их декодирование.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Листинг №1 функции физического уровня





function [ L2_msgs_rcv msgType_rcv msgCount_rcv sigPower maxSKO errorFlag ] = phy_lvl( L2_msgs, msgCount, mProfile, SN, img, rMeasureFlag )

% L2_msgs - пакеты L2

% msgCount - количество передаваемых пакетов L2

% mProfile - профиль передачи 0 - BPSK,  1 - QAM-16

% SN - ОСШ в КС, SN = 0 - моделирование прохождения через КС отключено

% img - показ графиков, 0 - выкл. 1 - вкл.

% rMeasure - вывод в консоль данных радиоизмерений на ФУ, 0 - выкл. 1 - вкл.



%== Физический уровень передатчика ==%

    global noninfSubcarriers;

    global Nc;

    global ampPilot;

    trell = poly2trellis( 8, [255 148 ] );

    errorFlag = 0;

% Список не информационных поднесущих в OFDM-символе

    noninfSubcarriers = [ 1 2 6 13 20 27 31 31];

% Размерность OFDM-символа

    Nc = 32;

% Определяем тип пакетов L2

    if all( L2_msgs( 6:9 ) == [ 0 0 0 0 ] )

        msgType = 0;

    else

        msgType = 1;

    end

    

%% Формирование служебного поля

% Выбор типа модуляции для служебного символа 

    mParam = modem.pskmod( 2 );

    mParam.inputtype = 'bit';

    mParam.SymbolOrder = 'gray';

    mParam.PhaseOffset = 0;

% Формирование служебного символа

    serviceMsg = zeros( 1, Nc );

% Информация о виде модуляции

    serviceMsg( 1 ) = mProfile;

% Информация о типе сообщения

    serviceMsg( 2 ) = msgType;         

% Кол-во пакетов в сообщении

    msgLength = dec2bin( msgCount, 8 );

    for i = 1:8

        serviceMsg( 2 + i ) = str2num( msgLength( i ) );

    end

% Помехоустойчивое кодирование

    serviceMsg_c = convenc( serviceMsg, trell );


    serviceMsg_cai = randintrlv( serviceMsg_c, 534 );

% Квадратурная модуляция

    IQ_service = modulate( mParam, serviceMsg_cai' );

% Формирование OFDM символа

    symbol = ifft( IQ_service );

    ofdmFrame = [ symbol' ];

    

%% Определение профиля передачи

    if mProfile == 0

        mPos = 2;

        mParam = modem.pskmod( mPos );

        ampPreamb_short = 0.75; % КУ усиления для выравнивания уровня преамбулы к данным

        ampPreamb_long = 1; % КУ усиления для выравнивания уровня преамбулы к данным

        ampPilot = 2; % КУ для пилот сигнала

    else

        mPos = 16;

        mParam = modem.qammod( mPos );

        ampPreamb_short = 5; % КУ усиления для выравнивания уровня преамбулы к данным

        ampPreamb_long = 5; % КУ усиления для выравнивания уровня преамбулы к данным

        ampPilot = 7; % КУ для пилот сигнала

    end;

        

%% Работа над пакетами L2

% Определяем размер пакета L2 исходя из его типа

    if msgType == 1

        packLength = 54;

    else

        packLength = 26;

    end

    

    L2_msgs_cai = [];

    for pack = 1:msgCount

        packStart = ( pack - 1 ) * packLength + 1;

        L2_msg = L2_msgs( packStart:( packStart +  packLength - 1) );

    

%% Канальное кодирование

% Помехоустойчивое кодирование

       L2_msg_c = convenc( L2_msg, trell );

       L2_msg_cai = L2_msg_c;

       L2_msgs_cai =L2_msg_cai ;

    end



%% Модуляция (квадратурная и OFDM)  

% Размер передаваемого сообщения

    L2_msg_length = length( L2_msgs_cai );

% Количество поднесущих с информацией

    Nc_data = Nc - length( noninfSubcarriers ); % 50 поднесущих

% Количество бит на OFDM-символ

    symbolLength = Nc_data * log2( mPos );

% Требуемое количество OFDM-символов

    symbolCounter = ceil( L2_msg_length / symbolLength );

% Формирование блока незначащих битов

    symbolGarbage = zeros( 1, symbolCounter * symbolLength - L2_msg_length );   

% Cообщение канального уровня

    data = L2_msgs_cai;

% Выбор модуляции

    mParam.inputtype = 'bit';

    mParam.SymbolOrder = 'gray';

    mParam.PhaseOffset = 0;

% Добавление незначащих битов

    if ( symbolCounter - L2_msg_length / symbolLength ) == 0

        data = [ data ]';

    else

        data = [ data symbolGarbage ]';

    end

% Квадратурная модуляция

    IQ_signal = modulate( mParam, data );

% Формирование OFDM-символов и добавление служебного символа

    [ mof, OS, OSf, OSp ] = makeOfdmFrame( IQ_signal, symbolCounter );

    ofdmFrame = [ ofdmFrame mof ];

    

%% Формирование символов преамбулы

% Короткий символ преамбулы

    Preamb_shortline = sqrt( 13 / 6 )*[ 0 0 1+j 0 0 0 -1-j 0 0 0 1+j 0 0 0 -1-j 0 0 0 -1-j 0 0 0 1+j 0 0 0 0 0 0 -1-j 0 0 0 -1-j 0 0 0 ...

        1+j 0 0 0 1+j 0 0 0 1+j 0 0 0 1+j 0 0 ];   

    Preamb_shortSymb = ifft( Preamb_shortline );

% Выделение первых 16 отсчетов

    short = Preamb_shortSymb( 1:16 );

% Формирование 10 коротких символов преамбулы на основе выбранного набора

    Preamb_shortComplete = [ short short short short short short short short short short ];

% Длинный символ преамбулы

    Preamb_longline = [ 0 0 0 0 0 0 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 ...

        1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 1 1 1 0 0 0 0 0 0 ];

    Preamb_longSymb = ifft( Preamb_longline );

    Preamb_longComplete = [ Preamb_longSymb( 32 - 2 * 16 + 1:32 ) Preamb_longSymb Preamb_longSymb ];

% Окончательная сборка преамбулы (усиление чтобы выровнить уровень к уровню данных)

    Preamb_Full = [ ampPreamb_short * Preamb_shortComplete ampPreamb_long * Preamb_longComplete ];

    

 %% Сборка сообщения физического уровня

    l1Frame = [ Preamb_Full ofdmFrame ];



    if img == 1

        figure( 1 );

        plot( abs( l1Frame ) );

        grid on

        title( 'Временная реализация сообщения физического уровня' )

    end;

 

%% Задержка сигнала на псевдослучайное кол-во отсчетов (от 0 до 200)

    l1Frame_delay = [ zeros( 1, randi( 200 ) ) l1Frame ];    

    

%% AWGN-канал

    if SN ~= 0

        l1Frame_rcv = awgn( l1Frame_delay, SN, 'measured' );

    else

        l1Frame_rcv = l1Frame_delay;

    end    

    

%== Физический уровень приемника ==%

%% Синхронизация

% Подготовка окна    

    sync_rcv = zeros(1, length( l1Frame_rcv ) - length( Preamb_Full ) );

% Сдвиг и расчет СКО

    for i = 1: ( length( l1Frame_rcv ) - length( Preamb_Full ) )

       searchBlock = l1Frame_rcv( i: ( i - 1 + length( Preamb_Full ) ) );

       sync_rcv(i) = sum( abs( searchBlock - Preamb_Full).^2 );

    end

% Нахождение минимума СКО и соответственно, начала преамбулы  

    [ SKO_min Preamb_Start_rcv ] = min( sync_rcv );

% Определение окончания преамбулы   

    Preamb_End_rcv = Preamb_Start_rcv + length( Preamb_Full );



% Отображение графика    

    if img == 1

        figure( 4 );

        plot( sync_rcv );

        grid on

        title( 'СКО между двумя блоками: скользящим окном и преамбулой' )

    end;



% Измерение мощности принятого сигнала

    sig = l1Frame_rcv( Preamb_Start_rcv:end );

    sigPower = sum(abs(sig(:)).^2)/length(sig(:));

    if rMeasureFlag == 1

        display( 'Мощность принятого сигнала:' )

        disp( sigPower );

    end

    

%% Выделение полей

% Выделение преамбулы, сервисного поля и поля данных

    Preamb_Full_rcv = l1Frame_rcv( Preamb_Start_rcv:Preamb_End_rcv );

    symbol_rcv = l1Frame_rcv( ( Preamb_End_rcv ):( Preamb_End_rcv + 32 - 1 ) );

    ofdmFrame_rcv =  l1Frame_rcv( ( Preamb_End_rcv + 32 ):end );

    IQ_service_rcv = fft( symbol_rcv' );



%% Демодуляция

% Настройка вида модуляции сервисного поля 

    mParam = modem.pskdemod( 2 );

    mParam.SymbolOrder = 'gray';

    mParam.PhaseOffset = 0;

    mParam.OutputType = 'bit';

% Демодуляция сервисного поля

    serviceMsg_cai_rcv = demodulate( mParam, IQ_service_rcv );

    serviceMsg_c_rcv = serviceMsg_cai_rcv;

% Декодирование по Витерби

    serviceMsg_rcv = vitdec( serviceMsg_c_rcv, trell, 7, 'cont', 'hard' );

% Определение профиля передачи

    mProfile_rcv = serviceMsg_rcv( 8 );

% Определение типа принятого сообщения

    msgType_rcv = serviceMsg_rcv( 9 );

% Определение длинны принятого сообщения

    for i = 1:6

        msgLength_rcv( i ) = num2str( serviceMsg_rcv( 9 + i ) );

    end

    msgCount_rcv = bin2dec( msgLength_rcv );

% Если количество принятых сообщений получилось равным 0, считаем что оно

% равно 1. В этом случае уже ясно, что сообщение принято не верно

% (сообщение есть, а пакетов в нем ноль? - абсурд), однако возможно

% "угадать" количество пакетов L2. Если не угадаем у КУ не сойдется

% контрольная сумма и он все равно сделает вывод о том что сообщение

% принято неверно.

    if msgCount_rcv == 0

        msgCount_rcv = 1;

    end

    

% Определение профиля передачи поля данных

    if mProfile_rcv == 1

        mPos_rcv = 16;

        mParam = modem.qamdemod( mPos_rcv );

    else

        mPos_rcv = 2;

        mParam = modem.pskdemod( mPos_rcv );

    end;

    mParam.SymbolOrder = 'gray';

    mParam.PhaseOffset = 0;

    mParam.OutputType = 'bit';

    

% Определение типа сообщения

    if msgType_rcv == 1

       packLength_rcv = 54;

    else

       packLength_rcv = 26;

    end    

    

% Выполняем выделение OFDM символов из общего потока

    IQ_signal_rcv = [];

% Список поднесущих с информацией

    infSubcarriers = [ 3:5 7:12 14:19 21:26 29:30 ];

    pilotSubcarriers = [6 13 20 27];

    equSubcarrLine = 1:32;

    OSr = [];

    OSpr = [];

    for i = 0:( length( ofdmFrame_rcv ) / 68 ) - 1    

        IQ_sig = ofdmFrame_rcv( ( 5:68 ) + i * 68 ); % Удаление префикса

        OSr = [ OSr; IQ_sig ];   

        IQ_sign = fft( IQ_sig ); % Переход к частотной области

        pilot_rcv = IQ_sign( pilotSubcarriers ); % Выделение пилот-сигналов

        pilot_rcv( 1 ) = pilot_rcv( 2 ); % Дублирование крайних пилот сигналов на "концы" символа

        pilot_rcv( 6) = pilot_rcv( 13 );

        equInterpol = interp1( pilotSubcarriers, abs( pilot_rcv ), equSubcarrLine, 'pchip' ); % Интерполяция АЧХ канала

        OSpr = [ OSpr; IQ_sign ];

        IQ_sign_equalazied = IQ_sign ./ ( equInterpol ./ ampPilot ); % Непосредственно эквалайзер

        IQ_signal_rcv = [ IQ_signal_rcv IQ_sign_equalazied( infSubcarriers ) ]; % Формирование потока данных

    end;

% Квадратурная демодуляция закодированного и перемеженного пакета L2

    data_rcv = demodulate( mParam, IQ_signal_rcv );

% Определяем максимальное СКО среди IQ-символов

    [ maxSKO ] = IQ_maxSKO( IQ_signal_rcv, data_rcv, mPos_rcv );

    if rMeasureFlag == 1

        display( 'Максимальное СКО среди символов СКС принятого сигнала:' )

        disp( maxSKO );

    end

% Убираем лишние биты. Лишние биты появляются в двух случаях:

% 1) Их специально добавили на этапе передачи для полного

%    заполнения OFDM-символа;

% 2) Возникла ошибка в приеме полей типа, модуляции или длинны сообщения

%    в этом случае не совпадает фактическая и ожидаемая длинна принятого

%    информационного поля и если эти значения не уравнять возникнет ошибка

%    на этапе канального декодирования.

% Рассчитываем ожидаемую длинну информационного поля

    infoLength_rcv = ( packLength_rcv * msgCount_rcv );

% Рассчитываем фактически принятую длинну информационного поля

    data_size_rcv = size( data_rcv );

    dataLength_rcv = data_size_rcv( 1 ) * data_size_rcv( 2 );

% Если фактическая больше - уравниваем путем удаления лишнего.    

    if infoLength_rcv < dataLength_rcv

        for i =  dataLength_rcv:-1:( infoLength_rcv + 1 )

           data_rcv( i ) = []; 

        end

% Если фактическая меньше - критическая ошибка. В программной модели она

% может наступить только в случае не правильного приема служебного поля,

% на практике, только в случае неисправности в радиоинтерфейсе т.к.

% в других случае, если ожидаемая длинна на приемнике окажется больше чем

% переданная отправителем, приемник будет принимать шумы радиоканала

    elseif infoLength_rcv > dataLength_rcv

        errorFlag = 1;

    end

    

%% Отображение интерполированной АЧХ КС

    if img == 1

        figure( 2 );

        plot( equInterpol ./ ampPilot, 'r' );

        grid on

        title( 'Интерполированная АЧХ канала связи  номерах поднесущих)' )

    

%% Отображение СКС

        figure( 3 );

        plot( IQ_signal_rcv, 'x' );

        grid on

        title( 'Сигнально-кодовое созвездие принятого сигнала' )

    end;

    

%% Канальное декодирование

    L2_msgs_rcv = [];   

% Если во время приема физический уровень обнаружил критическую ошибку

% которая не позволит ему произвести декодирование, он выдает на КУ

% пустой пакет трафика L2 и соответствующий поднятый флаг errorFlag

    if errorFlag == 0

        for pack = 1:msgCount_rcv


            packStart = ( pack - 1 ) * packLength_rcv + 1;

            L2_msg_cai_rcv = data_rcv( packStart:( packStart +  packLength_rcv - 1) );


            L2_msg_c_rcv = randdeintrlv( L2_msg_cai_rcv, 534 );

% Декодирование по Витерби

            L2_msg_rcv = vitdec( L2_msg_c_rcv, trell, 7, 'cont', 'hard' );

            L2_msgs_rcv = [ L2_msgs_rcv L2_msg_rcv ];

        end

    else

        L2_msgs_rcv = zeros( 1, 256 ); % "мусор"

        msgType_rcv = 0;

        msgCount_rcv = 1; 

    end



end

 

Рис.5 – Временная диаграмма сообщения физического уровня


Рис. 6- Временные реализации пакетов физического уровня для BPSK


Рис. 7- Временные реализации пакетов физического уровня для QAM-16

 

2.3 Исследование процедуры тактовой (символьной) синхронизации физического уровня.

 

 В ходе моделирования прохождения сигнала по каналу связи приемная часть не знает точного времени прихода OFDM-сигнала. Процесс синхронизации в коде модели представляет собой процесс обнаружения OFDM-сигнала с помощью скользящего по сигналу окна размером 320 отсчетов (как и преамбула) и последующего определения минимума СКО между окном и преамбулой

        Сначала составляется массив всех окон принятого сигнала длинной 320 отсчетов (длинна преамбулы). Для каждого элемента этого массива находится СКО двух блоков: окна и преамбулы. Потом из полученной выборки находится наименьшее значение СКО рисунок 10, свидетельствующее о полном приеме преамбулы в окне с началом в точке минимума - следовательно, отложив от этой точки 320 отсчетов можно найти начало служебного, а значит и информационного поля сообщения.

 

Листинг №2

%% Синхронизация

% Подготовка окна    

    sync_rcv = zeros(1, length( l1Frame_rcv ) - length( Preamb_Full ) );

% Сдвиг и расчет СКО

    for i = 1: ( length( l1Frame_rcv ) - length( Preamb_Full ) )

       searchBlock = l1Frame_rcv( i: ( i - 1 + length( Preamb_Full ) ) );

       sync_rcv(i) = sum( abs( searchBlock - Preamb_Full).^2 );

    end

% Нахождение минимума СКО и соответственно, начала преамбулы  

    [ SKO_min Preamb_Start_rcv ] = min( sync_rcv );

% Определение окончания преамбулы   

    Preamb_End_rcv = Preamb_Start_rcv + length( Preamb_Full );



% Отображение графика    

    if img == 1

        figure( 4 );

        plot( sync_rcv );

        grid on

        title( 'СКО между двумя блоками: скользящим окном и преамбулой' )

    end

 

Рис.8- минимумы СКО

 

2.4. Исследование качества приема сообщений по различным каналам связи.

Для исследования прохождения сообщения по каналу связи в программном модуле присутствует возможность включения моделирования AWGN-канала.  

   Пронаблюдаем прохождения сообщения по каналу связи для различных условий в канале. При ОСШ = 20 дБ рисунок 9 и рисунок 10 сообщения приняты правильно при обоих профилях передачи.  

 

Рис. 9- Сигнально-кодовое созвездие для BPSK модуляции


Рис. 10-Сигнально-кодовое созвездие для QAM-16 модуляции

 

 

Рис.11 - СКС принятого сигнала при ОСШ = 4 дБ и модуляции BPSK

 

Рис.12- СКС принятого сигнала при ОСШ = 11 дБ и модуляции QAM-16

 

 

 

 

Список используемой литературы:

1.Бакке А. В. "Лекции по курсу: Системы и сети связи с подвижными объектами"

2. http://omoled.ru/publications/view/840

3. http://omoled.ru/publications/view/1057

4.http://omoled.ru/publications/view/848

5. http://omoled.ru/publications/view/850

6. http://omoled.ru/publications/view/996

7. Методические указания к лаб. работе по спецификации 802.11а

 8. http://omoled.ru/publications/view/995