Классы передатчиков и приёмников



В зависимости от варианта задания модель системы связи в курсовом проекте может содержать на передающей стороне не отдельные модулятор и усилитель, а передатчик, как единый блок, что и показано на рисунке 1. То же самое справедливо и для приёмника. При проектировании классов передатчика и приёмника можно использовать тот же подход, что и для класса канала, т.е. класс, например, передатчика будет производным от классов соответствующего заданию модулятора и усилителя (файл transmitter.h):

#ifndef TRANSMITTER

#define TRANSMITTER

 

#include "am.h"

#include "tamplifier.h"

 

class Transmitter: public AM, public TAmplifier

{

public:

Transmitter(int i, int c, int L, float k):AM(i,c,L),TAmplifier(i,k){}

TSignal Execute(TMessage&);

};

#endif

В определении класса видно взаимодействие между конструкторами базовых и производного классов. В функции Execute класса Transmitter в этом случае будут просто вызываться такие же функции базовых классов (файл transmitter.cpp):

#include "transmitter.h"

TSignal Transmitter::Execute(TMessage& obj)

{

TAmplifier::Execute(obj);

return AM::Execute(obj);

}

Класс приёмника может быть производным от классов фильтров (одного или нескольких разных), детектора и усилителя. Рекомендуется выполнить его разработку самостоятельно.

 

Класс звена списка

Для тех вариантов, в которых система связи представляется в виде односвязного линейного списка входящих в неё устройств, требуется разработать класс звена списка. Этот же класс будет представлять и список в целом. Такой класс будет представлять собой обычный тип данных, описывающий звено односвязного списка, подобный типам данных, рассмотренных в курсе ”Алгоритмы и структуры данных”. В качестве ”полезных” данных будем использовать указатель на базовый для всех устройств класс, т.е. TDevice, по тем же причинам, что и для класса коммутатора. Набор функций можно ограничить функцией добавления нового звена и функцией прохождения по всему списку с вызовом для каждого звена виртуальной функции Execute (при этом будет имитироваться прохождение сигнала по линии связи). Остальные функции работы со списком (удаление звена, поиск, сортировка) не являются необходимыми и их разработка оставляется на усмотрение студентов.

#ifndef LINK

#define LINK

 

#include "tdevice.h"

#include "tsignal.h"

 

class Link

{

TDevice* Ustr;

Link* next;

public:

void Insert(TDevice*); // добавление нового звена

TSignal Process(TMessage&); // обработка всего списка

Link() { Ustr=NULL; next=NULL; }

Link(TSignal& obj):Signal(obj) { Ustr=NULL; next=NULL; }

};

#endif

Функция добавления нового звена ничем не отличается от такой функции для односвязного линейного списка, рассмотренной в курсе ”Алгоритмы и структуры данных”, и предлагается разработать её самостоятельно. Функция обработки (или прохождения) всего списка также похожа на соответствующие функции для односвязного линейного списка. Рассмотрим вызовы в ней функции Execute класса TDevice:

TSignal Link::Process(TMessage& obj)

{

Link* q=next;

TSignal loc=obj;

while(q)

{

loc=q->Ustr->Execute(loc); // Обработка сигнала функцией Execute

cout<<loc<<endl; // Просмотр сигнала

q=q->next;

}

return loc;

}

 

Иерархия классов

Созданные классы находятся между собой в отношениях наследования, показанных в виде диаграммы иерархии классов (рисунок 12).

 

 


Рисунок 12. Диаграмма иерархии классов

Для простоты на этой диаграмме не приведёны классы программы и строки символов. Сплошными линиями показаны отношения наследования, пунктирной линией – вхождение объекта (или указателя) класса TDevice в класс Link. В конкретных случаях диаграммы иерархии классов могут (и будут) отличаться от приведённой, т.к. не все показанные классы модуляторов, фильтров и шумов будут необходимы для каждого конкретного варианта задания. Также могут отличаться базовые классы для классов канала, передатчика и приёмника. Следует заметить, что в реальных программах иерархия классов может быть как существенно сложнее, так и проще приведённой на рисунке 12.

 

