Разработка автоматизированной системы исследований

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 26.11.2013
Размер файла 95,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Введение

сигнал усилитель программа автоматизированный

Особое значение для повышения эффективности науки приобретает автоматизация научных исследований, позволяющая получать более точные и полные модели исследуемых объектов и явлений, ускорять ход научных исследований и снижать их трудоемкость, изучать сложные объекты и процессы, исследование которых традиционными методами затруднительно или невозможно. Применение автоматизированных систем научных исследований и комплексных испытаний образцов новой техники (АСНИ) наиболее эффективно в тех современных областях науки и техники, которые имеют дело с использованием больших объемов информации.

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

АСНИ отличаются от других типов автоматизированных систем (АСУ, АСУТП, САПР и т.д.) характером информации, получаемой на выходе системы. Прежде всего, это обработанные или обобщенные экспериментальные данные, но главное - полученные на основе этих данных математические модели исследуемых объектов, явлений или процессов. Адекватность и точность таких моделей обеспечивается всем комплексом методических, программных и других средств системы. В АСНИ могут использоваться также и готовые математические модели для изучения поведения тех или иных объектов и процессов, а также для уточнения самих этих моделей. АСНИ поэтому являются системами для получения, корректировки или исследования моделей, используемых затем в других типах автоматизированных систем для управления, прогнозирования или проектирования.

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

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

1. Разработка технического обеспечения

АСНИ предназначена для спектрального анализа данных, поступающих от первичных преобразователей физических величин, характеризующих некоторый технологический процесс.

В состав АСНИ входят следующие подсистемы:

- подсистема измерений - информационно-измерительный канал(ИИК);

- подсистема передачи данных;

- подсистема обработки данных;

- подсистема визуализации и документирования данных.

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

ФНЧ выполняет функции противомаскировочного фильтра и служит для подавления высокочастотных составляющих сигнала в целях исключения ошибок аналого-цифрового преобразования.

НУ служит для согласования входного сигнала АЦП с динамическим диапазоном изменения преобразуемого динамического сигнала.

2. Методическое обеспечение

2.1 Моделирование и обработка данных, поступающих от АЦП

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

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

При исследовании процесса аналого-цифрового преобразования будут рассматриваться следующие временные ряды:

X(t) - исходная физическая величина (непрерывный ряд);

x(t) - выходной сигнал датчика (в вольтах), соответствующий функции X(t) (непрерывный временной ряд);

C(t) - выходной сигнал датчика x(t), переведенный в непрерывные отсчёты (фиктивный непрерывный временной ряд);

C(iT) - выходной сигнал датчика x(t), переведенный в непрерывные отсчёты - выборки, выполненные в дискретные моменты времени с периодом Т (дискретный временной ряд);

c(i) - выходной сигнал датчика x(t), переведенный в квантованные отсчёты, полученные после операции квантования (дискретный временной ряд);

e(i) - ошибка, e(i)=C(iT) - c(i).

В роли объектов исследования выступают детерминированные полигармонические сигналы и сигналы случайной природы. Структура полигармонического сигнала x(t) (непрерывного временного ряда) определена следующим соотношением:

где ak - амплитуда и fk - частота k-ой гармоники;

M - количество гармонических составляющих.

Непрерывный временной ряд C(t) можно представить как результат линейного преобразования функции x(t) в виде:

Параметр A и B определяются следующим соотношением:

A=(2N - 1)/(Umax - Umin)=(26-1)/3=42

B = - A xmin(t),

отсюда следует:

B= -42? (-3) = 127 (отсч.)

Значения дискретного временного ряда С(iT) и соответствующие значения дискретного временного ряда c(i), которые получаются на выходе АЦП, можно связать с помощью следующего соотношения:

В соотношении (3.3) выражение в квадратных скобках принимает целое значение в результате округления, выполняемого всегда в меньшую сторону.

Добавление к значениям временного ряда C(iT) величины 0,5 обеспечивает повышение точности округления.

Ошибка квантования e(i) определяется следующим соотношением:

Если модель АЦП работает правильно, то значения e(i), будут ограничены интервалом (-0,5; 0,5).

Последнюю формулу (3.4) можно переписать в виде

В этом случае можно считать, что временной ряд с(i) формируется как сумма соответствующих элементов временного ряда C(iT) и ошибки квантования, которую часто называют шумом квантования.

При идеальном преобразовании ошибка квантования распределена равномерно со стандартным отклонением ~0,29x, где x - шаг квантования. В этом легко убедиться.

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

2.2 Спектральный анализ на основе преобразования Фурье

Определение дискретного преобразования Фурье

Дискретное преобразование Фурье (ДПФ) определяется следующим соотношением:

где X(k) - значение (комплексное) дискретного преобразования Фурье, определенное в частоте с номером k;

x(i) - значение (вещественное) исходного временного ряда, определенное в момент времени с номером i;

T - период дискретизации;

N - количество отсчетов (длина) временного ряда.

Дискретное преобразование Фурье связывает спектральную характеристику (комплексный спектр) X(k), определенную в дискретных значениях частоты (с номером k), с дискретными значениями временного ряда (сигнала) x(i), определенными в дискретные моменты времени (с номером i).

Масштаб представления спектральной характеристики определяется разрешением по частоте:

По номеру kчастоты fk можно найти ее значение в герцах:

(Гц)

Аналогично по номеру и времени ti можно найти его значение в секундах:

ti = iT

Обратное дискретное преобразование Фурье определяется соотношением:

Из сравнения формул (3.6) и (3.10) следует, что они отличаются знаком показателя экспоненты, множителем перед знаком суммы, а также переменной суммирования. Это позволяет строить единые программы для прямого и обратного дискретного преобразования Фурье.

Применяя формулу Эйлера, выражение (3.1) можно привести к виду:

Принимая во внимание (3.12), выражение (3.10) для обратного ДПФ можно привести к виду:

Выражения (3.12) и (3.13) могут быть положены в основу алгоритмов вычисления прямого и обратного ДПФ.

3. Описание программы

Программное обеспечение разрабатывается в вид приложения для ОС Windows.

3.1 Общие сведения

Разрабатываемая программа предназначена для моделирования работы системы обработки информации, состоящая из АЦП и блока анализа. Блок анализа позволяет находить характеристики генерируемого временного ряда, производить прямое и обратное преобразование Фурье и анализировать полученные результаты, оценивать спектральную плотность мощности несколькими способами. В программе так же предусматривается блок, генерирующий исходный временной ряд (поступающий на вход АЦП).

Входными данными для программы являются: разрядность АЦП; динамический диапазон напряжений АЦП; период дискретизации АЦП; амплитуда входного сигнала; число отсчетов (элементов генерируемого временного ряда); число гармоник и их величины; разрешение по частоте;% погрешность оценивания спектральных плотностей; база усреднения.

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

3.2 Функциональное назначение

Данная программа предназначена для решения задач спектрально анализа.

Ее можно использовать для выполнения следующих задач:

1) генерация полигармонического сигнала;

2) вычисление грубых оценок спектральной плотности;

3) вычисление усредненных оценок СПМ методами усреднения по частотам и по участкам со сглаживанием комплексного спектра окнами сглаживания;

4) построение графиков;

5) генерирование отчета.

3.3 Описание логической структуры

Для нахождения сглаженных спектральных оценок в программе выполняются следующие действия:

1) генерирование или загрузка исходного временного ряда;

2) центрирование временного ряда;

3) выполнение ДПФ или БПФ и нахождение комплексного спектра;

4) сглаживание комплексного спектра окнами сглаживания;

5) нахождение грубых оценок спектральной плотности;

6) усреднение грубых оценок одним из методов (по частотам, по участкам).

3.4 Используемые технические средства

Программа состоит из одного основного модуля Unit1.cpp. Также в программе используются модули Unit2.cpp и manager.cpp.

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

Модуль DPF содержит функцию прямого преобразования Фурье.

Модуль IDPF содержит функцию обратного преобразования Фурье.

Модуль FFT содержит функцию быстрого прямого и обратного преобразования Фурье.

Ниже приведены описания программных функций и перецень их аргументов:

ComputeSeries - служит для генерации временного ряда. Алгоритм получения временного ряда заключается в суммировании значений всех гармоник в каждый конкретный момент времени. Количество отсчетов времени задается, и конец временного интервала получается путем умножения числа отсчетов на период дискретизации.

