Тема: «Программная реализация алгоритма сегментации сигнала по заданным эталонам»




Задание:

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

Ход работы:

Теория:

Алгоритм работы, реализуемой программы состоит из следующих шагов

Шаг 1) Формируется определенное количество (m штук) типов полигармонических сигналов, имеющих различные характеристики.

Шаг 2) На сформированных сигналах вычисляется эталонный вектор параметров

Шаг 3) Формируется реализация сигментируемого сигнала, состоящего из фрагментов m типов сигналов (длины фрагментов при этом являются случайными величинами). Случайной также является последовательность этих сигналов.

Шаг 4) Для полученного сигнала провести сигментацию.

 

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

1) Берется фрагмент сигнала фиксированной длинны

2) Для этого фрагмента находится вектор параметров

3) Вектор параметров сравнивается с эталонными векторами параметров, находится такой эталонный сигнал, различие векторов параметров которого с векторами параметров исследуемой части сигнала имеют наименьшее различие

В качестве эталонного параметра было решено взять автокорреляционную функцию

Автокорреляционная функция имеет следующий вид:


Программная реализация:

Для реализации поставленной задачи было решено использовать языкС# и инструментарий для разработки программного обеспечений VisualStudio 2010.

 

Рассмотрим как работает разработанное приложение

При запуске исполняемого файла открывается главное окно

Рисунок 16 – Главное окно программы

В левой части главной формы находятся 3 эталонных сигнала (их параметры вводит пользователь). После их ввода Необходимо отрисовать сгенерированный сигнал (состоящий из эталонных) и затем сегментированный. Цветом выделяются различные типы сигналов.


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

usingSystem;

usingSystem.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespaceСигментация_сигнала

