Разработка программного имитатора цифрового канала связи с применением помехоустойчивого кодирования
Изучение работы цифрового интерфейса, способ осуществления помехоустойчивого кодирования. Выбор среды программирования. Разработка структуры программного обеспечения и методики его тестирования. Создание алгоритмов работы имитатора цифрового канала связи.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 10.09.2011 |
Размер файла | 2,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Плотность магнитного потока
в диапазоне частот 5 Гц - 2 кГц
250 нТл
в диапазоне частот 2 кГц - 400 кГц
25 нТл
Электростатический потенциал экрана видеомонитора
500 В
Наиболее распространенными дополнительными устройствами, обеспечивающими работу группы пользователей компьютеров, являются системы обеспечения бесперебойного питания компьютеров, сетевое оборудование и высокопроизводительные лазерные принтеры. В силу особенностей своего функционирования эти устройства также являются источниками вредных воздействия на организм человека.
В случае источников бесперебойного питания двумя основными факторами являются электромагнитное излучение и опасность поражения электрическим током при неправильной эксплуатации. Если борьба с первым из этих факторов сводится к простому экранированию корпусов источников бесперебойного питания и сосредоточению их в одном месте, желательно удаленном или экранированном дополнительными экранами, то для борьбы со вторым фактором требуется проведение периодических инструктажей по технике безопасности и недопущение обслуживания системы питания неподготовленными лицами.
Потенциальным источником поражения сетчатки глаза являются высокоскоростные волоконно-оптические системы передачи данных, имеющие в своем составе лазеры с высокой интенсивностью излучения. Опасность поражения возникает, как правило, в случае выхода из строя сетевого оборудования или обрыва (излома) волоконно-оптического кабеля.
Источником вибраций и шумов являются в основном подсистемы долговременной памяти, в состав которых входят высокооборотные электромеханические двигатели - накопители на гибких и особенно жестких дисках, отчасти устройства чтения и записи компакт-дисков, вентилирующие системы. В значительной мере снизить интенсивность шума позволяет применение специальных экранированных отсеков внутри корпуса компьютера, в которые и устанавливаются такие устройства, использование шумоподавляющих материалов. Допустимые значения уровней звукового давления представлены в таблице 5.
Таблица 5. - Допустимые значения уровней звукового давления в
октавных полосах частот и уровня звука, создаваемого ПЭВМ
Уровни звукового давления в октавных полосах со среднегеометрическими частотами |
Уровни звука в дБА |
|||||||||
31,5 Гц |
63 Гц |
125 Гц |
250 Гц |
500 Гц |
1000 Гц |
2000 Гц |
4000 Гц |
8000 Гц |
||
86 дБ |
71 дБ |
61 дБ |
54 дБ |
49 дБ |
45 дБ |
42 дБ |
40 дБ |
38 дБ |
50 |
Немаловажную роль в организации рабочих мест операторов компьютеров играют визуальные показатели мониторов, входящих в состав компьютерной системы. Допустимые визуальные параметры мониторов представлены в таблице 6.
Таблица 6. - Допустимые визуальные параметры устройств
отображения информации
№ |
Параметры |
Допустимые значения |
|
1 |
Яркость белого поля |
Не менее 35 кд/м2 |
|
2 |
Неравномерность яркости рабочего поля |
Не более ± 20% |
|
3 |
Контрастность (для монохромного режима) |
Не менее 3 : 1 |
|
4 |
Временная нестабильность изображения (непреднамеренное изменение во времени яркости изображения на экране дисплея) |
Не должна фиксироваться |
|
5 |
Пространственная нестабильность изображения (непреднамеренные изменения положения фрагментов изображения на экране) |
Не более 2Ч10-4 L, где L - проектное расстояние наблюдения, мм |
Для дисплеев на ЭЛТ частота обновления изображения должна быть не менее 75 Гц при всех режимах разрешения экрана, гарантируемых нормативной документацией на конкретный тип дисплея, и не менее 60 Гц для дисплеев на плоских дискретных экранах (жидкокристаллических, плазменных и т.п.).
4.3 Расчёт вентиляции
Задачей вентиляции является обеспечение чистоты воздуха и заданных метеорологических условий в производственных помещениях. Вентиляция достигается удалением загрязнённого или нагретого воздуха из помещений и подачей в него свежего воздуха [14].
По способу перемещения воздуха в помещении различают приточную, вытяжную, и приточно-вытяжную вентиляцию. По месту действия вентиляция разделяется на общеобменную и местную.
Так как в помещении вычислительного центра (ВЦ), где производится работа на ЭВМ, отсутствует выделение вредных веществ, то достаточно будет обеспечить приток воздуха в помещение. Установка приточной вентиляции (рисунок 34) состоит из следующих элементов: воздухозаборного устройства 1, воздуховодов 2, фильтров 3 для очистки забираемого воздуха от примесей, калорифера 4, центробежного вентилятора 5 и приточного устройства 6.
Рисунок 34. - Установка приточной вентиляции
4.3.1 Расчёт воздухообмена
Минимальный расход наружного воздуха определяется по формуле
, (29)
где - нормируемый удельный расход приточного воздуха на одно рабочее место, на одного человека, принимается равным 60 м3/ч, - число рабочих мест.
По формуле (29)
4.3.2 Расчёт гидравлического сопротивления вентиляционной сети
Общий расход приточного воздуха м3/с. Температура атмосферного воздуха Температура воздуха в помещении Материал воздуховодов - кровельная проолифленная сталь.
Давление газа при рабочих условиях в сечении рассчитывается по формуле
, (30)
где - плотность сухого газа при нормальном давлении, кг/м3.
Для сухого газа при давлении 101,325 кПа объёмный расход вычисляется по формуле
, (31)
где - объёмный расход газа при нормальных условиях, м3/с.
Первый элемент сети - приточная шахта.
При нормальных условиях плотность воздуха принимается равной 1,2930 кг/м3
По формуле (30) кг/м3. Объёмный расход определяется по формуле (31) м3/с.
Принимая скорость движения воздуха в канале при нормальных условиях в диапазоне 4-5 м/с, можно приближённо определить сечение воздуховода из уравнения расхода воздуха
,
откуда м2,
что соответствует диаметрам круглых воздуховодов.
м.
Ближайший, находящийся в этом диапазоне диаметр круглого воздуховода мм, что соответствует площади 0,078 м2 и скорости
м/с, м/с.
Коэффициент кинематической вязкости воздуха м2/с при
Динамическое давление
Па.
Число Рейнольдса
.
Коэффициент местных потерь для шахты при .
Суммарный коэффициент потерь
,
так как для шахты .
Потери давления на первом элементе (шахте)
Па.
Второй элемент сети - прямой участок.
Имеющиеся данные
м3/с; ; кг/м3;
м2/с; м/с; Па;
; , мм.
Для кровельной проолифленной стали абсолютная шероховатость мм.
Относительная шероховатость .
Коэффициент линейного сопротивления
.
.
Потери давления на втором участке
Па.
Третий элемент сети - колено.
Имеющиеся данные
м3/с; ; кг/м3;
м2/с; м/с; Па;
; , мм.
Суммарный коэффициент потерь на третьем элементе
,
где , , .
Потери давления на третьем участке
Па.
Четвёртый элемент сети - прямой участок.
Рассчитывается аналогично второму с учётом того что длина мм.
.
Потери давления на четвёртом участке
Па.
Пятый элемент сети - калорифер.
Для трёхрядного калорифера потери давления
Па.
Шестой элемент сети - внезапное сужение.
После калорифера температура Соотношение площадей поперечного сечения воздуховодов и калорифера .
Объёмный расход воздуха в воздуховодах по формуле (31)
м3/с.
Плотность воздуха по формуле (30) кг/м3.
Коэффициент кинематической вязкости
м2/с.
Средняя скорость по сечению воздуховода
м/с.
Динамическое давление
Па.
Число Рейнольдса
.
Коэффициент местных потерь (внезапное сужение потока) рассчитывается по формуле
,
потери на трение учитываются в следующем элементе сети.
.
Потери давления на шестом участке
Па.
Седьмой элемент сети - прямой участок.
Имеющиеся данные
м3/с; ; кг/м3;
м2/с; м/с; Па;
; ;
Коэффициент потерь на данном участке
.
Потери давления на седьмом участке
Па.
Восьмой элемент - пирамидальный диффузор (прямоугольного сечения).
Геометрические соотношения диффузора
м; м; м2; м2; ; ;
Имеющиеся данные
м3/с; ; кг/м3;
м2/с;
Скорость на входе диффузора
м/с.
Число Рейнольдса
.
Динамическое давление
Па.
Коэффициент сопротивления определяют пренебрегая потерями от трения, . Для и угла раскрытия .
Потери давления на восьмом участке
Па.
Девятый элемент сети - прямой участок подключён к выходу диффузора, поэтому скорость, динамическое давление и число Рейнольдса определяются по параметрам этого участка.
м; м2; м;
Расход, температура, плотность воздуха и кинематическая вязкость остаются неизменными.
Скорость на участке
м/с.
Динамическое давление
Па.
Число Рейнольдса
Относительная шероховатость .
Коэффициент линейного сопротивления
.
.
Потери давления на девятом участке
Па.
Общие потери сети
Па.
4.3.3 Выбор вентилятора и электродвигателя
Необходимая производительность Полное давление Па. Для данной вентиляционной сети приемлемым является вентилятор типа 06-300 №3,2 (рисунок 35). Рабочему режиму соответствует точка А. По этой точке находится скорость вращения 160 рад/с, что соответствует об/мин, и (КПД).
Установочная мощность электродвигателя для вентилятора рассчитывается по формуле
, (32)
где - мощность двигателя, Вт; - расход воздуха, м3/с; - полные потери в вентиляционной сети; - КПД вентилятора; - КПД привода; - коэффициент запаса.
При непосредственной установке колеса вентилятора на валу двигателя . Коэффициент запаса примем равным .
По формуле (32) Вт.
По требуемым данным приемлемым является электродвигатель АО2-11-4.
Рисунок 35. - Характеристика вентилятора 06-300 №3,2.
4.4 Пожарная профилактика
Выбор и расчёт необходимого количества огнетушителей в защищаемом помещении или на объекте производится в зависимости от их огнетушащей способности, предельной площади, а также класса пожара горючих веществ и материалов. Помещения с вычислительной техникой можно отнести к категории Д (пониженная пожароопасная). Пожары в таких помещениях связаны с горением электрического оборудования, поэтому можно определить класс Е пожара (пожары, связанные с горением электроустановок).
Выбор типа огнетушителя (передвижной или ручной) обусловлен размерами возможных очагов пожара. При значительных размерах необходимо использовать передвижные огнетушители.
Помещения категории Д могут не оснащаться огнетушителем, если их площадь не превышает 100 м2.
При защите помещений с вычислительной техникой следует учитывать специфику взаимодействия огнетушащих веществ с защищаемым оборудованием. Данные помещения следует оборудовать хладоновыми и углекислотными огнетушителями с учётом предельно допустимой концентрацией огнетушащего вещества.
Нормы оснащения помещения ручными огнетушителями приведены в таблице 7.
Таблица 7. - Нормы оснащения помещения ручными огнетушителями
Категория помещения |
Предельная защищаемая площадь, м2 |
Класс пожара |
Хладоновые огнетушители вместимостью 2(3) л. |
Углекислотные огнетушители вместимостью, л, массой огнетушащего вещества, кг |
||
2 2 |
5(8) 3(5) |
|||||
Г, Д |
1800 |
Е |
2 |
4 |
2 |
Произведён анализ и мероприятия по нормированию опасных и вредных производственных факторов при работе на ЭВМ. Для обеспечения чистоты воздуха и заданных метеорологических условий в помещении вычислительного центра осуществлён расчёт вентиляции. Для осуществления пожарной профилактики произведена классификация помещения и пожара, выбраны меры по защите помещения.
ЗАКЛЮЧЕНИЕ
В процессе выполнения дипломного проекта были разработан программный имитатор цифрового канала связи с применением помехоустойчивого кодирования. Была разработана структура и алгоритм работы ПО. Для разработки ПО выбрана среда разработки Borland Delphi 7, предоставляющая возможности визуальной разработки пользовательского интерфейса. Разработаны алгоритмы моделирующие работу блоков имитатора. Разработан графический интерфейс для отображения результатов работы и взаимодействия с пользователем. Для удобной работы нескольких пользователей, сохранения состояния ПО реализована подсистема авторизации пользователей. Для контроля выполненных действий в ПО реализовано протоколирование работы. В процессе создания ПО производилось его всестороннее тестирование и отладка, кроме того реализован тестовый режим, для проверки работы имитатора.
Разработанное ПО даёт возможность сымитировать работу всех блоков участвующих в передаче информации через канал связи. Начиная с генератора аналогового сигнала и заканчивая цифро-аналоговым преобразователем. С помощью ПО пользователь может ознакомиться с аналого-цифровым преобразованием аналоговой информации, с различными видами модуляции (амплитудная, частотная), различными видами помехоустойчивого кодирования (код Хэмминга, циклический код, проверка на чётность), с детектированием модулированного сигнал, с декодированием полученного кода и получением передаваемого сигнала после цифро-аналогового преобразования.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Олсон Г., Пиани Д. Цифровые системы автоматизации и управления. - СПб.: Невский Диалект, 2001. - 557 с.
2. Скляр Б. Цифровая связь. Теоретические основы и практическое применение. - 2-е изд., исп. - М.: Издательский дом "Вильямс", 2003. - 1104 с.
3. Крушный В.В. Основы теории информации и кодирования. - Снежинск: СГФТА, 2005.
4. Росс В.Н. Руководство по CRC-алгоритмам обнаружения ошибок. 1993. - http://www.ross.net/crc/download/crc_v3.txt.
5. Сергиенко А.Б. Цифровая обработка сигналов. - СПб.: Питер, 2002. - 608 с.
6. Невзоров В. База знаний Delphi. - http://www.drkb.ru/.
7. Буч Г., Рамбо Д., Джекобсон А. Язык UML. Руководство пользователя. - М., ДМК Пресс, 2000. - 432 с.
8. Поздняков А.М. Графика на языке Паскаль с элементами математики. http://graphinpas.narod.ru/
9. Мандел Т. Разработка пользовательского интерфейса. - М., ДМК Пресс, 2001. - 416 с.
10. Петрухин В.А., Лаврищева Е.М. Методы и средства инженерии программного обеспечения. Интернет-Университет Информационных Технологий. - http://www.intuit.ru/department/se/swebok.
11. Степанченко И. В. Методы тестирования программного обеспечения. - Волгоград: ВолгГТУ, 2006. - 74 с.
12. Корчагина Р.Л. Оценка экономической эффективности программных средств: Методические указания. - СПб.: Балт. гос. ун-т., 2005. - 19 с.
13. СанПиН 2.2.2/2.4.1340-03. Гигиенические требования к персональным электронно-вычислительным машинам и организации работы: Утв. и введ. в действие постанов. Глав. гос. сан. врач. 03.06.03 №118.
14. Иванов Н.И., Фадин И.М. Безопасность жизнедеятельности. Коллективные средства защиты: Справ. пособие по дипломному проектированию. - 2-е изд., испр. и доп. - СПб.: Балт. гос. техн. ун-т., 2003. - 192 с.
ПРИЛОЖЕНИЕ
Программный код на Delphi основных функций программного обеспечения
Функция adc реализует аналого-цифровое преобразование. Входные параметры curdiscret - номер текущего дискрета. Возвращаемое значение - удачное (true), неудачное (false) завершение операции.
function adc;
var
n_bit :Byte;
quant_levels:Int64;
n_level :Int64;
level_height:real;
min_signal :real;
max_signal :real;
discret :real;
period_dis :real;
begin
if curdiscret > adc_propertion.messagev then
begin
Result := false;
exit;
end;
quant_levels := Int64(1) shl adc_propertion.capacity;
period_dis := 1 / adc_propertion.dfrequency;
//дискретизация
discret := curdiscret * period_dis;
adc_res.discret := signal_propertion.signal(signal_propertion.amplitude,
signal_propertion.frequency, discret);
max_signal := signal_propertion.maxvalue;
min_signal := signal_propertion.minvalue;
level_height := (max_signal - min_signal) / (Int64(quant_levels));
// квантование
// оцифровывание
n_bit := adc_propertion.capacity;
n_level := Int64(1) shl (n_bit);
while ((adc_res.discret - min_signal) / level_height < Int64(n_level) - 1) or
((adc_res.discret - min_signal) / level_height > Int64(n_level)) do
begin
if (adc_res.discret - min_signal) / level_height < Int64(n_level) - 1 then
n_level := (Int64(n_level) xor (Int64(3) shl (n_bit - 1)))
else
n_level := (Int64(n_level) xor (Int64(1) shl (n_bit - 1)));
if n_bit > 0 then
n_bit := n_bit - 1
else
break;
end;
adc_res.level := Int64(n_level) - 1;
adc_savetofile;
Result := true;
end;
Функция evencoder осуществляет кодирование оцифрованного значения уровня с АЦП по алгоритму проверки чётности. Входные параметры: capacity - разрядность кода, приходящего с АЦП.
procedure evencoder;
var
n_bit :Cardinal;
begin
coders_res.evencode := adc_res.level shl 1;
for n_bit := 0 to capacity - 1 do
begin
coders_res.evencode := coders_res.evencode xor getbitfromint(adc_res.level, n_bit);
end;
coder_savetofile(1);
end;
Функция evendecoder осуществляет декодирование кода по алгоритму проверки чётности. Входные параметры: capacity - разрядность кода, code - декодируемый код.
procedure evendecoder;
var
n_bit :Cardinal;
begin
decoders_res.level := code shr 1;
decoders_res.end_error := 0;
decoders_res.full_error := 0;
decoders_res.error := False;
for n_bit := 0 to capacity - 1 do
begin
decoders_res.end_error := decoders_res.end_error xor getbitfromint(code, n_bit);
end;
if decoders_res.end_error > 0 then
begin
decoders_res.error := True;
decoders_res.full_error := decoders_res.end_error;
end;
decoder_savetofile();
end;
Функция hammcoder осуществляет кодирование оцифрованного значения уровня с АЦП по алгоритму Хэмминга 1-х. Входные параметры: capacity - разрядность кода, приходящего с АЦП.
procedure hammcoder;
var
i, k :Cardinal;
checkbit_count :Cardinal;
check_index :Cardinal;
n_bit :Cardinal;
check_byte :Cardinal;
begin
checkbit_count := coders_res.hcapacity - capacity;
k := 0;
i := 0;
check_index := 1;
check_byte := 0;
coders_res.hammcode := 0;
for n_bit := 0 to coders_res.hcapacity - 1 do
begin
if (n_bit = check_index - 1) then
begin
k := k + 1;
check_index := Int64(1) shl k;
end
else
begin
coders_res.hammcode := int64(coders_res.hammcode) or
(Int64(getbitfromint(adc_res.level, i)) shl n_bit);
i := i + 1;
if getbitfromint(coders_res.hammcode, n_bit) = 1 then
check_byte := check_byte xor (n_bit + 1);
end;
end;
check_index := 1;
k := 0;
for n_bit := 0 to checkbit_count - 1 do
begin
coders_res.hammcode := int64(coders_res.hammcode) or (Int64((check_byte shr k) and 1) shl (check_index - 1));
k := k + 1;
check_index := Int64(1) shl k;
end;
coder_savetofile(2);
end;
Функция hammdecoder осуществляет декодирование кода по алгоритму Хэмминга 1-х. Входные параметры: capacity - разрядность кода, code - декодируемый код, checkbit_count - количество проверочных бит.
procedure hammdecoder;
var
k :Cardinal;
check_index :Cardinal;
info_index :Cardinal;
n_bit :Cardinal;
right_code :Int64;
begin
decoders_res.end_error := 0;
decoders_res.full_error := 0;
decoders_res.error := False;
right_code := code;
decoders_res.level := 0;
for n_bit := 0 to capacity - 1 do
begin
decoders_res.full_error := decoders_res.full_error xor (getbitfromint(right_code, n_bit) * (n_bit + 1));
end;
if decoders_res.full_error > 0 then
decoders_res.error := True;
if decoders_res.full_error > capacity then
decoders_res.full_error := 0;
if (decoders_res.full_error > 0) then
invbitfromint(right_code, decoders_res.full_error - 1);
k := 0;
check_index := 1;
info_index := 0;
decoders_res.end_error := decoders_res.full_error;
for n_bit := 0 to capacity - 1 do
begin
if (n_bit = check_index - 1) then
begin
if decoders_res.end_error = check_index then
decoders_res.end_error := 0;
k := k + 1;
check_index := Int64(1) shl k;
end
else
begin
if decoders_res.end_error = n_bit + 1 then
decoders_res.end_error := info_index + 1;
decoders_res.level := int64(decoders_res.level) or
(Int64(getbitfromint(right_code, n_bit)) shl info_index);
inc(info_index);
end;
end;
decoder_savetofile();
end;
Функция xdiv осуществляет деление полиномов по модулю два. Входные параметры: P - делимое, G - делитель, Plen, Glen, длины полиномов. Возвращает остаток от деления по модулю два.
function xdiv;
var
Psh :Byte;
Gsh :Byte;
Pbit :Byte;
n_bit :Byte;
begin
Psh := max(Glen - Plen, -1) + 1;
Gsh := max(Plen - Glen, 1) - 1;
Pbit := Plen + Psh - 1;
P := Int64(P) shl Psh;
G := Int64(G) shl Gsh;
for n_bit := 1 to Psh do
begin
G := Int64(Int64(G) shl 1);
if (getbitfromint(G, Pbit) = 1) then
begin
G := Int64(G) xor P;
end;
end;
Result := Int64((Int64(G) shr (Gsh + Psh)));
end;
Функция wcrctail осуществляет составление таблицы для производящего полинома. Входные параметры: polinom - производящий полином.
procedure wcrctail;
var
polinomInt :Int64;
tail :Int64;
pollen :Byte;
n_bit :Byte;
begin
polinomInt := getintfrombin(getbinfromstr(polinom));
pollen := polinomcap(polinom);
assignfile(poltailf, combinepath(curuser.profdir, 2, [curuser.userl, curuser.crctailf]));
rewrite(poltailf);
for n_bit := 1 to 64 do
begin
tail := xdiv(polinomInt, Int64(1) shl (n_bit - 1), pollen, n_bit);
write(poltailf, tail);
end;
CloseFile(poltailf);
assignfile(poltailf, '');
end;
Функция crccoder осуществляет кодирование оцифрованного значения уровня с АЦП по алгоритму циклического кодирования 1-х. Входные параметры: capacity - разрядность кода, приходящего с АЦП, polinom - производящий полином.
procedure crccoder;
var
checkbit_count:Byte;
polinomInt :Int64;
messageInt :Int64;
pollen :Byte;
begin
checkbit_count := coders_res.ccapacity - capacity;
polinomInt := getintfrombin(getbinfromstr(polinom));
pollen := polinomcap(polinom);
messageInt := xdiv(polinomInt, adc_res.level shl checkbit_count,
pollen, coders_res.ccapacity);
coders_res.crccode := Int64(adc_res.level) shl checkbit_count;
coders_res.crccode := Int64(coders_res.crccode) or messageInt;
coder_savetofile(3);
end;
Функция crcdecoder осуществляет декодирование кода по алгоритму циклического кодирования 1-х. Входные параметры: capacity - разрядность кода, code - декодируемый код, checkbit_count - количество проверочных бит, polinom - производящий полином.
procedure crcdecoder;
var
polinomInt :Int64;
messageInt :Int64;
pollen :Byte;
begin
polinomInt := getintfrombin(getbinfromstr(polinom));
pollen := polinomcap(polinom);
decoders_res.error := False;
messageInt := xdiv(polinomInt, code, pollen, capacity);
if messageInt > 0 then
decoders_res.error := True;
decoders_res.full_error := rcrcdigit(messageInt, capacity);
decoders_res.level := code;
decoders_res.end_error := 0;
if (decoders_res.full_error > 0) then
begin
invbitfromint(decoders_res.level, decoders_res.full_error - 1);
decoders_res.end_error := decoders_res.full_error;
if decoders_res.end_error > checkbit_count then
decoders_res.end_error := decoders_res.end_error - checkbit_count
else
decoders_res.end_error := 0;
end;
decoders_res.level := decoders_res.level shr checkbit_count;
decoder_savetofile();
end;
Функция ampulation осуществляет амплитудную модуляцию битов. Входные параметры time - время которого вычисляется значение модулированного сигнала, speed - скорость передачи в канале связи, amplitude - амплитуда модулированного сигнала, carrier - несущая частота, coder - тип кодирования, capacity - разрядность кода, приходящего с кодера. Возвращаемое значение - удачное (true), неудачное (false) завершение операции.
function ampulation;
var
bitlen :real;
whole :Cardinal;
bit :byte;
begin
bitlen := 1 / speed;
whole := trunc(time / bitlen);
if mod_res.n_discret <> (whole div capacity) then
begin
mod_res.n_discret := whole div capacity;
if not coders.coder_readfromfile(mod_res.n_discret, coder) then
begin
Result := false;
exit;
end;
end;
bit := getbitfromint(code_res.code, capacity - whole mod capacity - 1);
mod_res.amplitude := bit * amplitude * sin(2 * PI * carrier * time);
Result := true;
end;
Функция nonulation реализует режим «без модуляции». Входные параметры time - время которого вычисляется значение сигнала, speed - скорость передачи в канале связи, amplitude - амплитуда сигнала, coder - тип кодирования, capacity - разрядность кода, приходящего с кодера. Возвращаемое значение - удачное (true), неудачное (false) завершение операции.
function nonulation;
var
bitlen :real;
whole :Cardinal;
bit :byte;
begin
bitlen := 1 / speed;
whole := trunc(time / bitlen);
if mod_res.n_discret <> (whole div capacity) then
begin
mod_res.n_discret := whole div capacity;
if not coders.coder_readfromfile(mod_res.n_discret, coder) then
begin
Result := false;
exit;
end;
end;
bit := getbitfromint(code_res.code, capacity - whole mod capacity - 1);
mod_res.amplitude := bit * amplitude;
Result := true;
end;
Функция frequlation осуществляет частотную модуляцию битов. Входные параметры time - время которого вычисляется значение модулированного сигнала, speed - скорость передачи в канале связи, amplitude - амплитуда модулированного сигнала, carrier1, carrier2- две частоты модуляции, coder - тип кодирования, capacity - разрядность кода, приходящего с кодера. Возвращаемое значение - удачное (true), неудачное (false) завершение операции.
function frequlation;
var
bitlen :real;
whole :Cardinal;
bit :Byte;
begin
bitlen := 1 / speed;
whole := trunc(time / bitlen);
if mod_res.n_discret <> (whole div capacity) then
begin
mod_res.n_discret := whole div capacity;
if not coders.coder_readfromfile(mod_res.n_discret, coder) then
begin
Result := false;
exit;
end;
end;
bit := getbitfromint(code_res.code, capacity - whole mod capacity - 1);
if bit = 1 then
begin
mod_res.amplitude := amplitude * sin(2 * PI * carrier2 *
(time - gl.last_time) + gl.last_phase);
gl.last_phase := 2 * PI * carrier2 *
(time - gl.last_time) + gl.last_phase;
gl.last_time := time;
end else
begin
mod_res.amplitude := amplitude * sin(2 * PI * carrier1 *
(time - gl.last_time) + gl.last_phase);
gl.last_phase := 2 * PI * carrier1 *
(time - gl.last_time) + gl.last_phase;
gl.last_time := time;
end;
Result := true;
end;
Функция amdemod осуществляет детектирование амплитудно-модулированного сигнала. Входные параметры: isignal - массив дискретов модулированного сигнала. osignal - массив дискретов демодулированного сигнала, N - количество дискретов, dfreq частота дискретизации, freq_cut - частота среза.
procedure amdemod;
begin
amdetect(isignal, N, osignal, tailcov, dfreq, freq_cut);
sumarr(osignal, length(tailcov2), tailcov2);
tailcov2 := Copy(tailcov);
amplifier(detecter_propertion.gain, osignal, N);
end;
Функция fmdemod осуществляет детектирование частотно-модулированного сигнала. Входные параметры: isignal - массив дискретов модулированного сигнала. osignal - массив дискретов демодулированного сигнала, N - количество дискретов, dfreq частота дискретизации, freq_cut1, freq_cut2 - частоты модуляции.
procedure fmdemod;
begin
fmdetect(isignal, N, osignal, tailcov3, dfreq, freq_cut1, freq_cut2);
sumarr(osignal, min(length(tailcov4), N), tailcov4);
tailcov4 := Copy(tailcov3);
amdemod(osignal, osignal, N, dfreq, detecter_propertion.lpfdetectfreq);
end;
Функция detect осуществляет детектирование демодулированного сигнала. Входные параметры beforedetect - массив дискретов демодулированного сигнала, afterdetect - массив детектированных битов, detecttime - модельное время детектирования, detectlevel - уровень детектирования, bpsec - скорость передачи в канале, condunit - период дискретизации, st - текущее модельное время, capacity - разрядность кода, inv - инвертировать биты.
procedure detect;
var
t,
tperb :real;
N,
i,
j,
k :AlglibInteger;
begin
N := trunc(detecttime * bpsec);
t := detecttime - N / bpsec;
setlength(afterdetect, N);
st := st - t;
tperb := 1 / bpsec;
j := 0;
k := 0;
while j < N do
begin
afterdetect[j] := 0;
t := 0;
i := 0;
while t < tperb do
begin
if beforedetect[k] > detectlevel then
inc(afterdetect[j]);
inc(i);
inc(k);
t := t + condunit;
end;
if afterdetect[j] > 0.5 * i then
begin
if inv then
afterdetect[j] := 0
else
afterdetect[j] := 1;
end
else
begin
if inv then
afterdetect[j] := 1
else
afterdetect[j] := 0;
end;
detect_res.code := (Int64(detect_res.code) or (Int64(afterdetect[j]) shl (capacity - bcnt - 1)));
if bcnt = capacity - 1 then
begin
bcnt := 0;
detecter_savetofile;
decoder(detect_res.code);
detect_res.code := 0;
end else
inc(bcnt);
inc(j);
end;
end;
Функция demodcode осуществляет демодулирование и детектирование модулированного сигнала. Входные параметры detect_cnt - количество детектируемых, за одну итерацию битов, condunit -период дискретизации. Возвращаемое значение - удачное (true), неудачное (false) завершение операции.
function demodcode;
var
beforedetect :TReal1DArray;
afterdetect :TInteger1DArray;
N,
n_discret :AlglibInteger;
readflag :boolean;
res2,
t :real;
inv :Boolean;
begin
modul_init;
t := 0;
N := detect_cnt;
if N * condunit < 1 / channel_propertion.speed then
N := ceil(1 / (channel_propertion.speed * condunit));
detecter_init;
detecter_deletefile;
SetLength(beforedetect, N);
while true do
begin
for n_discret := 0 to N - 1 do
begin
case modulator_propertion.nmodulator of
0: readflag := ampulation(t, channel_propertion.speed, modulator_propertion.mamplitude,
modulator_propertion.mfrequency,
coder_propertion.ncoder + 1, capacity);
1: readflag := frequlation(t, channel_propertion.speed, modulator_propertion.mamplitude,
modulator_propertion.mfrequency, modulator_propertion.mfrequency2,
coder_propertion.ncoder + 1, capacity);
2: readflag := nonulation(t, channel_propertion.speed, modulator_propertion.mamplitude,
coder_propertion.ncoder + 1, capacity);
else readflag := true;
end;
if readflag then
begin
res2 := white_noise(noise_propertion.mean, noise_propertion.stddev);
beforedetect[n_discret] := mod_res.amplitude + res2;
end
else
begin
N := n_discret;
break;
end;
t := t + condunit;
end;
if N = 0 then
break;
case modulator_propertion.nmodulator of
0:
begin
amdemod(beforedetect, beforedetect, N, 1 / condunit, detecter_propertion.lpfdetectfreq);
inv := false;
end;
1:
begin
fmdemod(beforedetect, beforedetect, N, 1 / condunit,
modulator_propertion.mfrequency, modulator_propertion.mfrequency2);
inv := modulator_propertion.mfrequency < modulator_propertion.mfrequency2;
end;
2:
begin
inv := false;
end
else
begin
inv := false
end;
end;
detect(beforedetect, afterdetect, condunit * N,
detecter_propertion.detectlevel * modulator_propertion.mamplitude,
channel_propertion.speed, condunit, t, capacity, inv);
if not readflag then
break;
end;
Result := readflag;
end;
Функция nlineartf осуществляет моделирование прохождение сигнала через нелинейный элемент. Входные параметры: isignal - массив дискретов входного сигнала, osignal - массив дискретов выходного сигнала, N - количество дискретов.
procedure nlineartf;
var
i :AlglibInteger;
begin
i := 0;
SetLength(osignal, N);
while i <= N - 1 do
begin
if (isignal[i] > svolt) then
osignal[i] := isignal[i] - svolt
else if (isignal[i] < -svolt) then
osignal[i] := -(isignal[i] + svolt)
else
osignal[i] := 0;
inc(i);
end;
end;
Функция amdetect осуществляет демодулирование амплитудно-модулированного сигнала. Входные параметры: isignal - массив дискретов модулированного сигнала, osignal - массив дискретов демодулированного сигнала, N - количество дискретов, dfreq - частота дискретизации, freq_m - частота среза.
procedure amdetect;
begin
nlineartf(isignal, N, osignal, 0.2);
lowpassf(1.0, osignal, 2 * N - 1, osignal, dfreq, freq_m, 1);
tail := Copy(osignal, N, N - 1);
SetLength(osignal, N);
end;
Функция fmdetect осуществляет демодулирование частотно-модулированного сигнала. Входные параметры: isignal - массив дискретов модулированного сигнала, osignal - массив дискретов демодулированного сигнала, N - количество дискретов, dfreq - частота дискретизации, freq_m1, freq_m2 - частоты модуляции.
procedure fmdetect;
begin
if (freq_m1 > freq_m2) then
lowpassf(1.0, isignal, 2 * N - 1, osignal, dfreq, (freq_m1 + freq_m2) / 2, 10)
else
lowpassf(1.0, isignal, 2 * N - 1, osignal, dfreq, (freq_m1 + freq_m2) / 2, 10);
tail := Copy(osignal, N, N - 1);
SetLength(osignal, N);
end;
Функция amplifier осуществляет усиление сигнала. Входные параметры: k - коэффициент усиления, signal - массив дискретов модулированного сигнала, osignal - массив дискретов демодулированного сигнала, N - количество дискретов.
procedure amplifier;
var j:AlglibInteger;
begin
j := 0;
while j < N do
begin
signal[j] := k * signal[j];
inc(j);
end;
end;
Функция lowpassf осуществляет цифровую фильтрацию сигнала. Тип фильтра - фильтр нижних частот. Входные параметры: isignal - массив дискретов модулированного сигнала, osignal - массив дискретов демодулированного сигнала, N - количество дискретов, dfreq - частота дискретизации, freq_cut - частота среза, order - порядок фильтра.
procedure lowpassf;
var
inputsignal :TReal1DArray;
i, j :AlglibInteger;
alpha :Real;
begin
i := 0;
alpha := exp(-2 * PI * freq_cut / dfreq);
inputsignal := Copy(isignal);
SetLength(osignal, N);
SetLength(inputsignal, N);
while i < order do
begin
j := 0;
while j < N do
begin
osignal[j] := (1 - alpha) * inputsignal[j];
if j > 0 then
osignal[j] := osignal[j] + alpha * osignal[j - 1];
inc(j);
end;
inputsignal := Copy(osignal);
inc(i);
end;
end;
Функция dac осуществляет цифро-аналоговое преобразование. Входные параметры: level - оцифрованный уровень.
procedure dac;
begin
dac_gl.dac_res.level := level;
dac_gl.dac_res.discret := (Int64(dac_gl.dac_res.level) + 1);
dac_gl.dac_res.discret := dac_gl.dac_res.discret *
dac_gl.level_height +
signal_propertion.minvalue - dac_gl.level_height / 2;
dac_savetofile;
end;
Функция logit осуществляет протоколирование работы ПО. Входные параметры: event_str - протоколируемое сообщение.
procedure logit;
var
sdate :string;
begin
sdate := FormatDateTime('dd.mm.yy hh:nn:ss', now);
Writeln(logfile, Format('%s >%s', [sdate, event_str]));
fflush(logfile);
end;
Функция logout осуществляет завершение работы ПО.
procedure logout;
begin
if blogin then
begin
with curuser do
begin
logit(Format('Пользователь%s закончил работу', [userl]));
if ReadIni(combinepath(cworkdir, 1, [proffile]), 'main', 'permanent') <> '1' then
FullRemoveDir(cworkdir, true, true, true);
closelogfile;
hashlog;
end;
blogin := False;
end;
end;
Функция truecrypt осуществляет шифрование MD5. Входные параметры: login - имя пользователя, passw - пароль пользователя, fit - тип шифруемой информации (файл, строка). Возвращаемое значение - MD5-строка.
function truecrypt;
const
spec :array[1..10] of char = '#!@~&$%?^*';
var
crypted :TMD5Digest;
crypto :TMD5Digest;
crypt1 :string;
crypt2 :string;
crypt3 :string;
i, n :LongInt;
begin
if fit then
crypto := MD5File(passw)
else
crypto := MD5String(passw);
crypted := MD5String(LowerCase(MD5DigestToStr(MD5String(login))) +
LowerCase(MD5DigestToStr(crypto)));
crypt1 := LowerCase(MD5DigestToStr(crypted));
crypt2 := LowerCase(MD5DigestToStr(crypto));
n := Length(crypt1);
crypt3 := '';
for i := 1 to n do
begin
if (ord(crypt2[i]) >= ord('0')) and (ord(crypt2[i]) <= ord('9')) then
crypt3 := crypt3 + spec[strtoint(crypt2[i]) + 1]
else if (ord(crypt2[i]) >= ord('a')) and (ord(crypt2[i]) <= ord('d')) then
crypt3 := crypt3 + UpperCase(crypt1[i])
else
crypt3 := crypt3 + crypt1[i];
end;
Result := MD5String(crypt3);
end;
Функция loginto осуществляет аутентификацию и авторизацию пользователя. Входные параметры: login - имя пользователя, passw - пароль пользователя. Возвращаемое значение - удачное (true), неудачное (false) завершение операции.
function loginto;
var
fname :string;
userid :string;
begin
if not chkprofile(login) then
begin
Result := False;
exit;
end;
fname := combinepath(curuser.profdir, 2, [login, curuser.proffile]);
userid := ReadIni(fname, 'main', 'userid');
if MD5DigestCompare(md5fromstr(userid), truecrypt(login, passw)) then
begin
curuser.userl := login;
Result := True;
end else
Result := False;
blogin := Result;
end;
Функция newreg осуществляет создание нового пользователя. Входные параметры: login - имя пользователя, passw - пароль пользователя. Возвращаемое значение - удачное (true), неудачное (false) завершение операции.
function newreg;
var
fname :string;
begin
if chkprofile(login) then
begin
Result := False;
exit;
end;
if not CreateDir(combinepath(curuser.profdir, 1, [login])) then
begin
Result := False;
exit;
end;
fname := combinepath(curuser.profdir, 2, [login, curuser.proffile]);
WriteIni(fname, 'main', 'userid', MD5DigestToStr(truecrypt(login, passw)));
WriteIni(fname, 'graph', 'xywidth', '1');
Result := True;
end;
Функция draw_xy осуществляет рисование линии на графике. Входные параметры: x - координата по оси X, y - координата по оси Y. Возвращаемое значение 0 - удачное, 1 - неудачное завершение операции.
function TMGraph.draw_xy;
begin
with config do
begin
canvas.Pen.Width := xywidth;
if (npoint = 1) then
begin
xe_o := round(xen + (x - xn) / mx);
ye_o := round(yen - (y - yn) / my);
point(xe_o, ye_o);
end else
begin
xe := round(xen + (x - xn) / mx);
ye := round(yen - (y - yn) / my);
if ((xe = xe_o) and (ye = ye_o)) then
begin
Result := -1;
exit;
end;
line(xe_o, ye_o, xe, ye);
xe_o := xe;
ye_o := ye;
end;
npoint := npoint + 1;
end;
Result := 0;
end;
Функция draw_axis осуществляет рисование осей графика.
procedure TMGraph.draw_axis;
var
x, y :real;
xs,
ys :integer;
hx, hy :real;
i :integer;
xyst :string;
begin
with config do
begin
x:=xn;
hx:=(xk-xn)/(kdx-1);
y:=yn;
hy:=(yk-yn)/(kdy-1);
canvas.Pen.Width := 2;
rectangle(xen, yek, xek, yen);
xs := round (xen+(0-xn)/mx);
ys := round (yen-(0-yn)/my);
for i:=1 to kdx do
begin
xe := Round (xen+(x-xn)/mx);
line(xe, yen, xe, yen + 5);
str(x * kux:5:2, xyst);
canvas.TextOut(xe - 10, yen + dyen div 2, xyst);
x:= x + hx;
end;
for i:=1 to kdy do
begin
ye := Round (yen-(y-yn)/my);
line(xen, ye, xen - 5, ye);
Str(y * kuy:5:2, xyst);
canvas.TextOut(xen - dxen, ye - 6, xyst);
y:= y + hy;
end;
canvas.Pen.Width := 1;
end;
end;
Функция addbyte осуществляет добавление байта в таблицу. Входные параметры: row - строка таблицы, byte - добавляемый байт, color - цвет байта, gridnumber - номер таблицы.
procedure Tgridform.addbyte;
var
i :Integer;
begin
case gridnumber of
1:
for i := tables_propertion.cont1.size.colcount - 1 downto 0 do
begin
self.grid1.Cells[ tables_propertion.cont1.size.colcount - i, row + 1] :=
inttostr((byte shr i) and 1);
tables_propertion.cont1.cellscolor[
tables_propertion.cont1.size.colcount - i, row] := color;
end;
2:
for i := tables_propertion.cont2.size.colcount - 1 downto 0 do
begin
self.grid2.Cells[ tables_propertion.cont2.size.colcount - i, row + 1] :=
inttostr((byte shr i) and 1);
tables_propertion.cont2.cellscolor[
tables_propertion.cont2.size.colcount - i, row] := color;
end;
3:
for i := tables_propertion.cont3.size.colcount - 1 downto 0 do
begin
self.grid3.Cells[ tables_propertion.cont3.size.colcount - i, row + 1] :=
inttostr((byte shr i) and 1);
tables_propertion.cont3.cellscolor[
tables_propertion.cont3.size.colcount - i, row] := color;
end;
end;
end;
Функция sinus вычисляет значение гармонического сигнала при заданных параметрах в конкретный момент времени. Входные параметры: Amplitude - амплитуда, f - частота, t - текущие время. Возвращаемое значение - значение сигнала.
function sinus;
begin
Result := roundto(Amplitude * sin(2 * PI * f * t), -9);
end;
Функция rect вычисляет значение прямоугольного сигнала при заданных параметрах в конкретный момент времени. Входные параметры: Amplitude - амплитуда, tperiod - период, pulse_ratio - скважность, t - текущие время. Возвращаемое значение - значение сигнала.
function rect;
begin
if abs(realmod(t, signal_propertion.tperiod)) <
signal_propertion.tperiod / signal_propertion.pulse_ratio then
Result := Amplitude
else
Result := 0;
end;
Функция triangle вычисляет значение треугольного сигнала при заданных параметрах в конкретный момент времени. Входные параметры: Amplitude - амплитуда, f - частота, t - текущие время. Возвращаемое значение - значение сигнала.
function triangle;
begin
Result := roundto(Amplitude * (t * f - floor(t * f)), -9);
end;
Размещено на Allbest.ru
Подобные документы
Создание прикладного программного обеспечения для реализации интерфейса терминала по приему платежей за услуги связи. Анализ требований к программному обеспечению. Выбор языка программирования. Разработка интерфейса пользователя и проектной документации.
дипломная работа [1,3 M], добавлен 18.06.2015Анализ методов сверточного кодирования. Понятие канала связи и корректирующих кодов, характеристика автомата типа Мура. Особенности сверточного декодирования Витерби. Сущность разработки программного обеспечения системы кодирования сверточным кодом.
дипломная работа [4,9 M], добавлен 11.03.2012Современные методы цифрового сжатия. Классификация алгоритмов сжатия. Оцифровка аналогового сигнала. Алгоритм цифрового кодирования. Последовательное двойное сжатие. Чересстрочность и квантование. Сокращение цифрового потока. Профили, уровни формата MPEG.
реферат [784,9 K], добавлен 22.01.2013Разработка программы создания заметок в любом месте компьютера. Выбор технологии, языка и среды разработки приложения. Описание основных алгоритмов работы программного обеспечения. Проектирование пользовательского интерфейса. Выбор стратегии тестирования.
отчет по практике [700,5 K], добавлен 24.11.2014Разработка структуры базы данных сайта. Установка и настройка требуемого программного обеспечения. Анализ интерфейса программы. Создание формы обратной связи. Формирование дизайна, соответствующего требованиям заказчика. Выбор методики тестирования.
дипломная работа [2,0 M], добавлен 22.03.2018Разработка программного обеспечения для упрощения буквенно-цифрового ввода при невозможности использовать функционал стандартной буквенной клавиатуры. Классификация и установка драйверов. Выбор языка и среды программирования. Пользовательский интерфейс.
курсовая работа [183,0 K], добавлен 12.03.2013Выбор технологии, языка и среды программирования. Анализ процесса обработки информации и выбор структур данных для ее хранения, разработка основных алгоритмов. Проектирование интерфейса пользователя. Выбор стратегии тестирования и разработка тестов.
курсовая работа [332,3 K], добавлен 09.12.2014Разработка программы для осуществления работы с файлами и их последующего помехоустойчивого кодирования-декодирования по методу Хемминга 15-11 в интерактивном режиме. Обзор языка С и его особенностей. Взаимодействие пользователя с программным интерфейсом.
курсовая работа [145,5 K], добавлен 12.05.2013Классификация методов шифрования информации и оценка надежности криптоалгоритмов. Определение вероятностных характеристик двоичного канала. Понятия помехоустойчивого кодирования. Прием сигналов с неопределенной фазой и прием кодограмм со стиранием.
дипломная работа [822,0 K], добавлен 12.02.2014Разработка программного обеспечения для работы с установкой "АСР уровня жидкости с применением ПЛК ОВЕН 150" и лабораторного практикума по изучению промышленного программируемого контроллера с использованием ПК и среды программирования Codesys 2.3.
дипломная работа [4,6 M], добавлен 30.06.2012