Скачиваний:
0
Добавлен:
03.06.2024
Размер:
382.94 Кб
Скачать

ГУАП

КАФЕДРА № 41

ЛАБОРАТОРНАЯ РАБОТА

ЗАЩИЩЕНА С ОЦЕНКОЙ

РУКОВОДИТЕЛЬ

Старший преподаватель

Н.В. Апанасенко

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЁТ О ЛАБОРАТОРНОЙ РАБОТЕ №2

АНАЛИЗ СИСТЕМЫ МНОЖЕСТВЕННОГО ДОСТУПА С ТОПОЛОГИЕЙ ТИПА ЗВЕЗДА

по курсу: ВЫЧИСЛИТЕЛЬНЫЕ СИСТЕМЫ, СЕТИ И ТЕЛЕКОММУНИКАЦИИ

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР. №

подпись, дата

инициалы, фамилия

Санкт-Петербург

2023

Цель работы:

Получение навыков моделирования стандартных сценариев работы телекоммуникационных систем с топологией типа «звезда». Изучение свойств алгоритмов планирования ресурсов нисходящего кадра в подобных системах. Изучение стратегий распределения ресурсных блоков в централизованной сети со случайным трафиком.

Вариант 15:

Модель распространения

R, м

PTX, Вт

f0, МГц

Kn

915

ITU, office area

20

0.05

1200

4

Примеры расчетов:

  • Расчет мощности шума

Где – полоса пропускания канала связи,

T – абсолютная температура (К),

k – постоянная Больцмана ,

– коэффициент теплового шума приемника.

PN = 180 * 103 Гц * 300К * 1.38 * 10-23 Дж/К * 4 = 298,080 * 10-20 Вт

  • Расчет уровня потерь в канале связи (для конкретных АБ)

L – уровень потерь, зависит от частоты, высоты базовой станции, высоты точки приема, расстояние от абонента до базовой станции.

Где, f - Частота излучения (Гц),

d = Расстояние (м),

N = Коэффициент потери мощности от расстояния, берем из таблицы (Рисунок 1),

n = Число препятствий между БС и АБ,

Pf(n) = фактор потерь в зависимости от препятствий.

Рисунок 1 – Таблица Коэффициента N

= 20 * lg(180000) + 32 * lg(10) + 0 – 28 = 109.10545

L = 10 LdB /10

L = 10 110 /10 =

  • Расчет мощности сигнала, принятой АБ:

PRX =

  • Расчет отношение сигнал/шум:

SNR = 167,7402

  • Расчет пропускную способность канала связи:

Где – полоса пропускания канала связи, SNRi – отношение сигнал/шум (Signal-to-Noise Ratio, SNR) у абонента с индексом i

С = 180 * 103 Гц * log2(1 + 167,7402) = 1,33 * бит/с

Результаты моделирования:

В результате работы программы получились следующие графики (Рисунок 1).

Рисунок 1 – График стандартной модели и оптимизированной

Выводы:

В ходе выполнения лабораторной работы были получены навыки моделирования стандартных сценариев работы телекоммуникационных систем с топологией типа «звезда». Изучены свойства алгоритмов планирования ресурсов нисходящего кадра в подобных системах и стратегии распределения ресурсных блоков в централизованной сети со случайным трафиком.

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

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

Листинг 1 – Код программы

import numpy as np

import matplotlib.pyplot as plt

np.random.seed(3) # Зерно рандома для воспроизводимости результатов

R = 20 # Радиус работы БС (м)

Ptx = 0.05 # Мощность излучаемого сигнала (Вт)

F0 = 1200 # Частота БС (МГц)

DF = 180 * 10**3 # Полоса пропускания канала связи (Гц)

KN = 4 # Коэф. шума приёмника

K = 1.38 * 10 ** (-23) # Постоянная Больцмана

T = 300 # Абсолютная температура

# Высота используется в модели Окамура-Хата

Hbs = 30 # Высота БС

Hrx = 1.5 # Высота Абонента

V = 8 * 1024 # Объем данных содержащихся в одном пакете равный 1 кбайт

t = 5*10**-4 # Длительность одного слота 0.5 мс

def random_user(N):

# Генерация случайных велечин равномерно распределнных на радиусе

distance = np.sqrt(np.random.uniform(0, R ** 2, N)) # Дальность до абонента

return distance

# Рассчет пропускной способности канала связи

def kanal(distance):

Pn = DF * T * K * KN # Мощность шума

# ITU propagation model

# L = 20*log10(f)+N*log10(d)+Pf(n) - 28

'''

L = the total path loss. Unit: decibel (dB).

f = Frequency of transmission. Unit: megahertz(MHz).

d = Distance. Unit: meter (m).

N = The distance power loss coefficient.

n = Number of floors between the transmitter and receiver.

Pf(n) = the floor loss penetration factor.

'''

N = 32 # Коэффициент потери мощности от расстояния

Pfn = 0 # Фактор потери из-за препятствий (этажей)

Li = 20 * np.log10(F0) + N * np.log10(distance) + Pfn - 28 # Затухание сигнала по модели ITU

xik = np.random.normal(0, 1) # Случайная нормальная величина с математическим ожиданием 0 и среднеквадратическим отклонением 1

Lik = Li + xik # Затухание сигнала при распространении от БС до абонента (дБ)