{

publicclassSignal

{

public Signal()

{

 

}

 

public Signal(int Tip,

Color Cvet,

float Vremia,

float Period_deskretizaciil,

int kolvo_garmonik,

float[] Massiv_A,

float[] Massiv_fi,

float[] Massiv_V)

{

Sign = newList<PointF>();

this.Tip = Tip;

this.Cvet = Cvet;

this.Vremia= Vremia;

this.Period_deskretizaciil = Period_deskretizaciil;

this.kolvo_garmonik = kolvo_garmonik;

this.Massiv_A = Massiv_A;

this.Massiv_fi = Massiv_fi;

this.Massiv_V = Massiv_V;

}

publicint Tip;

publicColor Cvet;

publicfloat Vremia;

publicfloat Period_deskretizaciil;

publicint kolvo_garmonik;

publicfloat[] Massiv_A;

publicfloat[] Massiv_fi;

publicfloat[] Massiv_V;

publicList<PointF> Sign;

publicfloat[] Etalon;

 

publicvoid Otrisovka(Panel a)

{

Graphics g = a.CreateGraphics();

float coff_x =a.Size.Width/Vremia;

 

float max_A = 0;

for (int i = 0; i < Sign.Count; i++)

{

if (Sign[i].Y > max_A) max_A = Sign[i].Y;

}

 

float coff_y =a.Size.Height/2/max_A;

for (int i = 0; i < Sign.Count - 1; i++)

{

g.DrawLine(newPen(Cvet, 2.0f), Sign[i].X * coff_x, Sign[i].Y * coff_y + a.Size.Height /2, Sign[i + 1].X * coff_x, Sign[i + 1].Y * coff_y + a.Size.Height/2);

}

g.DrawLine(newPen(Color.Black, 1), 0, a.Size.Height / 2, a.Size.Width, a.Size.Height / 2);

}

 

publicvoid Otrisovka(Panel a,float[] e1, float[] e2, float[] e3)

{

Graphics g = a.CreateGraphics();

float coff_x = a.Size.Width / Vremia;

 

float max_A = 0;

for (int i = 0; i < Sign.Count; i++)

{

if (Sign[i].Y > max_A) max_A = Sign[i].Y;

}

 

 

float coff_y = a.Size.Height / 2 / max_A;

 

Color[] Cveta = newColor[Sign.Count / 100];

 

for (int i = 0; i < Sign.Count / 100; i++)

{

float[] et = newfloat[100];

 

for (int j = 1; j < 100; j++)

{

try

{

et[j] = 0;

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

et[j] += Sign[j1 + 100 * i].Y * Sign[j1 + j + 100 * i].Y;

et[j] /= j;

}

catch (Exception ex)

{

 

}

}

 

float r1=0.0f;

float r2=0.0f;

float r3=0.0f;

 

for (int k = 0; k < 100; k++)

{

r1 += Math.Abs(e1[k] - et[k]);

r2 += Math.Abs(e2[k] - et[k]);

r3 += Math.Abs(e3[k] - et[k]);

}

 

if (r1 <= r2 && r1 <= r3) Cveta[i] = Color.Red;

if (r2 <= r1 && r2 <= r3) Cveta[i] = Color.Green;

if (r3 <= r1 && r3 <= r2) Cveta[i] = Color.Blue;

 

}

 

for (int i = 0; i < Sign.Count - 1; i++)

{

try

{

 

g.DrawLine(newPen(Cveta[i / 100], 2.0f), Sign[i].X * coff_x, Sign[i].Y * coff_y + a.Size.Height / 2, Sign[i + 1].X * coff_x, Sign[i + 1].Y * coff_y + a.Size.Height / 2);

}

catch (Exception ex)

{

 

}

}

g.DrawLine(newPen(Color.Black, 1), 0, a.Size.Height / 2, a.Size.Width, a.Size.Height / 2);

}

 

publicvoid Podschet_etalona()

{

Etalon = newfloat[100];

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

{

Etalon[i] = 0;

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

{

Etalon[i] += Sign[j].Y * Sign[j + i].Y;

}

Etalon[i] = Etalon[i] / i;

}

}

 

publicvoid Generate_signal(Signal S1, Signal S2, Signal S3)

{

Random rnd = newRandom();

Sign = newList<PointF>();

Cvet = Color.PaleVioletRed;

float X=0;

for (int i = 0; i < rnd.Next(8, 12); i++)

{

Signal Sn = newSignal();

int n = rnd.Next(3);

if (n == 0)

{

Sn = S1;

}

if (n == 1)

{

Sn = S2;

}

if (n == 2)

{

Sn = S3;

}

 

for (float k = 0; k < rnd.Next(1,3); k += 0.001f)

{

PointF temp = newPointF(X, 0);

for (int j = 0; j < Sn.kolvo_garmonik; j++)

{

temp.Y = (float)(temp.Y + Sn.Massiv_A[j] * Math.Cos(2 * 3.14 * Sn.Massiv_V[j] * X + Sn.Massiv_fi[j]));

}

Sign.Add(temp);

X += 0.001f;

}

 

}

Vremia = X;

}

 

publicvoid Generate_signal()

{

Sign.Clear();

 

if (Tip ==0)

{

//Склейкасигнала

}

else

{

for (float i = 0; i < Vremia;i+=Period_deskretizaciil)

{

PointF temp = newPointF(i,0);

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

{

temp.Y = (float)(temp.Y + Massiv_A[j] * Math.Cos (2 * 3.14 * Massiv_V[j] * i + Massiv_fi[j]));

}

Sign.Add(temp);

}

}

}

 

 

}

}

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespaceСигментация_сигнала

