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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информатика, ВТ, телекоммуникации
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,15 Мб
  • Опубликовано:
    2015-04-27
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

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

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

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

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

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

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


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

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

,

,

.

,

,

,

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

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


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

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

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

Точка

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


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

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


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


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


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


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

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

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



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


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


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


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


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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

Модуль 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:

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

) 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. _data

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

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

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

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

увеличивать переменную zapolneno на 1, после каждого удачного считывания. Далее при запросе вывода данных, проверяется условие того, что переменная zapolneno действительно равна 7._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), вычисленную по формуле

_array_input_voltage и fill_array_output_voltage

Работают примерно так же как и предыдущая функция. С помощью цикла for идет заполнение соответствующих массивов (расчетные формулы были описаны в разделе Анализ поставленной задачи)_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,_table_data_to_file

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

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

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

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

Файл output.h

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

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

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

Тест малого сигнала= 1= 10

UMax = 100_n = 0_m = 15_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

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


Тест большого сигнала= 20= 10= 100_n = 0_m = 15_k =25= 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


Контрольный расчёт= 50= 10= 50_n = 2_m = 15_k =25= 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

 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. Графики

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

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

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

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

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

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




Выводы

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

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

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

Ввести число 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.c

#include"input.h"

#include "calc.h"

#include "output.h"main (void)

{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]; n =0, choise, zapolneno =0 ;("chcp 1251 > nul");(choise = menu())

{("cls");(choise)

{1:_data(&U, &ULimit, &UMax, &t_n, &t_m, &t_k, &n, &zapolneno); _calculation (&length_input_signal, &length_output_signal, t_n, _k, n, t_m, time, U, UInput, ULimit, UMax, UOutput);;2: _output_source_data ( ULimit, UMax, U, t_m, t_n, t_k, n ); _table_on_the_console (time, UInput, UOutput, n, _input_signal, length_output_signal, &zapolneno); ;3:_from_file ( &U, &ULimit, &UMax, &t_n, &t_k, &t_m, &n, &length_input_signal,

&length_output_signal, time, UInput, UOutput, &zapolneno);;4:_time_and_UInput_and_UOutput_to_file ( UInput, UOutput, time, n);_table_data_to_file ( time, UInput, UOutput, ULimit, UMax, U, t_m, _n, t_k, n, length_input_signal, length_output_signal);;5:("Длительность входного сигнала = %8.3lf\n\n",length_input_signal);("Длительность выходного сигнала = %8.3lf\n\n",length_output_signal);

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

break;

}("pause");

} 0;

}.c

#include "menu.h"menu ()

{w;("cls");("________________________Menu___________________________\n");("\t 0 - Выход из программы\n");("\t 1 - Ввод данных с клавиатуры\n");("\t 2 - Вывод результатов на консоль \n");("\t 3 - Ввод данных из файла\n");("\t 4 - Сохранение всех данных в текстовые файлы \n");("\t 5 - Вывести только длительность импульса \n");("\n\n\t Ваш выбор: ");

scanf("%d",&w);w;

}.c

#include"calc.h"fill_time_array (double t_n, double t_k, double time[], int n )

{t = t_n, dt;i;= (t_k - t_n)/(n - 1);(i=0 ; i < n; i++)

{[i] = t ;+=dt;

}

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

{i;(i=0; i < n ; i++)(time[i] <= t_m) [i]= (U * (time[i] - t_n)) / (t_m - t_n);[i]= (U * (t_k - time[i])) / (t_k - t_m)

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

{i;(i = 0; i < n ; i++) (UInput[i] <= 0) [i]= 0;if (UInput[i] <= ULimit)[i] = (UMax * UInput[i])/ULimit;[i] = UMax;

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

{i;count = 0;dt = (t_k - t_n)/(n - 1);max_signal = signal[0];(i = 1; i < n ; i++)( signal[i] > max_signal )_signal = signal[i];(i = 0; i < n ; i++)(signal[i] >= max_signal*0.5)++;(count - 1) * dt;

}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 )

{_time_array ( t_n, t_k, time, n );_array_input_voltage (t_n, t_m, t_k , time, U, UInput, n);_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);

}.c

#include "input.h"enter_data(double*U, double*ULimit, double*UMax, double*t_n, double*t_m, double*t_k, int*n, int *zapolneno )

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

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

*zapolneno+=1;("Пороговое напряжение Uporog =");( scanf("%lf", ULimit) ==1)

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

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

*zapolneno+=1;("Начальное время =");(scanf("%lf", t_n) ==1)

*zapolneno +=1;

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

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

*zapolneno +=1;("Конечное время =");( scanf("%lf", t_k) == 1)

*zapolneno+=1;("Число точек =");( scanf("%d", n) == 1)

*zapolneno+=1;(*t_n < *t_m && *t_n < *t_k && *t_m < *t_k && *n > 0 && *U >= 0 && *ULimit >= 0 && *UMax >= 0)

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

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

exit(0);

}

}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)