N - длина временного ряда;

Ng - количество гармоник;

Magnitude - амплитуда гармоник;

T - период дискретизации;

startFreq - частота начальнойграмоники

deltaFreq - шаг увеличения частоты

X - выходной массив (временной ряд).

floatMean (float* inpMass, intN) - служит для вычисления мат. ожидания.

floatVar (float *x, int N) - служит для вычисления дисперсии.

voidwind (float *x, intN, intw) - функция вычисления грубых оценок со сглаживанием комплексного спектра. В зависимости от передаваемого ей индекса применяет алгоритм сглаживания либо с помощью окна Гудмена, либо окна Гудмена-Эноксона-Отнеса. Используется в качестве вспомогательной функции при вычислении усредненныхоценкок спектральной плотности мощности.

x - временной ряд, подлежащий сглаживанию;

N - длина в. р.;

T - период дискретизации;

w - индекс вида окна;

w=1 - окно Гудмена-Эноксона-Отнеса;

w=2 - окно Гудмена.

void FFT (float *x, float *y, int n, int m, intind) - быстроепреобразованиеФурье.

x и y - входные / выходные массивы;

n - длина временного ряда;

t - период дискретизации;

m - двоичный логарифм от N

ind - индекс преобразования;

ind = 1 - прямое; ind = 2 - обратное.

voidDFT (intn, floatt, float *x, float *c, float *s) - быстрое преобразование Фурье.

Заключение

В результате выполненного проекта было разработано техническое и программное обеспечение автоматической системы научных исследований. В соответствии с ТЗ произведён расчёт информационно-измерительного канала, в который вошли расчёт дифференциального усилителя и расчёт фильтра низких частот. Канал обеспечивает заданную погрешность от синфазной помехи и согласование входа АЦП с выходом дифференциального усилителя по напряжению.

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

Разработанная программа позволяет моделировать работу АСНИ:

- генерирует исходный временной ряд;

- моделирует аналого-цифровое преобразование;

- анализирует сглаженную оценку спектральной плотности мощности двумя методами: усреднением по участкам и по частотам.

Приложение

Текст программных модулей

Unit1.cpp - основная, описывающая главное окно, программа

#include <vcl.h>

#pragma hdrstop

#include <math.h>

#include «Unit1.h»

#include «Unit2.cpp»

#include «unit2.h»

#include <string>

#include <iostream.h>

#include <io.h>

#include <locale>

#include <math.h>

#include <fstream.h>

 // -

#pragma package (smart_init)

#pragma resource «*.dfm»

TFloatFormat format;

 // -

__fastcall TForm1:TForm1 (TComponent* Owner)

: TForm(Owner)

{

}

 // -

void ColLen (TStringGrid * G, int col) // функция подбирает ширину колонки

{

int max = 15;

for (int row=0; row<G->RowCount; row++) if (max<G->Canvas->TextWidth (G->Cells[col] [row])) max=G->Canvas->TextWidth (G->Cells[col] [row]);

G->ColWidths[col]=max+6;

};

void AllColLen (TStringGrid * G) // функция подбирает ширину всех колонок таблицы

{

for (int col = 0; col<G->ColCount; col++) ColLen (G, col);

};

TForm1 *Form1;

SeriesManager seriesManager;

void FillControls()

{

Form1->StringGrid1->CleanupInstance();

Form1->EditTempN->Text = seriesManager.N;

Form1->EditTempT->Text = seriesManager.T;

Form1->StringGrid1->RowCount = seriesManager.N+1;

Form1->StringGrid1->Cells[1] [0] = «t»;

Form1->StringGrid1->Cells[2] [0] = «X»;

Form1->StringGrid1->Cells[3] [0] = «Cii»;

Form1->StringGrid1->Cells[4] [0] = «Cti»;

for (int i = 0; i<seriesManager.N; i++)

{

Form1->Series1->AddXY (seriesManager. Ti[i], seriesManager.X[i]);

Form1->Series5->AddXY (seriesManager. Ti[i], seriesManager. Cii[i]);

Form1->Series6->AddXY (seriesManager. Ti[i], seriesManager. Cti[i]);

Form1->Series7->AddXY (seriesManager. Ti[i], seriesManager.e[i]);

Form1->StringGrid1->Cells[1] [i+1] = FloatToStrF (seriesManager. Ti[i], format, 3,3);

Form1->StringGrid1->Cells[2] [i+1] = FloatToStrF (seriesManager.X[i], format, 3,3);

Form1->StringGrid1->Cells[3] [i+1] = FloatToStrF (seriesManager. Cii[i], format, 3,3);

Form1->StringGrid1->Cells[4] [i+1] = FloatToStrF (seriesManager. Cti[i], format, 3,3);

Form1->StringGrid1->Cells[5] [i+1] = FloatToStrF (seriesManager.e[i], format, 3,3);

}

 //AllColLen (Form1->StringGrid1);

}