{

publicpartialclassForm1: Form

{

publicSignal S1, S2, S3, R1, R2;

public Form1()

{

S1 = newSignal(1, Color.Red, 1, 0.001f, 1, newfloat[1] { 1.0f }, newfloat[1] { 1.0f }, newfloat[1] { 1.0f });

S2 = newSignal(1, Color.Green, 1, 0.001f, 2, newfloat[2] { 10.0f,2.0f }, newfloat[2] { 10.0f,20.0f }, newfloat[2] { 10.0f,0.0f });

S3 = newSignal(1, Color.Blue, 1, 0.001f, 1, newfloat[1] { 50.0f }, newfloat[1] { 50.0f }, newfloat[1] { 50.0f });

R1 = newSignal();

R1.Generate_signal(S1, S2, S3);

R2 = newSignal();

R2.Vremia = R1.Vremia;

R2.Sign = R1.Sign;

 

S1.Generate_signal();

S2.Generate_signal();

S3.Generate_signal();

 

S1.Podschet_etalona();

S2.Podschet_etalona();

S3.Podschet_etalona();

 

 

InitializeComponent();

R2.Otrisovka(panel5, S1.Etalon, S2.Etalon, S3.Etalon);

}

 

privatevoid Form1_Load(object sender, EventArgs e)

{

 

}

 

privatevoid panel1_Paint(object sender, PaintEventArgs e)

{

S1.Generate_signal();

S1.Otrisovka(panel1);

}

 

privatevoid DG1_CellContentClick(object sender, DataGridViewCellEventArgs e)

{

 

}

 

privatevoid dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)

{

 

}

 

privatevoid button1_Click(object sender, EventArgs e)

{

float[] A1 = newfloat[this.dataGridView1.Rows.Count-1];

float[] V1 = newfloat[this.dataGridView1.Rows.Count-1];

float[] fi1 = newfloat[this.dataGridView1.Rows.Count-1];

 

for (int i = 0; i < dataGridView1.Rows.Count-1; i++)

{

A1[i] = float.Parse(dataGridView1.Rows[i].Cells["A1"].Value.ToString());

V1[i] = float.Parse(dataGridView1.Rows[i].Cells["V1"].Value.ToString());

fi1[i] = float.Parse(dataGridView1.Rows[i].Cells["fi1"].Value.ToString());

}

S1 = newSignal(1, Color.Red, 1.0f, 0.001f, dataGridView1.Rows.Count-1, A1, fi1, V1);

 

panel1.Invalidate();

}

 

privatevoid button2_Click(object sender, EventArgs e)

{

float[] A1 = newfloat[this.dataGridView2.Rows.Count - 1];

float[] V1 = newfloat[this.dataGridView2.Rows.Count - 1];

float[] fi1 = newfloat[this.dataGridView2.Rows.Count - 1];

 

for (int i = 0; i < dataGridView2.Rows.Count - 1; i++)

{

A1[i] = int.Parse(dataGridView2.Rows[i].Cells["A2"].Value.ToString());

V1[i] = int.Parse(dataGridView2.Rows[i].Cells["V2"].Value.ToString());

fi1[i] = int.Parse(dataGridView2.Rows[i].Cells["fi2"].Value.ToString());

}

S2 = newSignal(2, Color.Green, 1.0f, 0.001f, dataGridView2.Rows.Count - 1, A1, fi1, V1);

 

panel2.Invalidate();

}

 

privatevoid button3_Click(object sender, EventArgs e)

{

float[] A1 = newfloat[this.dataGridView3.Rows.Count - 1];

float[] V1 = newfloat[this.dataGridView3.Rows.Count - 1];

float[] fi1 = newfloat[this.dataGridView3.Rows.Count - 1];

 

for (int i = 0; i < dataGridView3.Rows.Count - 1; i++)

{

A1[i] = float.Parse(dataGridView3.Rows[i].Cells["A3"].Value.ToString());

V1[i] = float.Parse(dataGridView3.Rows[i].Cells["V3"].Value.ToString());

fi1[i] = float.Parse(dataGridView3.Rows[i].Cells["fi3"].Value.ToString());

}

S3 = newSignal(3, Color.Blue, 1.0f, 0.001f, dataGridView3.Rows.Count - 1, A1, fi1, V1);

 

panel3.Invalidate();

}

 

privatevoid panel2_Paint(object sender, PaintEventArgs e)

{

S2.Generate_signal();

S2.Otrisovka(panel2);

}

 

privatevoid panel3_Paint(object sender, PaintEventArgs e)

{

S3.Generate_signal();

S3.Otrisovka(panel3);

}

 

privatevoid button4_Click(object sender, EventArgs e)

{

R1 = newSignal();

R1.Tip = 0;

R1.Generate_signal(S1, S2, S3);

panel4.Invalidate();

}

 

privatevoid panel4_Paint(object sender, PaintEventArgs e)

{

 

R1.Otrisovka(panel4);

 

}

 

privatevoid button5_Click(object sender, EventArgs e)

{

R2 = newSignal();

R2.Vremia = R1.Vremia;

R2.Sign = R1.Sign;

S1.Podschet_etalona();

S2.Podschet_etalona();

S3.Podschet_etalona();

 

panel5.Invalidate();

}

 

privatevoid panel5_Paint(object sender, PaintEventArgs e)

{

R2.Otrisovka(panel5, S1.Etalon, S2.Etalon, S3.Etalon);

}

 

 

}

}

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: