Анализ сигнала на выходе электрической цепи

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

Рубрика Коммуникации, связь, цифровые приборы и радиоэлектроника
Вид курсовая работа
Язык русский
Дата добавления 04.03.2015
Размер файла 1,6 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru

1. Цель работы

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

Курсовая работа посвящена решению задач машинного анализа электрических цепей.

2. Постановка задачи

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

Входной сигнал задаётся на временном отрезке и представлен следующей формулой:

а также графиком:

Рабочий набор задан так:

,

,

.

,

,

,

3. Анализ поставленной задачи

Рассмотрим, каким образом были получены аналитические выражения для расчета входного сигнала. Общий вид аналитического представления входного сигнала можно задать следующим образом:

Рассмотрим подробнее эти выражения. Начнем с при .

Здесь уместно воспользоваться уравнением прямой:

Располагаем координатами двух точек: и

Точка

Результат подстановки

Получаем систему из двух уравнений:

Из второго уравнения вычитаем первое и получаем:

Теперь можно найти чему равняется :

Подставляем полученный результат во второе уравнения и вычисляем :

Окончательно:

Вывод аналитического выражения для

Располагаем координатами двух точек: и

Точка

Результат подстановки

Получаем систему из двух уравнений:

Подстановка в уравнение дает

Окончательно:

Обобщив выше сказанное, приходим к выражению:

Сигнал на выходе формируется в соответствии с передаточной характеристикой, заданной графиком:

по следующей формуле:

График выходного сигнала должен выглядеть следующим образом:

Длительность импульса

Находится по формуле

где count - количество точек, соответствующих условию: то есть попадающих в область между t' и t” (см. график ниже)

dt вычисляется по формуле

4. Разработка структуры программы

Данная программа достаточно большая, по этой причине разумно разбить её на модули - отдельные файлы, составляющие программу. Сначала программа разрабатывалась в одном файле. Это делалось для того, чтобы возник некий «костяк» программы, который удобно потом разобрать на модули. Такой метод - неплохая профилактика ошибок и возможной путаницы при создании модулей.

Программа разделена на следующие составляющие модули:

main.c - основной модуль, содержащий в себе главную функцию программы - функцию main, в которой происходит вызов функций, выполняющих стоящие перед программой задачи, объявление переменных, а так же реализация меню, которое делает доступ к использованию функций программы простым, быстрым и доступным обычному пользователю (далее клиент). Функция main разрабатывалась так, чтобы в ней содержалось как можно меньше кода. Это нужно для того, чтобы любой не знакомый с программой программист, открывший код данной программы мог легко и быстро в нем разобраться.

menu.c - модуль, содержащий реализацию функции menu, которая выполняет две задачи: 1) выводит на консоль список команд, выполняемых программой (каждой команде соответствует определенный номер в списке, который клиент вводит с клавиатуры при работе с программой) 2) возвращает значение, введенное с клавиатуры клиентом. Далее это значение передается оператору switch, осуществляющему работу меню, то есть возможность запуска выбранной команды. Запуск выбранной команды осуществляется путем вызова соответствующей выбранной команде функции программы. Приведем список команд, доступных в меню:

«0» -выход из программы

«1»- ввод данных с клавиатуры

«2»- вывод результатов на консоль

«3»-ввод данных из файла

«4»-сохранение данных в текстовый файл.

«5»- вывести только длительность импульса

Предпоследняя команда «сохранение данных в текстовый файл» сохраняет расчеты данных в четыре текстовых файла. Первый файл содержит столбец табуляции времени, второй файл столбец табуляции входного сигнала, третий файл - столбец выходного сигнала, в четвертый файл сохраняются вся таблица данных (n_ая точка, время, входной сигнал, выходной сигнал, длительность импульса входного и выходного сигнала, рабочий набор данных ).

Из сохраненных программой текстовых файлов, содержащих в себе лишь столбцы отдельных данных, с помощью программы wxMaxima можно построить график проводимых вычислений.

В меню так же предусмотрена защита от ввода некорректных чисел при выборе номера команды, так же имеется защита от некорректного выбора команды на данном этапе работы (например, клиент выберет вывод расчетов, не вводя перед этим рабочие данные)

Input.c - этот модуль содержит в себе функции, отвечающие за ввод рабочих данных. Модуль позволяет вводить данные с клавиатуры и считывать данные из текстового файла.

output.c - модуль, отвечающий за вывод расчетов. Позволяет выводить расчетные данные на консоль и производит запись данных в текстовый файл.

calc.c - модуль, осуществляющий решение поставленной перед программой задачи, заполнения массива времени, массивов входного и выходного напряжения, а так же вычисления длительности импульса входного и выходного сигнала.

Логическая схема взаимосвязи между модулями программы.

Далее будет подробно изложено устройство каждого модуля и устройство функций, составляющих модули программы.

5. Реализация программы

Модуль main.c

Модуль main.c - это сердце программы. В данном модуле содержится лишь одна функция main. В этой функции объявлены все рабочие переменные, которые передаются другим функциям для работы. Основой функции main является оператор switch, содержащий в себе пять команд: 1) вызов функции enter_data, заполняющей рабочие переменные (ранее все рабочие переменные инициализированы нулями) введенными с клавиатуры значениями и вызов функции data_calculation, отвечающей за расчет данных.2) Вызов функций console_output_source_data и output_table_on_the_console. Первая отвечает за вывод на консоль введенных клиентом рабочих данных, а вторая за вывод таблицы табуляции на консоль. 3) Вызов функции input_from_file , которая осуществляет чтение данных из текстового файла. 4)Вызов функций print_time_and_UInput_and_UOutput_to_file и print_table_data_to_file , первая из которых сохраняет массив времени, входного сигнала и выходного сигнала в три текстовых файла, создающихся для возможности построить график проделанных вычислений в программе wxMaxima. 5) Выводит только длительность импульса входного и выходного сигнала на случай, если клиенту не нужно выводить всю таблицу табуляции (особенно если она очень длинная), нужно лишь узнать значение длительности импульса.

