
вычсист2
.docxГУАП
КАФЕДРА № 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()