Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
лабораторної роботи № 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();
}
}
Висновок:
Виконавши дану лабораторну роботу, я дослідив і проаналізував параметри амплітудно-частотної характеристики та вплив віконної обробки при спектральному аналізі сигналів.
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!