void FillControlsAfterLoad()

{

Form1->StringGrid1->CleanupInstance();

Form1->StringGrid1->RowCount = seriesManager.N+1;

Form1->StringGrid1->Cells[1] [0] = «X»;

Form1->StringGrid1->Cells[2] [0] = «Cii»;

Form1->StringGrid1->Cells[3] [0] = «Cti»;

Form1->StringGrid1->Cells[4] [0] = «e»;

for (int i = 0; i<seriesManager.N; i++)

{

Form1->Series1->AddXY (seriesManager. Ti[i], seriesManager.X[i]);

Form1->StringGrid1->Cells[1] [i+1] = seriesManager.X[i];

}

 //AllColLen (Form1->StringGrid1);

}

void __fastcall TForm1: Button1Click (TObject *Sender)

{

float T=StrToFloat (EditT->Text);

float nachFreq=StrToFloat (Editf1->Text);

float deltaFreq=StrToFloat (Editdf->Text);

float Ampl=StrToFloat (EditA->Text);

float n=StrToInt (Edit_n->Text);

float N=StrToInt (EditN->Text);

float razr=StrToFloat (EditRazr->Text);

float umax=StrToFloat (EditUmax->Text);

float umin=StrToFloat (EditUmin->Text);

seriesManager. InitializeData (N, T, Ampl, nachFreq, deltaFreq, n, umax, umin, razr);

bool isOk = seriesManager. ComputeSeries();

if(isOk)

{

FillControls();

}

}

 // -

void __fastcall TForm1: Button3Click (TObject *Sender)

{

for (int i = 0; i < StringGrid1->ColCount; i++)

for (int j = 1; j < StringGrid1->RowCount; j++)

StringGrid1->Cells[i] [j] = «»;

Form1->StringGrid1->RowCount = 2;

this->Series1->Clear();

seriesManager. ClearAll();

Form1->EditTempN->Text = «»;

Form1->EditTempT->Text = «»;

}

 // -

void __fastcall TForm1: Button2Click (TObject *Sender)

{

Application->Terminate();

}

 // -

void __fastcall TForm1: CloseButtonClick (TObject *Sender)

{

Application->Terminate();

}

 // -

void __fastcall TForm1: LoadDataClick (TObject *Sender)

{

this->OpenDialog1->Execute();

seriesManager. ClearAll();

seriesManager. LoadDataFromFile (this->OpenDialog1->FileName.c_str());

for (int i = 0; i < StringGrid1->ColCount; i++)

for (int j = 1; j < StringGrid1->RowCount; j++)

StringGrid1->Cells[i] [j] = «»;

Form1->StringGrid1->RowCount = 2;

this->Series1->Clear();

Form1->EditTempN->Text = seriesManager.N;

Form1->EditTempT->Text = seriesManager.T;

Form1->StringGrid1->CleanupInstance();

Form1->StringGrid1->RowCount = seriesManager.N+1;

Form1->StringGrid1->Cells[1] [0] = «X»;

Form1->StringGrid1->Cells[2] [0] = «Cii»;

Form1->StringGrid1->Cells[3] [0] = «Cti»;

Form1->StringGrid1->Cells[4] [0] = «e»;

for (int i = 0; i<seriesManager.N; i++)

{

Form1->Series1->AddXY (seriesManager. Ti[i], seriesManager.X[i]);

Form1->StringGrid1->Cells[2] [i+1] = seriesManager.X[i];

}

 //AllColLen (Form1->StringGrid1);

}

 // -

void __fastcall TForm1: SaveXClick (TObject *Sender)