Эти команды и есть воплощение в жизнь работы меню. Предусмотрена так же защита от некорректного ввода номера команды с помощью зарезервированного слова default , стоящего после последнего case . В случае если введенное с клавиатуры число не соответствует ни одной команде, программа выдаст на консоль сообщение о некорректности введенного номера. При этом работа программы не завершиться. Программа вновь откроет меню для выбора команды. Это осуществляется за счет работы цикла while , в условиях которого находится переменная, которой присвоено значение, возвращаемое функцией menu (о menu будет сказано чуть позже). Если в скобках содержащих условие цикла while будет помещена переменная, значение которой не равно нулю, условие будет истинным, а цикл будет выполняться. В теле цикла while находится оператор switch . Введенное при запросе номера команды число 0 служит для выхода из программы, так как в условиях цикла ЛОЖЬ и никакие функции из функции main не запускаются.

Переменные и массивы, объявляемые в функции main:

1) double: length_input_signal(длительность импульса входного сигнала), length_output_signal(длительность импульса выходного сигнала), U(подаваемое напряжение), ULimit(пороговое напряжение), UMax(напряжение, которое является максимальным для выходного сигнала по свойствам передаточной характеристики), t_n(начальное время), t_m(время, в момент которого входное напряжение достигает максимальное значение), t_k(конечное время), time[MAXSIZE](массив времени), UInput[MAXSIZE](массив входного сигнала), UOutput[MAXSIZE](массив выходного сигнала).

2) int: n(число шагов табулирования), choise(переменная, которой будет присвоено значение, возвращаемое функцией menu), zapolneno(переменная, введенная для защиты от неправильного выбора команды программы на определенном этапе работы)

Функция main включает в себя следующие заголовочные файлы: input.h, calc.h, output.h.

Эти файлы позволяют работать вызванным в функции main функциям.

Файл main.h

Этот заголовочный файл создан с целью уменьшить количество кода в программе. Он включает в себя: защиту от повторного включения, подключение к стандартным библиотечным функциям языка си (stdlib.h , stdio.h), осуществление перевода вывода на консоль на русский язык (подключение Windows.h), объявление про помощи директивы define констант MAXSIZE (400) и MLEN (30). Лучше, чтобы эти библиотечные функции подключались в отдельном файле и не загромождали код в рабочих функциях. Это улучшит читаемость кода программы.

Модуль menu.c

Модуль menu.c содержит единственную функцию menu, как говорилось выше, цель которой вывод на консоль нумерованного списка команд, исполняемых программой и возвращение значения, введенного клиентом с клавиатуры, соответствующего номеру команды. Рассмотрим более подробное устройство функции menu. В начале функции объявляется переменная w , далее 8 раз вызывается функция printf. Первый раз для печати заголовка «Menu». Далее пользователь увидит следующую таблицу:

Функция scanf сканирует значение выбор нужной команды, записав его в переменную w. Далее функция menu возвращает значение этой переменной.

Файл menu.h

Данный заголовочный файл включает в себя: защиту от повторного включения, прототип функции menu, подключение заголовочного файла main.h

Модуль input.c

Модуль содержит две функции: enter_data и input_from_file ,а так же включает в себя заголовочный файл input.h.

enter_data

Эта функция принимает в себя через указатель следующие переменные: U, ULimit, UMax, t_n, t_m, t_k, n, zapolneno. С помощью функции scanf переменным даются введенные пользователем с клавиатуры значения.

В функции реализовано две защиты от некорректной работы:

1) Защита от ввода некорректных данных реализуется условием (t_n < t_m и t_n < t_k и t_m < t_k и n > 0 и U >= 0 и ULimit >= 0 и UMax >= 0). Если это условие не выполняется, выводится сообщение о некорректности данных.

2) Поскольку функция scanf возвращает значение, равное числу удачно прочитанных переменных (а их вводится всего 7) , то уместно здесь было сделать следующую проверку:

увеличивать переменную zapolneno на 1, после каждого удачного считывания. Далее при запросе вывода данных, проверяется условие того, что переменная zapolneno действительно равна 7.

input_from_file

Функция позволяет читать данные из текстового файла, заполненного ранее программой. Имя текстового файла задается клиентом с клавиатуры. Функция заполняет по записанной в текстовый файл таблице массивы. Это необходимо в случае, если нужно вернуть программу в то состояние, в котором она была перед выводом расчетных данных. В функции реализована проверка корректности выбранного клиентом действия с помощью переменной zapolneno . Выражение fgets(buf, sizeof(buf),in_txt); пропускает лишние строчки и заголовки в текстовом файле. При этом не происходит считывания точки I (счетчика). Для пропуска этого столбца используется прием %*d- пропустить при считывании число целого типа. Так же есть проверка на существование самого читаемого файла. Если файл отсутствует, программа выводит соответствующее сообщение. Принимает в себя функция практически де же самые данные, что и функция enter_data.

Файл input.h

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

Модуль calc.c

Модуль содержит в себе функции: filling_time_array, fill_array_input_voltage, fill_array_output_voltage, length_signal, data_calculation.

filling_time_array

Принимает по указателям переменные t_n, t_k, n и массив time[].

Осуществляет заполнение массива времени с помощью цикла for.

Каждый следующий элемент массива изменяется на величину dt (дельта t), вычисленную по формуле

fill_array_input_voltage и fill_array_output_voltage

Работают примерно так же как и предыдущая функция. С помощью цикла for идет заполнение соответствующих массивов (расчетные формулы были описаны в разделе Анализ поставленной задачи)

length_signal

