Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая / Анализ сигнала.docx
Скачиваний:
4
Добавлен:
15.08.2023
Размер:
305.07 Кб
Скачать

Код программы

Исходный файл “CourseWork.Cpp”

#include "Functions.h"

extern "C++"

{

}

int main(void)

{

vector<float> t, Uvx, Uvix; // vector of time, U_inner, U_outer

t.resize(N); Uvx.resize(N); Uvix.resize(N);

float tn = 10, tk = 80, af; // start and final point for time

double dt;

int16 n; // int_least16_t was defined as int16 at Function.h file

int_least8_t counter = 0;

int choose = 0;

Title();

while (true)

{

cout << "========================================================MENU============================================================" << endl;

cout << "1. Solve for N" << endl;

cout << "2. Solution with a given precision" << endl;

cout << "3. Write to file" << endl;

cout << "4. Build graph" << endl;

cin >> choose;

switch (choose)

{

case 1:

cout << "Enter the desired number of points: ";

cin >> n;

dt = (tk - tn) / (n - 1);

AppendToTime(n, dt, tn, t);

U_in(n, t, Uvx);

U_out(n, Uvx, Uvix);

PrintTable(n, t, Uvx, Uvix);

break;

case 2:

cout << "parametr for Uvx" << endl;

findParam(t, Uvx, Uvix, dt, tn);

cout << "Parametr for Uvix" << endl;

findParam2(t, Uvx, Uvix, dt, tn);

break;

case 3:

VectorToFile(t, "TimeArray.txt", n);

VectorToFile(Uvx, "Uvx_Array.txt", n);

VectorToFile(Uvix, "Uvix_Array.txt", n);

counter += 1;

break;

case 4:

if (counter >= 1)

{

BuildGraph();

}

else

{

cout << "You need to write values into file first" << endl;

}

}

cout << "Want to continue your work?" << endl;

cout << "0.No" << endl << "1.Yes" << endl;

cin >> choose;

switch (choose)

{

case 0:

cout << "Bue!" << endl;

return 0;

break;

case 1:

choose = 0;

continue;

}

}

}

Файл “Functions.Cpp”

#include "Functions.h"

#pragma region lists and table

void AppendToTime(int16 n, double dt, float tn, vector<float>& t)

{

// Formation of an array of time

t.resize(n);

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

{

t[i] = tn + (i - 1) * dt;

}

}

void U_in(int16 n, vector<float>& t, vector<float>& Uvx)

{

// Formation of the input voltage array

constexpr float t1 = 20, t2 = 60, t3 = 70, tk = 80, U = 50;

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

{

if (t[i] <= t1)

{

Uvx[i] = 0;

}

else if (t[i] <= t2)

{

Uvx[i] = ((t[i] - t1) * (U - 0)) / (t2 - t1) + 0;

}

else if (t[i] <= t3)

{

Uvx[i] = U;

}

else

{

//Uvx[i] = ((Uvx[i] - t3) * (U - 0))/(t3 - tk) + U;

Uvx[i] = ((t[i] - t3) * (U - 0)) / (t3 - tk) + U;

}

}

}

void U_out(int16 n, vector<float>& Uvx, vector<float>& Uvix)

{

// forming an array of output voltage

constexpr float a1 = 0.5, b1 = 10, a2 = 2.5, b2 = 10, a3 = 0.5, b3 = 60, Uvx1 = 10, Uvx2 = 30;

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

{

if (Uvx[i] < Uvx1)

{

Uvix[i] = a1 * Uvx[i] + b1;

}

else if (Uvx[i] > Uvx1 && Uvx[i] < Uvx2)

{

Uvix[i] = a2 * Uvx[i] + b2;

}

else

Uvix[i] = a3 * Uvx[i] + b3;

}

}

void PrintTable(int16 n, vector<float>& t, vector<float>& Uvx, vector<float>& Uvix)

{

//Print results in table

cout << "# t Uvx Uvix" << endl;

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

{

printf("%d %6.3f %6.3f %6.3f\n", i, t[i], Uvx[i], Uvix[i]);

}

}