{

this->SaveDialog1->Execute();

seriesManager. SaveData (this->SaveDialog1->FileName.c_str(), 0);

}

 // -

void __fastcall TForm1: Cii1Click (TObject *Sender)

{

this->SaveDialog1->Execute();

seriesManager. SaveData (this->SaveDialog1->FileName.c_str(), 1);

}

 // -

void __fastcall TForm1: Cti1Click (TObject *Sender)

{

this->SaveDialog1->Execute();

seriesManager. SaveData (this->SaveDialog1->FileName.c_str(), 2);

}

 // -

void __fastcall TForm1:e1Click (TObject *Sender)

{

this->SaveDialog1->Execute();

seriesManager. SaveData (this->SaveDialog1->FileName.c_str(), 3);

}

 // -

void __fastcall TForm1: Button4Click (TObject *Sender)

{

Series2->Clear();

Series3->Clear();

Form1->StringGrid2->Cells[1] [0] = «X(t)»;

Form1->StringGrid2->Cells[2] [0] = «C(t)»;

Form1->StringGrid2->Cells[3] [0] = «S(t)»;

Form1->StringGrid2->Cells[4] [0] = «X'(t)»;

float ti=0.0;

if (this->RadioButton1->Checked)

{

float* re;

float* im;

float* vre;

float* vim;

re = new float [seriesManager.N];

im = new float [seriesManager.N];

vre = new float [seriesManager.N];

vim = new float [seriesManager.N];

DFT (seriesManager.N, seriesManager.T, seriesManager.X, re, im);

IDFT (seriesManager.N, seriesManager.T, re, im, vre, vim);

for (int i=0; i<seriesManager.N; i++)

{

this->StringGrid2->RowCount=seriesManager.N;

StringGrid2->Cells[1] [1+i]=FloatToStrF (seriesManager.X[i], format, 3,3);

StringGrid2->Cells[2] [1+i]=FloatToStrF (re[i], format, 3,3);

StringGrid2->Cells[3] [1+i]=FloatToStrF (im[i], format, 3,3);

StringGrid2->Cells[4] [1+i]=FloatToStrF (vre[i], format, 3,3);

Series2->AddXY (i, sqrt (pow(re[i], 2)+pow (im[i], 2)));

Series3->AddXY (ti, vre[i]);

ti+=seriesManager.T;

}

 //AllColLen(StringGrid2);

delete re, im, vre, vim;

}

if (this->RadioButton2->Checked)

{

float* re;

float* im;

float* vre;

float* vim;

re = new float [seriesManager.N];

im = new float [seriesManager.N];

vre = new float [seriesManager.N];

vim = new float [seriesManager.N];

for (int i=0; i<seriesManager.N; i++)

{

im[i]=0;

re[i]=seriesManager.X[i];

}

FFT (re, im, seriesManager.N, stepen (seriesManager.N), 1);

for (int i=0; i<seriesManager.N; i++)

{

re[i]*=seriesManager.T;

im[i]*=seriesManager.T;

vre[i]=re[i];

vim[i]=im[i];

}

FFT (vre, vim, seriesManager.N, stepen (seriesManager.N), 0);

for (int j=0; j<seriesManager.N; j++)

{

vre[j]/=(seriesManager.N*seriesManager.T);

}

for (int i=0; i<seriesManager.N; i++)

{

this->StringGrid2->RowCount=seriesManager.N;

StringGrid2->Cells[1] [1+i]=FloatToStrF (seriesManager.X[i], format, 3,3);

StringGrid2->Cells[2] [1+i]=FloatToStrF (re[i], format, 3,3);

StringGrid2->Cells[3] [1+i]=FloatToStrF (im[i], format, 3,3);

StringGrid2->Cells[4] [1+i]=FloatToStrF (vre[i], format, 3,3);

Series2->AddXY (i, sqrt (pow(re[i], 2)+pow (im[i], 2)));

Series3->AddXY (ti, vre[i]);

ti+=seriesManager.T;

}

 //AllColLen(StringGrid2);

delete re, im, vre, vim;

}

}

 // -

void __fastcall TForm1: Button5Click (TObject *Sender)

