Анализ сигнала на выходе электрической цепи
Эти команды и есть воплощение в жизнь работы меню. Предусмотрена так же защита от некорректного ввода номера команды с помощью зарезервированного слова default, стоящего после последнего case. В случае если введенное с клавиатуры число не соответствует ни одной команде, программа выдаст на консоль сообщение о некорректности введенного номера. При этом работа программы не завершиться. Программа… Читать ещё >
Анализ сигнала на выходе электрической цепи (реферат, курсовая, диплом, контрольная)
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.3lfnn», length_input_signal);
printf («Длительность выходного сигнала = %8.3lfnn», 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 («nnt Ваш выбор: «);
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 («Данные не корректны. Программа будет закрытаnn»);
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%15sn», «I», «Time», «Uin», «Uout»);
printf («__________________________________________________nn»);
}
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.3lfn», i, time[i], UInput[i], UOutput[i]);
}
printf («___________________________________________________________________nn»);
printf («Length_in = %8.3lfn», length_input_signal);
printf («Length_out = %8.3lfn», length_output_signal);
printf («_________________________________________________nn»);
}
else
printf («Не было ввода данных или при вводе произошел сбой. Пожалуйста повторите попыткуnn»);
}
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.3lfn», ULimit);
printf («Umax = %8.3lfn», UMax);
printf («U = %8.3lfn», U);
printf («t_m = %8.3lfn», t_m);
printf («t_n = %8.3lfn», t_n);
printf («t_k = %8.3lfn», t_k);
printf («Kol-vontochek = %8dn», n);
printf («________________________________________nn»);
}
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%10sn», «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%10dn», U, ULimit, UMax, t_n, t_m, t_k, n);
fprintf (table_data_file, «n»);
fprintf (table_data_file, «_________________________________________________________nn»);
fprintf (table_data_file, «%6s%15s%15s%15sn», «I», «Time», «Uin», «Uout»);
fprintf (table_data_file, «________________________________________________________________nn»);
for (i=0; i < n; i++)
{
fprintf (table_data_file, «%6i%15.3lf%15.3lf%15.3lfn», i, time[i], Uin[i], Uout[i]);
}
fprintf (table_data_file, «______________________________________n»);
fprintf (table_data_file, «%6s%25sn» ," length_input_signal" ," length_output_signal");
fprintf (table_data_file, «%6.3lf%25.3lf», length_input_signal, length_output_signal);
printf («ready.nn»);
fclose (table_data_file);
}
файлы .h
main.h
#ifndef _MAIN
#define _MAIN
#define MLEN 30
#include
#include
#define MAXSIZE 400
#include
#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