Модификация класса программы

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

class TProgram

{

public:

TProgram(type1 *m1, char* m2, int i, int c, char L, char, float);

private:

// …

TChannel kanal; // Поле – объект класса

char NoiseLevel;

FFTfilter *filter; // Поля – указатели на объекты классов

TAmplifier *usilitel;

TDetector *detector;

TCommutator* komm;

TChannel *kanal_c1; // Ещё один канал – для коммутатора

Link* L1; // Указатель на ведущее звено списка (для некоторых вариантов)

// …

};

Изменённый конструктор класса TProgram, необходимые пояснения даны в виде комментариев (также показаны только отличия от ранее рассмотренного конструктора):

TProgram::TProgram(char *m1, char* m2, int i, int c, char L, char nl, float k): msg(m1), menu(m2),

modulator(i,c,L), // Инициализация полей, являющихся объектами классов

kanal(i+1,1/k),

NoiseLevel(nl)

{

filter=new FFTfilter(i+2,41); // Инициализация указателей на классы

detector=new TDetector(i+3,c);

usilitel=new TAmplifier(i+4,k);

// …

komm=new TCommutator(i+7,2); // Инициализация коммутатора

(*komm)[0]=&kanal; // Заполнение массива устройств

(*komm)[1]=kanal_c1;

L1=new Link; // Создание ведущего звена списка

L1->Insert(detector); // Ввод устройств в список, начиная с последнего

L1->Insert(&kanal);

L1->Insert(&modulator);

}

Для модификации функции Run класса TProgram рекомендуется построить схему взаимодействия объектов. На схеме указываются классы (или конкретные объекты), участвующие во взаимодействии, запросы, направляемые от одних объектов к другим, и реакция объектов на эти запросы. На этом этапе выполнения курсового проекта (а также на предыдущих) можно использовать язык UML и среду разработки IBM Rational Rose.

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

Схема взаимодействия объектов может выглядеть следующим образом (рисунок 13):

 

 

 


Рисунок 13. Схема взаимодействия объектов

 

На схеме сплошными линиями показаны запросы к объектам, пунктирными – реакции на эти запросы, цифрами указана очерёдность направления запросов от одного и того же объекта. Рядом с линиями запросов можно указать характер запросов, т.е. имена конкретных функций.

Рассмотрим варианты реализации функции Run для случаев управления линией связи при помощи меню, и построения линии в виде связного списка. Управление при помощи меню:

void TProgram::Run()

{

char key=1;

int a;

while(key!='0')

{

cout<<menu<<endl;

key=getch();

switch(key)

{

case '1': cout<<msg<<endl; break; // Контроль исходного сообщения

case '2': signal=modulator.Execute(msg); // Получение сигнала

   cout<<signal<<endl; // Контроль сигнала

   break;

case '4': cout<<"Input channel: ";

   cin>>a; komm->SetActive(a); // Выбор канала для коммутатора

   break;

case '5': kanal.SetNoise(signal.GetLen(),NoiseLevel);

   kanal_c1->SetNoise(signal.GetLen(),NoiseLevel);

   signal=komm->Execute(signal); // Прохождение сигнала через

   cout<<signal<<endl;

   break;

case '6': signal=filter->Execute(signal); // Фильтрация сигнала

   cout<<signal<<endl;

   break;

case '7': signal=detector->Execute(signal); // Детектирование сигнала

   cout<<signal<<endl;

   break;

case '8': signal=usilitel->Execute(signal); // Усиление принятого сигнала

   cout<<signal<<endl;

   break;

// …

}

}

}

Обработка сигнала в списке устройств:

case '5': kanal.SetNoise(signal.GetLen(),NoiseLevel);

   signal=L1->Process(msg);

 

 

Выбор варианта

 

Вариант задания курсового проекта выбирается по 2-м последним цифрам номера зачётной книжки, которые обозначим через хххАВ. Предпоследняя цифра А определяет тип массива данных (str в классе TMessage), используемого для представления сообщения и сигнала, чётная или нечётная цифра А также определяет место усиления сигнала в приёмнике (таблица 1).

