Анализ сигнала на выходе электрической цепи
Здесь описываются директивы препроцессора и глобальные определения, необходимые для работы программы — объявления функций и глобальных переменных. Void write_data () — записывает в файл data. txt рабочие данные и массивы времени, входного и выходного напряжения в виде таблицы. Void display_data () — функция, выводящая на экран массивы времени, входного и выходного напряжения в виде таблицы… Читать ещё >
Анализ сигнала на выходе электрической цепи (реферат, курсовая, диплом, контрольная)
Курсовая работа по программированию на тему:
Анализ сигнала на выходе электрической цепи
1. Описание задачи:
2. Анализ поставленной задачи
3. Разработка структуры программы
4. Тестирование программы Заключение Использованная литература Приложение
Целью этой курсовой работы является получение навыков в разработке программного обеспечения на языке C, а также анализ и решение поставленной задачи и обоснование выбранных методов реализации программы.
1. Описание задачи:
Имеется электрическая цепь, на вход которой подаётся определённый сигнал Uвх. Необходимо по заданному входному сигналу определить сигнал на выходе цепи (Uвых)
Входной сигнал задаётся на временном отрезке в соответствии с графиком:
Рабочий набор:
T нач = 0, t кон = 20
t1 = 10
a = 50В
b = 0.75 1/c
c = 5 1/c
Сигнал на выходе формируется в соответствии с передаточной характеристикой:
Рабочий набор:
U1 = 20 В
U2 = 100 В Также требуется рассчитать длительность переднего фронта входного и выходного сигнала
2. Анализ поставленной задачи
Рассмотрим график входного сигнала. Он описывается данной функцией:
На промежутке от t нач до t1: Uvx (t) =
На промежутке от t 1 до t кон: Uvx (t) =
Выходной сигнал описан функцией, которая зависит от входного сигнала:
Очевидно, что на графике отражены две функции. Одна из них описывается уравнением:
Uвых (Uвх) = U1 / U2 * Uвх Вторая формула:
Uвых (Uвх) = U2
Таким образом, можно ввести систему уравнений для выходного сигнала:
Uвых (Uвх) = U1 / U2 * Uвх при Uвх < U1
Uвых (Uвх) = U2, при Uвх > U1
Таким образом, график функции Uвых (Uвх (t)) будет выглядеть вот так:
3. Разработка структуры программы
Программа разбита на функции, выполняющие свои задачи. Функции будут сгруппированы в модули, решающие схожие задачи. Возможны различные варианты организации структуры — программа может состоять из единственного файла, но гораздо целесообразнее разбить ее на модули. Разбиение на модули может происходить по-разному, но исходя из задач программы, в которые входит, помимо вычислений, и работа с файлами, как для ввода, так и для вывода данных, были выделены главный модуль, являющийся связующим звеном и содержащий меню программы, модуль, отвечающий за вычисления и модуль, отвечающий за работу с файлами. Роль массивов в реализации функций программы существенна — эта структура данных, представляющая собой набор элементов одного типа, позволяет нам с легкостью хранить и обращаться к данным программы независимо от их объема. Программа состоит из следующих модулей:
Заголовочный файл mainheader.h
Здесь описываются директивы препроцессора и глобальные определения, необходимые для работы программы — объявления функций и глобальных переменных.
Модуль main.сpp
Содержит объявления всех глобальных переменных, функцию main () а также функции input_data () и display_data ()
Глобальные переменные:
Массивы времени, входных и выходных данных
double time[N];
double Uvx[N];
double Uvix[N];
Переменные рабочего набора
double t_begin = 0, t_end = 20, t1 = 10;
double a = 50, b = 0.75, c = 5;
double U1 = 20, U2 = 100;
Функция main () является главной связующей между всеми модулями и функциями программы. В ней объявляются массивы данных и переменные рабочего набора и содержится главный цикл, который выполняется до тех пор, пока пользователь не выберет опцию выхода.
void Input_data () — функция, позволяющая ввести рабочие данные.
void display_data () — функция, выводящая на экран массивы времени, входного и выходного напряжения в виде таблицы.
Модуль calc.cpp
В этом модуле содержатся все функции вычислений.
void form_time () — функция, формирующая массив времени
void form_Uvx () — функция, формирующая массив входных данных
void form_Uvix () — функция, формирующая массив выходных данных
void getfront (double arr[N], frontside side) — рассчитывает и выводит на экран тип и длительность указанного в переменной side фронта, где side — enumeration, принимающий значения LEFT и RIGHT
Модуль file_io.cpp
void read_data () — читает набор данных из файла data. txt
void write_data () — записывает в файл data. txt рабочие данные и массивы времени, входного и выходного напряжения в виде таблицы.
void output_arrays () — выводит массивы времени, входного и выходного напряжения в виде таблицы. в файлы array_time.txt, array_Uvx.txt и array_Uvix.txt в формате, удобном для чтения в программе Maxima.
4. Тестирование программы
Тесты, подтверждающие правильность работы программы. Расчёты сделаны в wxMaxima. Большой сигнал (а = 50)
time | Uvx | Uvx Maxima | Uvix | Uvix Maxima | |
0.0 | 0.0 | ||||
38.84 349 | 38.843 | 100.0 | |||
47.51 065 | 47.511 | 100.0 | |||
49.44 455 | 49.445 | 100.0 | |||
49.87 606 | 49.876 | 100.0 | |||
49.97 235 | 49.972 | 100.0 | |||
0.227 | 0.227 | 0.1 135 | 0.0113 | ||
0.0 | 1.3 055*10^-7 | 0.0 | 5.15 274*10^-7 | ||
0.0 | 4.67 878*10^-12 | 0.0 | 2.33 939*10^-11 | ||
0.0 | 2.12 417*10^-16 | 0.0 | 1.6 209*10^-15 | ||
0.0 | 9.64 375*10^-21 | 0.0 | 4.82 187*10^-20 | ||
Малый сигнал (а = 0.75)
Time | Uvx | UvxMaxima | Uvix | UvixMaxima | |
0.5 826 524 | 0.583 | 2.9 132 619 | 2.9133 | ||
0.7 126 597 | 0.713 | 3.5 632 985 | 3.5633 | ||
0.7 416 683 | 0.742 | 3.7 083 413 | 3.7083 | ||
0.7 481 409 | 0.748 | 3.7 407 047 | 3.7407 | ||
0.7 495 852 | 0.75 | 3.7 479 259 | 3.7479 | ||
0.340 | 3.40 457*10^-5 | 0.1 702 | 1.70 229*10^-4 | ||
0.0 | 1.54 582*10^-9 | 0.0 | 7.72 911*10^-9 | ||
0.0 | 7.1 817*10^-14 | 0.0 | 3.50 909*10^-13 | ||
0.0 | 3.18 626*10^-18 | 0.0 | 1.59 313*10^-17 | ||
0.0 | 1.44 656*10^-22 | 0.0 | 7.23 281*10^-22 | ||
Заключение
Поставленная задача успешно проанализирована и решена, получены навыки разработки программного обеспечения на языке C, а также навыки отладки и тестирования программы. Так как программа имеет модульную структуру, легко осуществить ее возможное расширение. Например, возможно добавить графический интерфейс переписав меню, но не затрагивая остального кода; также программа может быть адаптирована под решение более сложной задачи путем расширения соответствующих функций вычислений.
программа сигнал передаточный цепь
Использованная литература:
1. Б. Керниган, Д. Ритчи — «Язык программирования С» 2011
2. Герберт Шилдт — «Полный справочник по С» 2009
Приложение
Исходный код
mainheader.h
#pragma once
#include
#include
#include
#define N 11
enum front
{
DECREASING = 0,
INCREASING = 1,
NOFRONT
};
enum frontside
{
LEFT = 0, //передний фронт
RIGHT //задний
};
extern double time[N];
extern double Uvx[N];
extern double Uvix[N];
extern double t_begin, t_end, t1;
extern double a, b, c;
extern double U1, U2;
extern double timedelta;
void read_data ();
void write_data ();
void output_arrays ();
void form_time ();
void form_Uvx ();
void form_Uvix ();
void getfront (double arr[N], frontside side);
main.cpp
#include «mainheader.h»
double time[N];
double Uvx[N];
double Uvix[N];
double t_begin = 0, t_end = 20, t1 = 10;
double a = 50, b = 0.75, c = 5;
double U1 = 20, U2 = 100;
double timedelta=0;
void display_data ()
{
printf («%25s%20s%20snn», «time», «Uvx», «Uvix»);
for (int i = 0; i < N; i++)
{
printf («%5d%20.3lf%20.7lf%20.7lfn», i+1, time[i], Uvx[i], Uvix[i]);
}
}
void input_data ()
{
printf («1) T_begin: %10.3lfn», t_begin);
printf («2) T_end: %10.3lfn», t_end);
printf («3) T1: %10.3lfn», t1);
printf («4) a: %10.3lfn», a);
printf («5) b: %10.3lfn», b);
printf («6) c: %10.3lfn», c);
printf («7) U1: %10.3lfn», U1);
printf («8) U2: %10.3lfn», U2);
printf («nEnter variable number and value. 0 to exit menu. n»);
char op = '1';
while (op ≠ '0')
{
scanf («%c», &op);
switch (op)
{
case '1':
{
scanf («%lf», &t_begin);
printf («OKn»);
break;
}
case '2':
{
scanf («%lf», &t_end);
printf («OKn»);
break;
}
case '3':
{
scanf («%lf», &t1);
printf («OKn»);
break;
}
case '4':
{
scanf («%lf», &a);
printf («OKn»);
break;
}
case '5':
{
scanf («%lf», &b);
printf («OKn»);
break;
}
case '6':
{
scanf («%lf», &c);
printf («OKn»);
break;
}
case '7':
{
scanf («%lf», &U1);
printf («OKn»);
break;
}
case '8':
{
scanf («%lf», &U2);
printf («OKn»);
break;
}
default:
//printf («Unrecognised»);
break;
}
}
}
int _tmain (int argc, _TCHAR* argv[])
{
char op;
while (true)
{
printf («nnEnter charachter: nn1) Form arraysn2) Determine frontsn3)
Output arrays to filesn4) Read data from filen5) Input variables
manuallyn6) Write data to filen7) Display datan8) Exitnn");
scanf («%c», &op);
switch (op)
{
case '1':
{
form_time ();
form_Uvx ();
form_Uvix ();
display_data ();
break;
}
case '2':
{
printf («Uvx:n»);
getfront (Uvx, LEFT);
getfront (Uvx, RIGHT);
printf («nUvix:n»);
getfront (Uvix, LEFT);
getfront (Uvix, RIGHT);
break;
}
case '3':
{
output_arrays ();
printf («nDone.n»);
break;
}
case '4':
{
read_data ();
printf («nDone.n»);
break;
}
case '5':
{
input_data ();
break;
}
case '6':
{
write_data ();
printf («nDone.n»);
break;
}
case '7':
{
display_data ();
break;
}
case '8':
{
exit (0);
break;
}
default:
{
printf («nUnrecognised commandn»);
break;
}
}
}
return 0;
}
Calc.cpp
#include «mainheader.h»
void form_time ()
{
timedelta = (t_end — t_begin) / double (N — 1);
for (int i = 0; i < N; i++) // Формирование массива времени t
{
time[i] = t_begin + i * timedelta;
}
}
void form_Uvx ()
{
for (int i = 0; i < N; i++) // Формирование массива Uvx
{
if (time[i] <= t1)
{
Uvx[i] = a * (1.0 — exp (-b * time[i]));
}
else
{
Uvx[i] = a * (1.0 — exp (-b * time[i])) * exp (-c * (time[i] - t1));
}
}
}
void form_Uvix ()
{
for (int i = 0; i < N; i++) // Формирование массива Uvix
{
if (Uvx[i] < U1)
{
Uvix[i] = U2 / U1 * Uvx[i];
}
else
{
Uvix[i] = U2;
}
}
}
void getfront (double arr[N], frontside side)
{
front front = NOFRONT;
int frontlength = 0; //длина в шагах
int first = 0, second = 0; //индексы элементов для определения типа
фронта
double Umax, Umin, UH, UL;
if (side == LEFT)
{
first = 0; second = 1;
}
else if (side == RIGHT)
{
first = N-2; second = N-1;
}
if (arr[first] < arr[second])
{
front = INCREASING;
}
else if (arr[first] > arr[second])
{
front = DECREASING;
}
if (side == LEFT)
{
for (int i = 1; i < N; i++)
{
if ((front == INCREASING && arr[i-1] < arr[i]) || (front ==
DECREASING && arr[i-1] > arr[i]))
{
frontlength++;
}
else
{
break;
}
}
}
if (side == RIGHT)
{
for (int i = N-1; i > 0; i—)
{
if ((front == INCREASING && arr[i-1] < arr[i]) || (front ==
DECREASING && arr[i-1] > arr[i]))
{
frontlength++;
}
else
{
break;
}
}
}
if (side == LEFT)
{
if (front == INCREASING) { Umin = arr[0]; Umax = arr[frontlength]; }
else if (front == DECREASING) { Umin = arr[frontlength]; Umax = arr[0];
}
}
else if (side == RIGHT)
{
if (front == INCREASING) { Umin = arr[N-frontlength-1]; Umax = arr[N;
1]; }
else if (front == DECREASING) { Umin = arr[N-1]; Umax = arr[N;
frontlength-1]; }
}
UH = Umin + 0.9*(Umax-Umin);
UL = Umin + 0.1*(Umax-Umin);
double fronttime = 0;
if (side == LEFT)
{
for (int i = 0; i < frontlength; i++)
{
if (arr[i] >= UL && arr[i] <= UH) fronttime += timedelta;
}
}
else if (side == RIGHT)
{
for (int i = N-1; i > N-frontlength; i—)
{
if (arr[i] >= UL && arr[i] <= UH) fronttime += timedelta;
}
}
char *frontside = (side == LEFT? «Forward»: «Back»);
char *fronttype = (front == DECREASING? «decreasing»: «increasing»);
if (front == NOFRONT)
{
printf («There is no %s front. n», frontside);
return;
}
else
{
printf («%s front is %s, duration is %20.15lf steps %d n», frontside,
fronttype, fronttime, frontlength);
}
}
File_io.cpp
#include «mainheader.h»
using namespace std;
void skipchars (FILE* f, int number)
{
for (int i = 0; i <= number; i++)
{
fgetc (f);
}
}
void read_data ()
{
FILE *f;
char dummy[70];
fopen_s (&f, «data.txt», «r»);
fscanf (f, «%s %lf», &dummy, &t_begin);
fscanf (f, «%s %lf», &dummy, &t_end);
fscanf (f, «%s %lf», &dummy, &t1);
fscanf (f, «%s %lf», &dummy, &a);
fscanf (f, «%s %lf», &dummy, &b);
fscanf (f, «%s %lf», &dummy, &c);
fscanf (f, «%s %lf», &dummy, &U1);
fscanf (f, «%s %lf», &dummy, &U2);
char temp[255];
fgets (temp, 255, f);
fgets (temp, 255, f);
//fgets (temp, 255, f);
for (int i=0; i
{
skipchars (f, 16);
fscanf_s (f, «%lf», &(time[i]));
fscanf_s (f, «%*c%lf», &(Uvx[i]));
fscanf_s (f, «%*c%lf%*c», &(Uvix[i]));
fgets (temp, 255, f);
}
fclose (f);
}
void write_data ()
Uvx
void output_arrays ()
{
FILE *f1,*f2,*f3;
fopen_s (&f1," array_time.txt" ," w");
fopen_s (&f2," array_Uvx.txt", «w»);
fopen_s (&f3," array_Uvix.txt", «w»);
for (int i=0;i
{
fprintf (f1," %20.7fn", time[i]);
fprintf (f2," %20.7fn", Uvx[i]);
fprintf (f3," %20.7fn", Uvix[i]);
}
fclose (f1);
fclose (f2);
fclose (f3);
}