void Title(void)

{

// Shows title from file on the screen

ifstream file("Zast.txt");

if (file.is_open())

{

file.seekg(3, ios::beg);

string reader;

while (!file.eof())

{

while (getline(file, reader))

{

cout << reader;

}

file.close();

}

cout << "\n\n";

}

else

{

fprintf(stderr, "[ERROR] file doesn't exist or corrupted\n\n");

}

}

void VectorToFile(vector<float> vector_file, string name, int n)

{

// Write vector values to file function

ofstream file(name);

if (file.is_open())

{

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

{

file << vector_file[i] << endl;

}

cout << "[INFO] File " << name << " " << "write successfully" << endl;

file.close();

}

else

{

fprintf(stderr, "[ERROR] file wasn't created\n");

}

}

#pragma endregion

#pragma region Parametr

void findParam(vector<float>& t, vector<float>& Uvx, vector<float>& Uvix, double dt, float tn)

{

int N1 = 61;

AppendToTime(N1, dt, tn, t);

U_in(N1, t, Uvx);

U_out(N1, Uvx, Uvix);

double dUimp = 1000, eps = 0.01, prev = ImpulseDuration(Uvx, dt, N1);

double delta = 0;

while (dUimp > eps && N1 < N)

{

N1 *= 2;

dt = (80 - 10) / (N1 - 1.0);

AppendToTime(N1, dt, tn, t);

Uvx.resize(N1);

U_in(N1, t, Uvx);

Uvix.resize(N1);

U_out(N1, Uvx, Uvix);

delta = ImpulseDuration(Uvx, dt, N1);

dUimp = fabs(prev - delta) / (prev);

prev = delta;

cout << "Parametr = " << delta << "|" << "accuracy = " << dUimp << "|" << "points =" << N1 << endl;

}

if (N1 > N)

{

cout << "Target accuracy was not achieved" << endl;

}

else

{

cout << "Target accuracy was achived with n = " << N1 << " " << "accuracy is: " << dUimp << endl;

cout << "Impulse duration is: " << delta << endl;

}

}

void findParam2(vector<float>& t, vector<float>& Uvx, vector<float>& Uvix, double dt, float tn)

{

int N1 = 61;

AppendToTime(N1, dt, tn, t);

U_in(N1, t, Uvx);

U_out(N1, Uvx, Uvix);

double dUimp = 1000, eps = 0.01, prev = ImpulseDuration(Uvx, dt, N1);

double delta = 0;

while (dUimp > eps && N1 < N)

{

N1 *= 2;

dt = (80 - 10) / (N1 - 1.0);

AppendToTime(N1, dt, tn, t);

Uvx.resize(N1);

U_in(N1, t, Uvx);

Uvix.resize(N1);

U_out(N1, Uvx, Uvix);

delta = ImpulseDuration(Uvix, dt, N1);

dUimp = fabs(prev - delta) / (prev);

prev = delta;

cout << "Parametr = " << delta << "|" << "accuracy = " << dUimp << "|" << "points =" << N1 << endl;

}

if (N1 > N)

{

cout << "Target accuracy was not achieved" << endl;

}

else

{

cout << "Target accuracy was achived with n = " << N1 << " " << "accuracy is: " << dUimp << endl;

cout << "Impulse duration is: " << delta << endl;

}

}

double ImpulseDuration(vector<float> signal, double dt, int16 n)

{

double Umax = 0, Umin = 99999, Uimp;

double delta = 0;

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

{

if (signal[i] > Umax)

{

Umax = signal[i];

}

}

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

{

if (signal[i] < Umin)

{

Umin = signal[i];

}

}

Uimp = Umin + 0.5 * (Umax - Umin);

if (Umin == 0)

{

delta = 0;

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

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

delta += dt;

}

else

{

delta = 0;

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

if (signal[i] >= Uimp)

delta += dt;

}

return delta;

}

#pragma endregion

void BuildGraph()

{

system("C:\\maxima-5.43.2\\wxMaxima\\wxmaxima.exe graph.wxmx");

}

Соседние файлы в папке Курсовая