{i; * in_txt; file_name[MLEN];buf[MAXSIZE];

*zapolneno=0;( "Введите имя файла: \n");("%s",file_name);_txt = fopen(file_name, "r");(in_txt != NULL)

{(buf, sizeof(buf),in_txt);( fscanf(in_txt, "%lf%lf%lf%lf%lf%lf%d",U, ULimit, UMax, t_n, t_m, t_k, n) == 7)

{

*zapolneno+=7;

}(buf, sizeof(buf),in_txt);(buf, sizeof(buf),in_txt);(buf, sizeof(buf),in_txt);(buf, sizeof(buf),in_txt);(buf, sizeof(buf),in_txt);(buf, sizeof(buf),in_txt);(i = 0 ; i < *n ; i++)(in_txt,"%*d%lf%lf%lf",&time[i], &UInput[i], &UOutput[i]); (buf, sizeof(buf),in_txt);(buf, sizeof(buf),in_txt);(buf, sizeof(buf),in_txt);(in_txt, "%lf%lf", length_input_signal, length_output_signal ); (in_txt);

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

}.c

#include"output.h"printTableHeader()

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

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

{(*zapolneno == 7)

{i;

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

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

}("___________________________________________________________________\n\n");("Length_in = %8.3lf\n", length_input_signal);("Length_out = %8.3lf\n", length_output_signal);

printf("_________________________________________________\n\n");

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

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

{("Uporog = %8.3lf\n", ULimit);("Umax = %8.3lf\n", UMax);("U = %8.3lf\n", U);("t_m = %8.3lf\n", t_m);("t_n = %8.3lf\n", t_n);("t_k = %8.3lf\n", t_k);("Kol-vo\ntochek = %8d\n", n);("________________________________________\n\n");

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

{* timeFile;* uInFile;* uOutFile;

int i;("Запись массивов в файл... ");= fopen("TableAndDataForPlot\\massiv_t.txt", "wt");= fopen("TableAndDataForPlot\\massiv_u_in.txt", "wt");= fopen("TableAndDataForPlot\\massiv_u_out.txt", "wt");(timeFile==NULL && uInFile==NULL && uOutFile==NULL)

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

exit(0);

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

{(timeFile, "\n %6.3lf", time[i]);(uInFile, "\n %6.3lf", UInput[i]);(uOutFile, "\n %6.3lf", UOutput[i]);

}(timeFile);(uInFile);(uOutFile);

}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)

{i;*table_data_file; file_name[MLEN]; ( "Введите имя файла: \n");("%s",file_name);_data_file = fopen(file_name, "wt");(table_data_file == NULL)

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

exit(0);

}(table_data_file, "%6s%10s%10s%10s%10s%10s%10s\n", "U", "ULimit", "UMax", "t_n" , "t_m", "t_k", "n" );(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 );(table_data_file, "\n");(table_data_file, "_________________________________________________________\n\n");(table_data_file, "%6s%15s%15s%15s\n", "I", "Time", "Uin", "Uout");(table_data_file, "________________________________________________________________\n\n");(i=0; i < n ; i++)

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

}(table_data_file, "______________________________________\n");(table_data_file, "%6s%25s\n","length_input_signal","length_output_signal");(table_data_file, " %6.3lf%25.3lf", length_input_signal, length_output_signal);("ready.\n\n"); (table_data_file);

}

файлы .h.h

#ifndef _MAIN

#define _MAIN

#define MLEN 30

#include<stdio.h>

#include<stdlib.h>

#define MAXSIZE 400

#include<Windows.h>

#endif .h

#include"main.h"

#ifndef _MENU

#define _MENUmenu ();

#endif.h

#include "main.h"

#ifndef _CALC

#define _CALCfilling_time_array (double t_n, double t_k,double time[], int n );fill_array_input_voltage (double t_n, double t_m, double t_k ,double time[], double U, double UInput[], int n);fill_array_output_voltage (int n, double ULimit, double UMax, double UInput, double UOutput);length_signal(double t_k, double t_n, int n, const double signal[]);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.h

#include"main.h"

#ifndef _INPUT

#define _INPUTenter_data(double*U, double*ULimit, double*UMax, double*t_n, double*t_m, double*t_k, int*n, int*zapolneno);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.h

#include "main.h"

#ifndef _OUTPUT

#define _OUTPUToutput_table_on_the_console (double time[],double UInput[],double UOutput[],int n,double length_input_signal,double length_output_signal, int*zapolneno );printTableHeader();console_output_source_data (double ULimit, double UMax, double U, double t_m, double t_n, double t_k, int n );print_time_and_UInput_and_UOutput_to_file (double UInput[], double UOutput[], double time[],int n);console_output_source_data (double ULimit, double UMax, double U, double t_m, double t_n, double t_k, int n ) ;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+

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

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

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!