Является универсальной функцией для подсчета длительности импульса как входного, так и выходного сигнала (зависит от того, какой массив в нее передается). Функция вычисляет максимальный элемент переданного ей массива сигнала, делит его на 2 (см. по формуле в разделе Анализ поставленной задачи) и считает количество точек, удовлетворяющих условию . Далее возвращает результат , полученный по формуле:

см. раздел (Анализ поставленной задачи)

data_calculation

Функция, содержащая в себе вызовы filling_time_array, fill_array_input_voltage, fill_array_output_voltage, length_signal . Создана для объединения всех функций, выполняющих задачу вычисления и табулирования. Именно эта функция вызывается в соответствующем разделе оператора switch из функции main. Так же принимает по указателю переменные length_input_signal и length_output_signal , которым присваевает значения, возвращаемые функцией length_signal.

Файл calc.h

Данный файл подключен к файлу main.h. Содержит в себе заголовки всех функций, реализованных в модуле calc.c , а так же защиту от повторного включения.

Модуль output.c

Модуль, отвечающий за вывод данных. Включает в себя функции: printTableHeader , output_table_on_the_console , console_output_source_data, print_time_and_UInput_and_UOutput_to_file,

print_table_data_to_file

printTableHeader

Функция не принимает в себя никаких переменных и ничего не возвращает. Она лишь печатает с помощью функции printf заголовок, содержащий в себе разделительные линии и названия колонок данных.

output_table_on_the_console

Функция, которая выводит сформированные массивы на консоль в виде таблицы. Происходит это с помощью цикла for и функции printf . Так же функция выводи длительность импульса. В этой функции реализована проверка с переменной zapolneno, суть которой, как говорилось выше, сводится к тому, чтобы сравнить количество удачно прочитанных при вводе рабочего набора переменных и количество переменных по условию задачи (в 24ом варианте их 7). Если переменная zapolneno равна 7, то программа продолжает работать, если нет , то выводит соответствующее сообщение.

console_output_source_data

Данная функция выводит изначальный набор рабочих данных. Если с клавиатуры или из файла ничего не вводилось, но при этом функция была запущена, то при выводе все изначальные данные будут равны 0, так как в функции main переменные при объявлении были проинициализированы нулями. Это является примитивной, но в то же время весьма результативной защитой от некорректной работы программы. Без этой защиты, при запуске этой функции без ввода начальных данных с клавиатуры или файла будет выведен «мусор», хранящийся в переменных.

Результат работы printTableHeader, output_table_on_the_console и console_output_source_data

print_time_and_UInput_and_UOutput_to_file

Функция похожа на output_table_on_the_console. Разница заключается в том, что данная функция записывает массивы в три файла. Для этого в начале реализации функции объявлены три указателя на файловый ресурс. Далее файлы открываются на запись , после чего следует проверка существования файлов. Если проверка успешна, то программа работает. В противном случае выдается соответствующее сообщение. С помощью цикла for и функции fprintf происходит запись массивов в файлы.

Далее файлы закрываются.

print_table_data_to_file

Функция работает аналогично предыдущей. Задача этой функции - запись всей таблицы в текстовый файл. Функция использует те же средства что и предыдущая функция, а так же проверку, организованную по тому же методу, что и в предыдущей функции. После работы этой функции создается файл с названием, которое клиент задает с клавиатуры.

Файл output.h

Файл output.h подключает к себе файл main.h. В данном файле имеется защита от повторного включения, и содержатся прототипы функций, используемых в модуле output.c.

6. Тестирование программы

Тесты, подтверждающие правильность работы программы (расчёты сделаны в WxMaxima):

Тест малого сигнала

U = 1

ULimit = 10

UMax = 100

t_n = 0

t_m = 15

t_k =25

n = 51

Time

Uin

Uin Maxima

Uout

Uout Maxima

0.000

0.000

Uvh(0)=0

0.000

Uvih(0)=0

0.500

0.033

Uvh(0.5)=0.0333

0.333

Uvih(0.5)=0.333

1.000

0.067

Uvh(1.0)=0.0667

0.667

Uvih(1.0)=0.667

1.500

0.100

Uvh(1.5)=0.1

1.000

Uvih(1.5)=1.0

2.000

0.133

Uvh(2.0)=0.133

1.333

Uvih(2.0)=1.3333

2.500

0.167

Uvh(2.5)=0.167

1.667

Uvih(2.5)=1.6667

3.000

0.200

Uvh(3.0)=0.2

2.000

Uvih(3.0)=2.0

3.500

0.233

Uvh(3.5)=0.233

2.333

Uvih(3.5)=2.3333

4.000

0.267

Uvh(4.0)=0.267

2.667

Uvih(4.0)=2.6667

4.500

0.300

Uvh(4.5)=0.3

3.000

Uvih(4.5)=3.0

5.000

0.333

Uvh(5.0)=0.333

3.333

Uvih(5.0)=3.3333

5.500

0.367

Uvh(5.5)=0.367

3.667

Uvih(5.5)=3.6667

6.000

0.400

Uvh(6.0)=0.4

4.000

Uvih(6.0)=4.0

6.500

0.433

Uvh(6.5)=0.433

4.333

Uvih(6.5)=4.3333

7.000

0.467

Uvh(7.0)=0.467

4.667

Uvih(7.0)=4.6667

7.500

0.500

Uvh(7.5)=0.5

5.000

Uvih(7.5)=5.0

8.000

0.533

Uvh(8.0)=0.533

5.333

Uvih(8.0)=5.3333

8.500

0.567

Uvh(8.5)=0.567

5.667

Uvih(8.5)=5.6667

9.000

0.600

Uvh(9.0)=0.6

6.000

Uvih(9.0)=6.0

9.500

0.633

Uvh(9.5)=0.633

6.333

Uvih(9.5)=6.3333

10.000

0.667

Uvh(10.0)=0.667

6.667

