Скачиваний:
1
Добавлен:
04.06.2024
Размер:
131.5 Кб
Скачать

Приложение а

import numpy as np

import matplotlib.pyplot as plt

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

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

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

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

KN = 3 # Коэф. теплового шума приёмника

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

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

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

t = 5*10**-4 # Время 1 слота 0.5 мс

def random_user(N):

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

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

return distance

def generate_points(N):

distances = random_user(N)

angles = np.random.uniform(0, 2 * np.pi, N)

x = distances * np.cos(angles)

y = distances * np.sin(angles)

return x, y

# Рассчет пропускной способности канала связи и объема информации, которая может быть передана АБ в слоте

def kanal(distance):

Pn = DF * T * K * KN #вычисление мощности шума

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

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) # пропускная способность канала связи

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

# Обновление объема буфера для определенного абонента

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

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

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

if check:

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

else:

buffer[number] = buffer[number] - add

if buffer[number] <= 0:

buffer[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, number, buffer):

dataSize = kanal(users)

if dataSize[number] == 0: # Если нет данных для этого абонента

return buffer # Пропускаем передачу данных, возвращаем буфер без изменений

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

return buffer

def stationUploadOptimised(users, abonent_number, buffer):

dataSize = kanal(users)

if dataSize[abonent_number] == 0:

return buffer # Передаем буфер без изменений, если нет данных для абонента

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

return buffer

# Стартовая функция

def main():

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

all_x = []

all_y = []

plt.figure(figsize=(15, 8))

for index, countAB in enumerate( [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): # Цикл по слотам

Соседние файлы в предмете Вычислительные системы, сети и телекоммуникации