{

Series4->Clear();

this->ListBox1->Clear();

if (this->RadioButton3->Checked)

{

float* sxx=GrubayaOcenka (seriesManager.X, seriesManager.N, seriesManager.T);

for (int j=0; j<seriesManager.N; j++)

{

ListBox1->Items->Add (FloatToStrF(sxx[j], format, 3,3));

Series4->AddXY (j, sxx[j], "», clRed);

}

delete sxx;

}

if (this->RadioButton4->Checked)

{

float e;

e=StrToFloat (Edit2->Text);

float* sxx=UsrPoUchastkam (seriesManager.X, seriesManager.N, seriesManager.T, e);

for (int j=0; j<seriesManager.N; j++)

{

ListBox1->Items->Add (FloatToStrF(sxx[j], format, 3,3));

Series4->AddXY (j, sxx[j], "», clRed);

}

delete sxx;

}

if (this->RadioButton5->Checked)

{

float e;

float b;

e=StrToFloat (Edit2->Text);

b=StrToFloat (Edit1->Text);

int Ny;

float* sxx=UsrPoChastote (seriesManager, b, e, Ny);

for (int j=0; j<Ny; j++)

{

ListBox1->Items->Add (FloatToStrF(sxx[j], format, 3,3));

Series4->AddXY (j, sxx[j], "», clRed);

}

delete sxx;

}

}

 // -

void __fastcall TForm1: Button6Click (TObject *Sender)

{

float mx=Mean (seriesManager.X, seriesManager.N);

Edit5->Text=FloatToStrF (mx, format, 3,3);

float disp=Var (seriesManager.X, seriesManager.N);

Edit4->Text=FloatToStrF (disp, format, 3,3);

float sko=sqrt(disp);

Edit3->Text=FloatToStrF (sko, format, 3,3);

}

Unit2.cpp - основные математические функции

 // -

#pragma hdrstop

#include «manager.cpp»

#include «Unit2.h»

 // -

#pragma package (smart_init)

float Mean (float* inpMass, int N)

{

float sum = 0;

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

{

sum+=inpMass[i];

}

return sum/N;

};

float Var (float *x, int N)

{

float mx, sum;

sum=0;

mx = Mean (x, N);

for (int j=0; j<N; j++)

sum+=(x[j]+mx)*(x[j]+mx);

return sum/(N-1);

};

int stepen (int nn)

{

int M;

M=(int) (log10 (nn)/log10 (2));

return M;

}

void FFT (float *x, float *y, int n, int m, int ind)

{

int l, le, le1, ip, i, k, j, i1, j1;

float arg, s, t1, t2, t3, t4, c, v1, v2, v3;

for (l=1; l<=m; l++)

{

le=pow (2, m+1-l);

le1= le/2;

v1=1; v2=0; arg= pi/le1;

c=cos(arg);

s=pow((-1), ind)*sin(arg);

for (j=1; j<=le1; j++)

{

for (i=j; i<=n; i=i+le)

{

ip=i+le1-1; t1=x [i-1]+x[ip]; t2=y [i-1]+y[ip]; t3=x [i-1] - x[ip]; t4=y [i-1] - y[ip];

x[ip]=t3*v1-t4*v2; y[ip]=t4*v1+t3*v2; x [i-1]=t1; y [i-1]=t2;

}

v3=v1*c-v2*s; v2=v2*c+v1*s; v1=v3;

}

}

j=1;

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

{

if (i>=j) goto l25;

j1=j-1; i1=i-1; t1=x[j1]; t2=y[j1]; x[j1]=x[i1]; y[j1]=y[i1]; x[i1]=t1; y[i1]=t2;

l25: k=n/2;

l26: if (k>=j) goto l30;

j=j-k;

k=k/2;

goto l26;

l30: j=j+k;

}

};

float* Centr (float* InpMass, int N)

{

float mx = Mean (InpMass, N);

float* centr = new float[N];

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

{

centr[i] = InpMass[i] - mx;

}

return centr;

};

void DFT (int n, float t, float *x, float *c, float *s)

{int k;

for (k=0; k<n; k++)

{int i;

c[k]=0;

s[k]=0;

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

{

c[k]+=x[i]*cos (2*3.141592654*k*i/n);

s[k]+=x[i]*sin (2*3.141592654*k*i/n);

}

c[k]=c[k]*t;

s[k]=s[k]* - t;

}

};

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.