Uvih(10.0)=6.6667

10.500

0.700

Uvh(10.5)=0.7

7.000

Uvih(10.5)=7.0

11.000

0.733

Uvh(11.0)=0.733

7.333

Uvih(11.0)=7.3333

11.500

0.767

Uvh(11.5)=0.767

7.667

Uvih(11.5)=7.6667

12.000

0.800

Uvh(12.0)=0.8

8.000

Uvih(12.0)=8.0

12.500

0.833

Uvh(12.5)=0.833

8.333

Uvih(12.5)=8.3333

13.000

0.867

Uvh(13.0)=0.867

8.667

Uvih(13.0)=8.6667

13.500

0.900

Uvh(13.5)=0.9

9.000

Uvih(13.5)=9.0

14.000

0.933

Uvh(14.0)=0.933

9.333

Uvih(14.0)=9.3333

14.500

0.967

Uvh(14.5)=0.967

9.667

Uvih(14.5)=9.6667

15.000

1.000

Uvh(15.0)=1.0

10.000

Uvih(15.0)=10.0

15.500

0.950

Uvh(15.5)=0.95

9.500

Uvih(15.5)=9.5

16.000

0.900

Uvh(16.0)=0.9

9.000

Uvih(16.0)=9.0

16.500

0.850

Uvh(16.5)=0.85

8.500

Uvih(16.5)=8.5

17.000

0.800

Uvh(17.0)=0.8

8.000

Uvih(17.0)=8.0

17.500

0.750

Uvh(17.5)=0.75

7.500

Uvih(17.5)=7.5

18.000

0.700

Uvh(18.0)=0.7

7.000

Uvih(18.0)=7.0

18.500

0.650

Uvh(18.5)=0.65

6.500

Uvih(18.5)=6.5

19.000

0.600

Uvh(19.0)=0.6

6.000

Uvih(19.0)=6.0

19.500

0.550

Uvh(19.5)=0.55

5.500

Uvih(19.5)=5.5

20.000

0.500

Uvh(20.0)=0.5

5.000

Uvih(20.0)=5.0

20.500

0.450

Uvh(20.5)=0.45

4.500

Uvih(20.5)=4.5

21.000

0.400

Uvh(21.0)=0.4

4.000

Uvih(21.0)=4.0

21.500

0.350

Uvh(21.5)=0.35

3.500

Uvih(21.5)=3.5

22.000

0.300

Uvh(22.0)=0.3

3.000

Uvih(22.0)=3.0

22.500

0.250

Uvh(22.5)=0.25

2.500

Uvih(22.5)=2.5

23.000

0.200

Uvh(23.0)=0.2

2.000

Uvih(23.0)=2.0

23.500

0.150

Uvh(23.5)=0.15

1.500

Uvih(23.5)=1.5

24.000

0.100

Uvh(24.0)=0.1

1.000

Uvih(24.0)=1.0

24.500

0.050

Uvh(24.5)=0.05

0.500

Uvih(24.5)=0.5

25.000

0.000

Uvh(25.0)=0.0

0.000

Uvih(25.0)=0

Тест большого сигнала

U = 20

ULimit = 10

UMax = 100

t_n = 0

t_m = 15

t_k =25

n = 51

Time

Uin

Uin Maxima

Uout

Uout Maxima

0.000

0.000

Uvh(0)=0

0.000

Uvih(0)=0

0.500

0.667

Uvh(0.5)=0.667

6.667

Uvih(0.5)=6.6667

1.000

1.333

Uvh(1.0)=1.3333

13.333

Uvih(1.0)=13.333

1.500

2.000

Uvh(1.5)=2.0

20.000

Uvih(1.5)=20.0

2.000

2.667

Uvh(2.0)=2.6667

26.667

Uvih(2.0)=26.667

2.500

3.333

Uvh(2.5)=3.3333

33.333

Uvih(2.5)=33.333

3.000

4.000

Uvh(3.0)=4.0

40.000

Uvih(3.0)=40.0

3.500

4.667

Uvh(3.5)=4.6667

46.667

Uvih(3.5)=46.667

4.000

5.333

Uvh(4.0)=5.3333

53.333

Uvih(4.0)=53.333

4.500

6.000

Uvh(4.5)=6.0

60.000

Uvih(4.5)=60.0

5.000

6.667

Uvh(5.0)=6.6667

66.667

Uvih(5.0)=66.667

5.500

7.333

Uvh(5.5)=7.3333

73.333

Uvih(5.5)=73.333

6.000

8.000

Uvh(6.0)=8.0

80.000

Uvih(6.0)=80.0

6.500

8.667

Uvh(6.5)=8.6667

86.667

Uvih(6.5)=86.667

7.000

9.333

Uvh(7.0)=9.3333

93.333

Uvih(7.0)=93.333

7.500

10.000

Uvh(7.5)=10.0

100.000

Uvih(7.5)=100.0

8.000

10.667

Uvh(8.0)=10.667

100.000

Uvih(8.0)=100

8.500

11.333

Uvh(8.5)=11.333

100.000

Uvih(8.5)=100

9.000

12.000

Uvh(9.0)=12.0

100.000

Uvih(9.0)=100

9.500

12.667

Uvh(9.5)=12.667

100.000

Uvih(9.5)=100

10.000

13.333

Uvh(10.0)=13.333

100.000

Uvih(10.0)=100

10.500

14.000

Uvh(10.5)=14.0

100.000

Uvih(10.5)=100

11.000

14.667

Uvh(11.0)=14.667

100.000

Uvih(11.0)=100

11.500

15.333

Uvh(11.5)=15.333

100.000

Uvih(11.5)=100

12.000

16.000

Uvh(12.0)=16.0

100.000

Uvih(12.0)=100

12.500

16.667

Uvh(12.5)=16.667

100.000

Uvih(12.5)=100