Таблица 1.

А Тип данных сообщения и сигнала Место усиления сигнала в приёмнике
0 1 2 3 4 5 6 7 8 9 char unsigned char int unsigned int long unsigned long short unsigned short float double после детектора до детектора после детектора до детектора после детектора до детектора после детектора до детектора после детектора до детектора

 

Последняя цифра В определяет состав аппаратуры в канале и вид представления сообщения и сигнала (спектральными компонентами или временными отсчётами) (таблица 2)

Таблица 2.

В Состав аппаратуры Вид сигнала
0 1   2   3   4   5   6   7   8   9 модулятор, усилитель, фильтр1, детектор, усилитель, фильтр2 модулятор, усилитель, приёмник1 (фильтр1, детектор, усилитель, фильтр2) модулятор, усилитель, фильтр1, приёмник3 (детектор, усилитель, фильтр2) передатчик, приёмник1 (фильтр1, детектор, усилитель, фильтр2) передатчик, фильтр1, приёмник3 (детектор, усилитель, фильтр2) передатчик, фильтр1, приёмник4 (детектор, усилитель), фильтр2 передатчик, приёмник2 (фильтр1, детектор, усилитель), фильтр2 модулятор, усилитель, фильтр1, приёмник4 (детектор, усилитель), фильтр2 модулятор, усилитель, приёмник2 (фильтр1, детектор, усилитель), фильтр2 передатчик, фильтр1, детектор, усилитель, фильтр2 Спектр Отсчёты   Спектр   Отсчёты   Спектр   Отсчёты   Спектр   Отсчёты   Спектр   Отсчёты

 

Сумма цифр А + В (используется только младший десятичный разряд этой суммы) определяет сочетание видов модуляции и типов помехи в каналах связи, сочетания фильтров 1 и 2 в приёмнике (см. таблицу 2), а также модель системы связи – с коммутируемыми каналами или со сложением сигналов от нескольких приёмников. Варианты сведены в таблицу 3.

Таблица 3.

А+В Модуляция Помеха в канале Фильтр1 + фильтр2 Модель
0 1 2 3 4 5 6 7 8 9 АМ + ЧМ АМ + ФМ АМ + DSB АМ + SSB ЧМ + ФМ ЧМ + DSB ЧМ + SSB ФМ + DSB ФМ + SSB DSB + SSB БГШ + БГШ Сосред. + идеал. БГШ + сосред. Сосред. + сосред. БГШ + идеал. БГШ + БГШ Сосред. + идеал. БГШ + сосред. Сосред. + сосред. БГШ + идеал. FFT + ФНЧ FFT + медианный ФНЧ + медианный FFT + ФНЧ FFT + медианный ФНЧ + медианный FFT + ФНЧ FFT + медианный ФНЧ + медианный FFT + ФНЧ Коммутация Сложение Коммутация Сложение Коммутация Сложение Коммутация Сложение Коммутация Сложение

 

В системе связи должно быть не менее 2-х каналов (максимальное их число можно выбрать произвольно). Каналы отличаются друг от друга видом модуляции и типом помехи. Один из каналов должен представлять собой односвязный линейный список устройств. Распределение этих параметров для конкретных каналов можно сделать самостоятельно, но этот выбор должен быть отражён в тексте пояснительной записки.

 

База данных сетевых устройств, организованная в виде связного списка

 

 

 


Типы устройства могут обозначаться целыми числами (по выбору студента), например:

1 – ЭВМ, 2 – кабель, 3 – концентратор (хаб, hub), 4 – коммутатор (свитч, switch), 5 – сервер, 6 – сетевой принтер, 7 – маршрутизатор (router), 8 – внешняя сеть.

Примеры описаний устройств приведены выше.

Адреса могут быть у всех устройств, для кабеля адрес = 0.

Массив адресов содержит адреса соседних устройств. В курсовой работе можно выбрать для всех элементов сети массив одного и того же размера, например, 10 или 20 элементов.

 

Архитектура сети

 

 


Дата добавления: 2018-05-12; просмотров: 327; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!