Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
лабораторної роботи № 2
з дисципліни:
«Проектування комп’ютерних засобів обробки сигналів та зображень»
на тему:
«Діагностика роботи цифрових фільтрів шляхом аналізу їх амплітудно-частотної характеристики»
Мета роботи
Дослідити і проаналізувати параметри амплітудно-частотної характеристики та вплив віконної обробки при спектральному аналізі сигналів.
Варіант завдання до лабораторної роботи
№ Вар
N
L
Sm
Sp
S
A
№ Вагової функції
59
28
124
-32
44
8
14
15
Номер Функції
Назва
Тип функції
15
w(n) = 0.25 + 0,75 cos [ ((n-16)/32]
Хід роботи
1. Формуємо масив синусоїдальної і косинусоїдальної складової згідно з виразом і згідно завдання:
for(i = 0; i < N; i++)
{
sin0[i] = sin(2*pi*i*l/N);
cos0[i] = cos(2*pi*i*l/N);
}
2. Сформувати вхідний масив (синусоїдальна і косинусоїдальна складові) згідно з формулою 3.
де
for (n=0;n<=Sp-Sm+1;n++)
for(i = 0; i <= N; i++)
{
sin1[n][i] =Asin[2*pi(Sl+Sm+n)i/SN];
cos1[n][i] =Acos[2*pi(Sl+Sm+n)i/SN];
}
3. Сформувати масив вагової функції W(i) згідно варіанту завдання.
Для вагової функції №42 обчислення виконується згідно виразу:
4. Скласти процедуру на мові високого рівня для обчислення АЧХ згідно з формулою 2
a) з ваговою функцією
for (n=0;n<=Sp-Sm+1;n++)
for(i = 0; i <= N; i++)
{
Y0[n]=Y0[n]+W[і]*(Acos1[n][i]*cos0[i]+Asin1[n][i]*sin0[i])
Y1[n]=Y1[n]+W[і]*(Asin1[n][i]*cos0[i]-Acos1[n][i]*sin0[i])
}
b) без вагової функції
for (n=0;n<=Sp-Sm+1;n++)
for(i = 0; i <= N; i++)
{
Y0[n]=Y0[n]+(Acos1[n][i]*cos0[i]+Asin1[n][i]*sin0[i])
Y1[n]=Y1[n]+(Asin1[n][i]*cos0[i]-Acos1[n][i]*sin0[i])
}
5. Скласти процедуру графічного виводу значень АЧХ з використанням вагової функції і без її використання та порівняти отримані результати.
Значення координати Y для відображення результату обчислюємо за формулою:
Y[n] = sqrt(pow(Y0[n][l],2) + pow(Y1[n][l],2));
Результати виконання індивідуального завдання
Рис.1. Результат виконання програми
Лістинг Програми
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;
using ZedGraph;
using System.Numerics;
namespace ll2
{
public partial class Form1 : Form
{
int N = 0;
public Form1()
{
InitializeComponent();
}
private void zedGraph_Load(object sender, EventArgs e)
{
// DrawGraph();
}
private void DrawGraph()
{
ZedGraph.MasterPane masterPane = zedGraph.MasterPane;
masterPane.PaneList.Clear();
GraphPane pane = new GraphPane();
GraphPane pane1 = new GraphPane();
// GraphPane pane2 = new GraphPane();
int labelsXfontSize = 25;
int labelsYfontSize = 20;
int titleXFontSize = 25;
int titleYFontSize = 20;
int legendFontSize = 25;
int mainTitleFontSize = 45;
masterPane.Add(pane);
masterPane.Add(pane1);
// Установим размеры шрифтов для меток вдоль осей
pane.XAxis.Scale.FontSpec.Size = labelsXfontSize;
pane.YAxis.Scale.FontSpec.Size = labelsYfontSize;
// Установим размеры шрифтов для подписей по осям
pane.XAxis.Title.FontSpec.Size = titleXFontSize;
pane.YAxis.Title.FontSpec.Size = titleYFontSize;
pane.Legend.FontSpec.Size = legendFontSize;
pane.Title.FontSpec.Size = mainTitleFontSize;
pane.Title.FontSpec.IsUnderline = true;
pane.XAxis.Title.Text = "X";
pane.YAxis.Title.Text = "Y";
// Установим размеры шрифтов для меток вдоль осей
pane1.XAxis.Scale.FontSpec.Size = labelsXfontSize;
pane1.YAxis.Scale.FontSpec.Size = labelsYfontSize;
// Установим размеры шрифтов для подписей по осям
pane1.XAxis.Title.FontSpec.Size = titleXFontSize;
pane1.YAxis.Title.FontSpec.Size = titleYFontSize;
pane1.Legend.FontSpec.Size = legendFontSize;
pane1.Title.FontSpec.Size = mainTitleFontSize;
pane1.Title.FontSpec.IsUnderline = true;
pane1.XAxis.Title.Text = "X";
pane1.YAxis.Title.Text = "Y";
try
{
DrawSingleGraph(pane);
DrawSingleGraph1(pane1);
}
catch (Exception ex)
{
MessageBox.Show("Введіть дані ще раз", ex.Message);
}
using (Graphics g = CreateGraphics())
{
masterPane.SetLayout(g, PaneLayout.SingleColumn);
}
zedGraph.AxisChange();
zedGraph.Invalidate();
}
private void DrawSingleGraph(GraphPane pane)
{
int Sm = Convert.ToInt32(textBoxSm.Text);
int Sp = Convert.ToInt32(textBoxSp.Text);
N = Convert.ToInt32(textBoxN.Text);
int l = Convert.ToInt32(textBoxl.Text);
int S = Convert.ToInt32(textBoxS.Text);
int A = Convert.ToInt32(textBoxA.Text);
double[] s = new double[105];
for (int k = Sm, j = 0; k < Sp - 1; k++, j++)
{
s[j] = k;
}
double[] sin0 = new double[1536];
double[] cos0 = new double[1536];
double[] sin1 = new double[1536];
double[] cos1 = new double[1536];
double Re = 0;
double Im = 0;
double[] y = new double[1536];
double[] yw = new double[1536];
for (int i = 0; i < N; i++)
{
sin0[i] = Math.Sin(2 * Math.PI * i / N);
cos0[i] = Math.Cos(2 * Math.PI * i / N);
}
for (int i = 0; i < (S * N); i++)
{
sin1[i] = Math.Sin(2 * Math.PI * i / (S * N));
cos1[i] = Math.Cos(2 * Math.PI * i / (S * N));
}
int r = 0;
do
{
for (int i = 0; i < N; i++)
{
int a = (Math.Abs(S * l + Sm) * i) % (S * N);
int b = l * i % N;
Re += A * cos1[a] * cos0[b] + A * sin1[a] * sin0[b];
Im += A * cos1[a] * sin0[b] - A * sin1[a] * cos0[b];
}
Complex complex2 = new Complex(Re, Im);
y[r] = Complex.Abs(complex2);
yw[r] = y[r] * W(r);
Re = Im = 0;
r++;
} while (Sm++ < Sp);
BarItem bar = pane.AddBar("Графік AЧX", s, y, Color.Green);
pane.BarSettings.MinClusterGap = 0.0f;
dataGridView1.ColumnCount = 3;
dataGridView1.RowCount = s.Length;
dataGridView1.Columns[0].HeaderText = " Х";
dataGridView1.Columns[1].HeaderText = "Y";
dataGridView1.Columns[2].HeaderText = "Yw";
dataGridView1.RowHeadersWidth = 105;
for (int i = 0; i < s.Length; i++)
{
dataGridView1.Rows[i].HeaderCell.Value = "" + i;
dataGridView1[0, i].Value = s[i];
dataGridView1[1, i].Value = y[i];
dataGridView1[2, i].Value = yw[i];
}
}
private void DrawSingleGraph1(GraphPane pane)
{
int Sm = Convert.ToInt32(textBoxSm.Text);
int Sp = Convert.ToInt32(textBoxSp.Text);
int N = Convert.ToInt32(textBoxN.Text);
int l = Convert.ToInt32(textBoxl.Text);
int S = Convert.ToInt32(textBoxS.Text);
int A = Convert.ToInt32(textBoxA.Text);
double[] s = new double[105];
for (int k = Sm, j = 0; k < Sp - 1; k++, j++)
{
s[j] = k;
}
double[] sin0 = new double[1536];
double[] cos0 = new double[1536];
double[] sin1 = new double[1536];
double[] cos1 = new double[1536];
double Re = 0;
double Im = 0;
double[] y = new double[1536];
double[] yw = new double[1536];
for (int i = 0; i < N; i++)
{
sin0[i] = Math.Sin(2 * Math.PI * i * l / N);
cos0[i] = Math.Cos(2 * Math.PI * i * l / N);
}
for (int i = 0; i < (S * N); i++)
{
sin1[i] = Math.Sin(2 * Math.PI * (S * l + Sm) * i / (S * N));
cos1[i] = Math.Cos(2 * Math.PI * (S * l + Sm) * i / (S * N));
}
int r = 0;
do
{
for (int i = 0; i < N; i++)
{
int a = (Math.Abs(S * l + Sm) * 2 * i) % (S * N);
int b = 2 * l * i % N;
Re += A * cos1[a] * cos0[b] + A * sin1[a] * sin0[b];
Im += A * cos1[a] * sin0[b] - A * sin1[a] * cos0[b];
}
Complex complex1 = new Complex(Re, Im);
y[r] = Complex.Abs(complex1);
yw[r] = y[r] * W(r);
Re = Im = 0;
r++;
} while (Sm++ < Sp);
BarItem bar = pane.AddBar("Графік AЧX з ваговою функцією", s, yw, Color.Red);
pane.BarSettings.MinClusterGap = 0.0f;
}
private double W(int n)
{
int N = Convert.ToInt32(textBoxN.Text);
//if (n <= N / 2)
// {
Return 0.25 +0.75* (Math.Cos(Math.PI * (n -16)/ 32));
// }
// else return 0;
}
private double[] UnitU(int Q)
{
var U = new double[500];
int N = Convert.ToInt32(textBoxN.Text);
int S = Convert.ToInt32(textBoxS.Text);
int l = Convert.ToInt32(textBoxl.Text);
int A = Convert.ToInt32(textBoxA.Text);
for (int i = 0; i < N - 1; i++)
{
var a = (new Complex(0, 2 * Math.PI * i * (S * l + Q) / (S * N)));
U[i] = A * Math.Pow(Math.E, Complex.Abs(a));
}
return U;
}
private void button1_Click_1(object sender, EventArgs e)
{
DrawGraph();
}
}
Висновок:
Виконавши дану лабораторну роботу, я дослідив і проаналізував параметри амплітудно-частотної характеристики та вплив віконної обробки при спектральному аналізі сигналів.