13.000

17.333

Uvh(13.0)=17.333

100.000

Uvih(13.0)=100

13.500

18.000

Uvh(13.5)=18.0

100.000

Uvih(13.5)=100

14.000

18.667

Uvh(14.0)=18.667

100.000

Uvih(14.0)=100

14.500

19.333

Uvh(14.5)=19.333

100.000

Uvih(14.5)=100

15.000

20.000

Uvh(15.0)=20.0

100.000

Uvih(15.0)=100

15.500

19.000

Uvh(15.5)=19.0

100.000

Uvih(15.5)=100

16.000

18.000

Uvh(16.0)=18.0

100.000

Uvih(16.0)=100

16.500

17.000

Uvh(16.5)=17.0

100.000

Uvih(16.5)=100

17.000

16.000

Uvh(17.0)=16.0

100.000

Uvih(17.0)=100

17.500

15.000

Uvh(17.5)=15.0

100.000

Uvih(17.5)=100

18.000

14.000

Uvh(18.0)=14.0

100.000

Uvih(18.0)=100

18.500

13.000

Uvh(18.5)=13.0

100.000

Uvih(18.5)=100

19.000

12.000

Uvh(19.0)=12.0

100.000

Uvih(19.0)=100

19.500

11.000

Uvh(19.5)=11.0

100.000

Uvih(19.5)=100

20.000

10.000

Uvh(20.0)=10.0

100.000

Uvih(20.0)=100.0

20.500

9.000

Uvh(20.5)=9.0

90.000

Uvih(20.5)=90.0

21.000

8.000

Uvh(21.0)=8.0

80.000

Uvih(21.0)=80.0

21.500

7.000

Uvh(21.5)=7.0

70.000

Uvih(21.5)=70.0

22.000

6.000

Uvh(22.0)=6.0

60.000

Uvih(22.0)=60.0

22.500

5.000

Uvh(22.5)=5.0

50.000

Uvih(22.5)=50.0

23.000

4.000

Uvh(23.0)=4.0

40.000

Uvih(23.0)=40.0

23.500

3.000

Uvh(23.5)=3.0

30.000

Uvih(23.5)=30.0

24.000

2.000

Uvh(24.0)=2.0

20.000

Uvih(24.0)=20.0

24.500

1.000

Uvh(24.5)=1.0

10.000

Uvih(24.5)=10.0

25.000

0.000

Uvh(25.0)=0.0

0.000

Uvih(25.0)=0

Контрольный расчёт

U = 50

ULimit = 10

UMax = 50

t_n = 2

t_m = 15

t_k =25

n = 24

Time

Uin

Uin Maxima

Uout

Uout Maxima

2.000

0.000

Uvh(2)=0

0.000

Uvih(2)=0

3.000

3.846

Uvh(3)=3.8462

19.231

Uvih(3)=19.231

4.000

7.692

Uvh(4)=7.6923

38.462

Uvih(4)=38.462

5.000

11.538

Uvh(5)=11.538

50.000

Uvih(5)=50

6.000

15.385

Uvh(6)=15.385

50.000

Uvih(6)=50

7.000

19.231

Uvh(7)=19.231

50.000

Uvih(7)=50

8.000

23.077

Uvh(8)=23.077

50.000

Uvih(8)=50

9.000

26.923

Uvh(9)=26.923

50.000

Uvih(9)=50

10.000

30.769

Uvh(10)=30.769

50.000

Uvih(10)=50

11.000

34.615

Uvh(11)=34.615

50.000

Uvih(11)=50

12.000

38.462

Uvh(12)=38.462

50.000

Uvih(12)=50

13.000

42.308

Uvh(13)=42.308

50.000

Uvih(13)=50

14.000

46.154

Uvh(14)=46.154

50.000

Uvih(14)=50

15.000

50.000

Uvh(15)=50

50.000

Uvih(15)=50

16.000

45.000

Uvh(16)=45

50.000

Uvih(16)=50

17.000

40.000

Uvh(17)=40

50.000

Uvih(17)=50

18.000

35.000

Uvh(18)=35

50.000

Uvih(18)=50

19.000

30.000

Uvh(19)=30

50.000

Uvih(19)=50

20.000

25.000

Uvh(20)=25

50.000

Uvih(20)=50

21.000

20.000

Uvh(21)=20

50.000

Uvih(21)=50

22.000

15.000

Uvh(22)=15

50.000

Uvih(22)=50

23.000

10.000

Uvh(23)=10

50.000

Uvih(23)=50

24.000

5.000

Uvh(24)=5

25.000

Uvih(24)=25

25.000

0.000

Uvh(25)=0

0.000

Uvih(25)=0

2.000

0.000

Uvh(2)=0

0.000

Uvih(2)=0

7. Графики

Uin контрольный расчет

Uout контрольный расчет

Uin малого сигнала

Uout малого сигнала

Uin большого сигнала

Uout большего сигнала

Выводы

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

Инструкция пользователю

Пользователю предлагается запустить программу по вычислению входного и выходного сигналов, а также длительностей импульса этих сигналов.

Ввести число 1 для ввода данных с клавиатуры.

Нажмите 2 для вывода вычислений на консоль (функция доступна только после ввода данных с клавиатуры или из файла)

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

Нажмите 4 для сохранения данных в текстовый файл. Если не проводилось никаких вычислений, но данная опция была выбрана, файлы будут пустыми. Программа сохраняет данные в 4 файла. Три из них находятся в специальной папке TableAndDataForPlot и служат для построения графика с помощью программы WxMaxima. Последний файл с именем, указанным клиентом находится в общей папки проекта и может быть считан программой после выбора соответствующей команды. Не забудьте после имени через точку указать формат файла (например all_data.txt)

Если необходимо вывести длительности импульса без вывода всей таблицы, нажмите 5.

Для построения графиков используйте специальный файл программы WxMaxima Plot_2d.wxm , который прилагается в качестве бонуса к данной программе. Данный файл находится в общей папке проекта вместе с файлами .с . Для построения графика запустите запустите Plot_2d.wxm и нажмите ctrl+r.

Для выхода из программы при выборе команды нажмите 0.

Исходный код

Ниже приведен исходный код программы, написанный в среде разработки Visual studio express 2010

10.1. файлы .c

main.c

#include"input.h"

#include "calc.h"

#include "output.h"

int main (void)

{

double length_input_signal = 0, length_output_signal = 0, U =0, ULimit=0, UMax =0, t_n=0 , t_m =0, t_k =0, time[MAXSIZE] , UInput[MAXSIZE], UOutput[MAXSIZE];

int n =0, choise, zapolneno =0 ;

system("chcp 1251 > nul");

while (choise = menu())

{

system("cls");

switch (choise)

{

case 1:

enter_data(&U, &ULimit, &UMax, &t_n, &t_m, &t_k, &n, &zapolneno);

data_calculation (&length_input_signal, &length_output_signal, t_n,

t_k, n, t_m, time, U, UInput, ULimit, UMax, UOutput);

break;

case 2:

console_output_source_data ( ULimit, UMax, U, t_m, t_n, t_k, n );

output_table_on_the_console (time, UInput, UOutput, n,

length_input_signal, length_output_signal, &zapolneno);

break;

case 3:

input_from_file ( &U, &ULimit, &UMax, &t_n, &t_k, &t_m, &n, &length_input_signal,

&length_output_signal, time, UInput, UOutput, &zapolneno);

break;

case 4:

print_time_and_UInput_and_UOutput_to_file ( UInput, UOutput, time, n);

print_table_data_to_file ( time, UInput, UOutput, ULimit, UMax, U, t_m,

t_n, t_k, n, length_input_signal, length_output_signal);

break;

case 5:

printf("Длительность входного сигнала = %8.3lf\n\n",length_input_signal);

printf("Длительность выходного сигнала = %8.3lf\n\n",length_output_signal);

break;

default:

printf("Команда выбранна неверно. Пожалуйста повторите выбор\n");

break;

}

system ("pause");

}

return 0;

}

menu.c

#include "menu.h"

int menu ()

{

int w;

system("cls");

printf("________________________Menu___________________________\n");

printf("\t 0 - Выход из программы\n");

printf("\t 1 - Ввод данных с клавиатуры\n");

printf("\t 2 - Вывод результатов на консоль \n");

printf("\t 3 - Ввод данных из файла\n");

printf("\t 4 - Сохранение всех данных в текстовые файлы \n");

printf("\t 5 - Вывести только длительность импульса \n");

printf("\n\n\t Ваш выбор: ");

scanf("%d",&w);

return w;

}

calc.c

#include"calc.h"

void fill_time_array (double t_n, double t_k, double time[], int n )

{

double t = t_n, dt;

int i;

dt = (t_k - t_n)/(n - 1);

for (i=0 ; i < n; i++)

{

time[i] = t ;

t+=dt;

}

}

void fill_array_input_voltage (double t_n, double t_m, double t_k ,double time[], double U, double UInput[], int n)

{

int i;

for (i=0; i < n ; i++)

if (time[i] <= t_m)

UInput[i]= (U * (time[i] - t_n)) / (t_m - t_n);

else

UInput[i]= (U * (t_k - time[i])) / (t_k - t_m)

}

void fill_array_output_voltage (int n, double ULimit, double UMax, double UInput[], double UOutput[])

{

int i;

for(i = 0; i < n ; i++)

if (UInput[i] <= 0)

UOutput[i]= 0;

else if (UInput[i] <= ULimit)

UOutput[i] = (UMax * UInput[i])/ULimit;

else

UOutput[i] = UMax;

}

double length_signal(double t_k, double t_n, int n, const double signal[])

{

int i;

int count = 0;

double dt = (t_k - t_n)/(n - 1);

double max_signal = signal[0];

for(i = 1; i < n ; i++)

if( signal[i] > max_signal )

max_signal = signal[i];

for(i = 0; i < n ; i++)

if(signal[i] >= max_signal*0.5)

count++;

return (count - 1) * dt;

}

void data_calculation (double *length_input_signal, double *length_output_signal ,double t_n, double t_k, int n, double t_m ,double time[], double U, double UInput[], double ULimit,double UMax, double UOutput[],int *zapolneno )

{

fill_time_array ( t_n, t_k, time, n );

fill_array_input_voltage (t_n, t_m, t_k , time, U, UInput, n);

fill_array_output_voltage (n, ULimit, UMax, UInput, UOutput);

*length_input_signal = length_signal(t_k, t_n, n, UInput);

*length_output_signal= length_signal(t_k, t_n, n, UOutput);

}

Input.c

#include "input.h"

void enter_data(double*U, double*ULimit, double*UMax, double*t_n, double*t_m, double*t_k, int*n, int *zapolneno )

{

printf("Ввод начального напряжения U =");

if( scanf("%lf", U) ==1)

*zapolneno+=1;

printf("Пороговое напряжение Uporog =");

if( scanf("%lf", ULimit) ==1)

*zapolneno+=1;

printf("Максимальное напряжение Umax =");

if (scanf("%lf", UMax)== 1)

*zapolneno+=1;

printf("Начальное время =");

if (scanf("%lf", t_n) ==1)

*zapolneno +=1;

printf("Время в момент максимального напряжения t_m =");

if( scanf("%lf",t_m) == 1)

*zapolneno +=1;

printf("Конечное время =");

if( scanf("%lf", t_k) == 1)

*zapolneno+=1;

printf("Число точек =");

if( scanf("%d", n) == 1)

*zapolneno+=1;

if(*t_n < *t_m && *t_n < *t_k && *t_m < *t_k && *n > 0 && *U >= 0 && *ULimit >= 0 && *UMax >= 0)

printf("Данные корректны \n");

else

{

printf("Данные не корректны. Программа будет закрыта\n\n");

exit(0);

}

}

