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

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Файл 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"