Lik = 10**(Lik/10) # Перевод в Разы

Prx = Ptx / Lik # Мощность принятого сигнала

SNR = Prx / Pn # Соотношение сигнал/шум

C = DF * np.log2(1+SNR) # Cik максимальная пропускная способность

return (C*t) # Vik объем данных, который может быть передан абоненту i в слоте с индексом k

# Обновление буфера после получения или отправки

# check=True загрузка в буферы на БС

# check=False отправка абоненту

def bufferReload(add, buffer, check=False, abonent_number=None):

if check:

return [buffer[i] + add[i] for i in range(len(buffer))]

else:

buffer[abonent_number] = buffer[abonent_number] - add

if buffer[abonent_number] <= 0:

buffer[abonent_number] = 0

return buffer

# Загрузка пакетов в буферы на БС

def stationDownload(countAB, prop, buffer):

dataSize = [(np.random.geometric(prop) - 1) * V for user in range(countAB)]

buffer = bufferReload(dataSize, buffer, True)

return buffer

# Отправка пакетов абоненту

def stationUpload(users, abonent_number, buffer):

dataSize = kanal(users)

buffer = bufferReload(dataSize[abonent_number], buffer, False, abonent_number)

return buffer

def main():

lambda_array=np.arange(1, 155, 2) # Массив со значениями лямбда (начало, конец, шаг)

for countAB in [8, 16, 64]: # Цикл по количеству пользователей

buffer_all = [0 for user in range(countAB)] # Создание буфера для каждого абонента

buffer = [0 for user in range(countAB)] # Создание буфера для каждого абонента

users = random_user(countAB) # Генерация расстояний пользователй

avgBuffers = [] # Массив со средними суммарными

for lambd in lambda_array: # Цикл по интенсивности входного потока

buffer_list = [] # Массив с суммами

lambda_slot=lambd*t

prob = 1 / (lambda_slot + 1) # Вер. успеха

for slot in range(10 ** 3): # Цикл по слотам

if not slot: # Если слот первый

buffer = stationDownload(countAB, prob, buffer) # Загружаем первый поток данных на БС

buffer_list += [sum(buffer)]

continue

buffer_all = buffer

# slot%countAB определяет с каким абонентом в данном слоте ведется работа

buffer_all = stationUpload(users, (slot % countAB), buffer_all) # Отправка пакетов абоненту

buffer = stationDownload(countAB, prob, buffer_all) # Загружаем поток данных на БС

# В конце слота складываем объем данных во всех буферах

buffer_list += [sum(buffer)]

# Когда прошли все слоты, находим средний объем суммы всех буферов на текущей лямбде

avgBuffers += [np.mean(buffer_list)]

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

plt.plot(lambda_array, avgBuffers, label='N = {}'.format(countAB))

plt.ylim(0, 10 ** 7)

plt.xlabel('Интенсивность входного потока (пакетов/сек)')

plt.ylabel('Средн. суммарный объём данных в буфере (бит)')

plt.legend(loc='upper left')

#plt.show()

def main_optimised():

lambda_array=np.arange(1, 145, 2) # Массив со значениями лямбда (начало, конец, шаг)

for countAB in [8, 16, 64]: # Цикл по количеству пользователей

buffer_all = [0 for user in range(countAB)] # Создание буфера для каждого абонента

buffer = [0 for user in range(countAB)] # Создание буфера для каждого абонента

users = random_user(countAB) # Генерация расстояний пользователй

avgBuffers = [] # Массив со средними суммарными

for lambd in lambda_array: # Цикл по интенсивности входного потока

buffer_list = [] # Массив с суммами

lambda_slot = lambd * t

prob = 1 / (lambda_slot + 1) # Вер. успеха

reciever=0 # Принимающий абонент

for slot in range(10 ** 3): # Цикл по слотам

if not slot: # Если слот первый

buffer = stationDownload(countAB, prob, buffer) # Загружаем первый поток данных на БС

buffer_list += [sum(buffer)]

continue

buffer_all = buffer

# Проверяем есть ли данные для передачи а+боненту с индексом reciever

if buffer_all[reciever] == 0:

next_receiver = (reciever + 1) % countAB # Находим следующего абонента для передачи

while next_receiver != reciever: # Пока не вернемся к начальному абоненту

if buffer_all[next_receiver] != 0: # Если у абонента есть данные

break # Прерываем цикл, нашли следующего абонента для передачи

next_receiver = (next_receiver + 1) % countAB # Переходим к следующему абоненту

reciever = next_receiver # Обновляем получателя на найденного абонента

buffer_all = stationUpload(users, reciever, buffer_all) # Отправка пакетов абоненту

buffer = stationDownload(countAB, prob, buffer_all) # Загружаем поток данных на БС

reciever+=1 # Переход на следующего пользователя

if reciever>countAB-1:

reciever=0 # Если мы вышли на N+1, то работаем с нулевым абонентом

# В конце слота складываем объем данных во всех буферах

buffer_list += [sum(buffer)]

# Когда прошли все слоты, находим средний объем суммы всех буферов на текущей лямбде

avgBuffers += [np.mean(buffer_list)]

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

plt.plot(lambda_array, avgBuffers, label='Оптимизированный N = {}'.format(countAB))

plt.ylim(0, 10 ** 7)

plt.grid()

plt.legend(loc='upper left')

plt.show()

main()

main_optimised()