void input_from_file (double *U, double *ULimit, double *UMax, double *t_n, double *t_k, double *t_m, int *n, double *length_input_signal, double *length_output_signal, double time[], double UInput[], double UOutput[],int* zapolneno)

{

int i;

FILE* in_txt;

char file_name[MLEN];

char buf[MAXSIZE];

*zapolneno=0;

printf( "Введите имя файла: \n");

scanf("%s",file_name);

in_txt = fopen(file_name, "r");

if (in_txt != NULL)

{

fgets(buf, sizeof(buf),in_txt);

if( fscanf(in_txt, "%lf%lf%lf%lf%lf%lf%d",U, ULimit, UMax, t_n, t_m, t_k, n) == 7)

{

*zapolneno+=7;

}

fgets(buf, sizeof(buf),in_txt);

fgets(buf, sizeof(buf),in_txt);

fgets(buf, sizeof(buf),in_txt);

fgets(buf, sizeof(buf),in_txt);

fgets(buf, sizeof(buf),in_txt);

fgets(buf, sizeof(buf),in_txt);

for (i = 0 ; i < *n ; i++)

fscanf(in_txt,"%*d%lf%lf%lf",&time[i], &UInput[i], &UOutput[i]);

fgets(buf, sizeof(buf),in_txt);

fgets(buf, sizeof(buf),in_txt);

fgets(buf, sizeof(buf),in_txt);

fscanf(in_txt, "%lf%lf", length_input_signal, length_output_signal );

fclose(in_txt);

}

else

printf("Файл не удалось открыть %s \n", file_name);

}

outout.c

#include"output.h"

void printTableHeader()

{

printf("%6s%15s%15s%15s\n", "I", "Time", "Uin", "Uout");

printf("__________________________________________________\n\n");

}

void output_table_on_the_console (double time[],double UInput[],double UOutput[],int n, double length_input_signal ,double length_output_signal,int*zapolneno )

{

if (*zapolneno == 7)

{

int i;

printTableHeader();

for (i=0; i < n ; i++)

{

printf("%6i%15.3lf%15.3lf%15.3lf\n", i, time[i], UInput[i], UOutput[i]);

}

printf("___________________________________________________________________\n\n");

printf("Length_in = %8.3lf\n", length_input_signal);

printf("Length_out = %8.3lf\n", length_output_signal);

printf("_________________________________________________\n\n");

}

else

printf("Не было ввода данных или при вводе произошел сбой. Пожалуйста повторите попытку\n\n");

}

void console_output_source_data (double ULimit, double UMax, double U, double t_m, double t_n, double t_k, int n )

{

printf("Uporog = %8.3lf\n", ULimit);

printf("Umax = %8.3lf\n", UMax);

printf("U = %8.3lf\n", U);

printf("t_m = %8.3lf\n", t_m);

printf("t_n = %8.3lf\n", t_n);

printf("t_k = %8.3lf\n", t_k);

printf("Kol-vo\ntochek = %8d\n", n);

printf("________________________________________\n\n");

}

void print_time_and_UInput_and_UOutput_to_file (double UInput[], double UOutput[], double time[],int n)

{

FILE * timeFile;

FILE * uInFile;

FILE * uOutFile;

int i;

printf("Запись массивов в файл... ");

timeFile = fopen("TableAndDataForPlot\\massiv_t.txt", "wt");

uInFile = fopen("TableAndDataForPlot\\massiv_u_in.txt", "wt");

uOutFile = fopen("TableAndDataForPlot\\massiv_u_out.txt", "wt");

if (timeFile==NULL && uInFile==NULL && uOutFile==NULL)

{

printf("Ошибка. Один из запрашиваемых файлов не найден");

exit(0);

}

for (i = 0; i < n; i++)

{

fprintf(timeFile, "\n %6.3lf", time[i]);

fprintf(uInFile, "\n %6.3lf", UInput[i]);

fprintf(uOutFile, "\n %6.3lf", UOutput[i]);

}

fclose(timeFile);

fclose(uInFile);

fclose(uOutFile);

}

void print_table_data_to_file ( double time[], double Uin[], double Uout[], double ULimit, double UMax, double U, double t_m, double t_n, double t_k, int n,double length_input_signal, double length_output_signal)

{

int i;

FILE *table_data_file;

char file_name[MLEN];

printf( "Введите имя файла: \n");

scanf("%s",file_name);

table_data_file = fopen(file_name, "wt");

if(table_data_file == NULL)

{

printf("Ошибка. Файл не обнаружен");

exit(0);

}

fprintf(table_data_file, "%6s%10s%10s%10s%10s%10s%10s\n", "U", "ULimit", "UMax", "t_n" , "t_m", "t_k", "n" );

fprintf(table_data_file, "%6.3lf%10.3lf%10.3lf%10.3lf%10.3lf%10.3lf%10d\n", U, ULimit, UMax, t_n , t_m, t_k, n );

fprintf(table_data_file, "\n");

fprintf(table_data_file, "_________________________________________________________\n\n");

fprintf(table_data_file, "%6s%15s%15s%15s\n", "I", "Time", "Uin", "Uout");

fprintf(table_data_file, "________________________________________________________________\n\n");

for (i=0; i < n ; i++)

{

fprintf(table_data_file, "%6i%15.3lf%15.3lf%15.3lf\n", i, time[i], Uin[i], Uout[i]);

}

fprintf(table_data_file, "______________________________________\n");

fprintf(table_data_file, "%6s%25s\n","length_input_signal","length_output_signal");

fprintf(table_data_file, " %6.3lf%25.3lf", length_input_signal, length_output_signal);

printf("ready.\n\n");

fclose(table_data_file);

}

файлы .h

main.h

#ifndef _MAIN

#define _MAIN

#define MLEN 30

#include<stdio.h>

#include<stdlib.h>

#define MAXSIZE 400

#include<Windows.h>

#endif

menu.h

#include"main.h"

#ifndef _MENU

#define _MENU

int menu ();

#endif

calc.h

#include "main.h"

#ifndef _CALC

#define _CALC

void filling_time_array (double t_n, double t_k,double time[], int n );

void fill_array_input_voltage (double t_n, double t_m, double t_k ,double time[], double U, double UInput[], int n);

void fill_array_output_voltage (int n, double ULimit, double UMax, double UInput, double UOutput);

double length_signal(double t_k, double t_n, int n, const double signal[]);

void data_calculation (double *length_input_signal, double *length_output_signal, double t_n, double t_k, int n, double t_m ,double time[], double U, double UInput[], double ULimit,double UMax, double UOutput[]) ;

#endif

input.h

#include"main.h"

#ifndef _INPUT

#define _INPUT

void enter_data(double*U, double*ULimit, double*UMax, double*t_n, double*t_m, double*t_k, int*n, int*zapolneno);

void input_from_file (double *U, double *ULimit, double *UMax, double *t_n, double *t_k, double *t_m, int *n, double *length_input_signal, double *length_output_signal, double time[], double UInput[], double UOutput[],int* zapolneno);

#endif

output.h

#include "main.h"

#ifndef _OUTPUT

#define _OUTPUT

void output_table_on_the_console (double time[],double UInput[],double UOutput[],int n,double length_input_signal,double length_output_signal, int*zapolneno );

void printTableHeader();

void console_output_source_data (double ULimit, double UMax, double U, double t_m, double t_n, double t_k, int n );

void print_time_and_UInput_and_UOutput_to_file (double UInput[], double UOutput[], double time[],int n);

void console_output_source_data (double ULimit, double UMax, double U, double t_m, double t_n, double t_k, int n ) ;

void print_table_data_to_file (const double time[],const double UInput[], const double UOutput[], double ULimit, double UMax, double U, double t_m, double t_n, double t_k, int n,double length_input_signal, double length_output_signal );

#endif

Источники

программа табулирование сигнал

1) Мария Полубенцева Процедурное программирование на языке C/C+

2) «Практикум по программированию на языке Си», С. В. Козин, Н. А. Матиясевич, СПб 2008

3) «Информатика. Анализ сигнала на выходе электрической цепи. Методические указания к курсовой работе», Л. Н. Бережной, И. О. Воронцова, Д. В. Окунева, СПб 2012

Размещено на Allbest.ru


Подобные документы

  • Анализ частотных и временных характеристик цепи. Влияние изменяемого параметра цепи на частотные характеристики. Нахождение выходного сигнала методом интеграла наложения. Построение графика входного и выходного сигнала при увеличении входного импульса.

    курсовая работа [193,5 K], добавлен 01.10.2014

  • Предпосылки к созданию радиотехники. Методы анализа линейных цепей. Спектральный анализ трапециевидного одиночного импульса с последующим синтезом цепи и определением выходного сигнала. Разработка программного обеспечение и осуществление расчета на ЭВМ.

    курсовая работа [1,5 M], добавлен 20.09.2016

  • Нахождение корреляционной функции входного сигнала. Спектральный и частотный анализ входного сигнала, амплитудно-частотная и фазочастотная характеристика. Переходная и импульсная характеристика цепи. Определение спектральной плотности выходного сигнала.

    курсовая работа [781,9 K], добавлен 27.04.2012

  • Определение корреляционной функции входного сигнала, расчет его амплитудного и фазового спектра. Характеристики цепи: амплитудно-частотная, фазо-частотная, переходная, импульсная. Вычисление спектральной плотности и построение графика выходного сигнала.

    курсовая работа [986,4 K], добавлен 18.12.2013

  • Анализ прохождения сигнала через линейное устройство. Анализ выходного сигнала на основании спектрального метода. Передаточная функция линейного устройства и его схема. Анализ спектра выходного сигнала. Расчёт коэффициента усиления по постоянному току.

    курсовая работа [168,3 K], добавлен 25.05.2012

  • Определение передаточной функции цепи и спектра периодического входного сигнала. Вычисление спектра реакции при воздействии одиночного импульса. Изучение спектральных характеристик одиночного импульса воздействия. Составление уравнений состояний цепи.

    курсовая работа [405,0 K], добавлен 21.04.2016

  • Моделирование прямоугольного импульса с определенной длительностью фронта. Синтезирование электрической принципиальной схемы с учетом параметров элементов. Графики входных и выходных напряжений. Влияние длительности фронта на искажение выходного сигнала.

    лабораторная работа [216,6 K], добавлен 16.06.2009

  • Определение передаточной функции цепи. Анализ частотных, временных, спектральных характеристик радиотехнических цепей. Исследование влияния параметров цепи на характеристики выходного сигнала. Нахождение выходного сигнала методом интеграла наложения.

    курсовая работа [607,6 K], добавлен 09.08.2012

  • Методы определения отклика пассивной линейной цепи на воздействие входного сигнала. Расчет входного сигнала. Определение дифференциального уравнения относительно отклика цепи по методу уравнений Кирхгофа. Расчет временных и частотных характеристик цепи.

    курсовая работа [269,2 K], добавлен 06.06.2010

  • Вычисление переходной характеристики цепи. Определение реакции цепи на импульс заданной формы с помощью интеграла Дюамеля. Связь между импульсной характеристикой и передаточной функцией цепи. Вычисление дискретного сигнала на выходе цепи, синтез схемы.

    курсовая работа [296,3 K], добавлен 09.09.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.