МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра ЕОМ
ЗВІТ
до лабораторної роботи №2
на тему:
«Діагностика роботи цифрових фільтрів шляхом аналізу їх амплітудно-частотної характеристики»
з дисципліни:
«Проектування комп'ютерних засобів обробки сигналів і зображень»
Львів – 2015
Мета роботи:
Дослідити і проаналізувати параметри амплітудно-частотної характеристики та вплив віконної обробки при спектральному аналізі сигналів.
Завдання:
№ варіанту
N
l
Sm
Sp
S
A
№ вагової функції
27
32
21
-38
46
16
12
15
Номер функції
Назва
Тип функції
Діапазон зміни n
15
w(n) = 0.25 + 0,75 cos [ ((n-16)/32]
Теоретичні відомості
Для адекватного відтворення вхідного сигналу, що використовується в системах обробки, які розв’язують задачі спектрального аналізу сигналів, опис вхідного діагностичного сигналу представляється у формалізованому вигляді. Зазначені задачі розв’язуються цифровими методами, на основі швидких дискретних ортогональних перетворень, що представляються узагальненим класом швидких перетворень Фур'є з різними системами базисних функцій. Дані перетворення відносяться до класу лінійних ортогональних перетворень, зв'язаних з обчисленням виразів виду
,
де Х = [Х(0), Х(1), ... , Х(L-1)]Т , х = [х(0), х(1), ... , х(L-1)]Т - вектори, відповідно, вихідних гармонік і початкових відліків, А - відтворююча ортогональна матриця розміром L x L, L- кількість початкових відліків.
Системи, які реалізують ці алгоритми відносяться до стаціонарних систем з частотним коефіцієнтом передачі K(j):
де h(t) - імпульсна характеристика, що має таку інтерпретацію: якщо на вхід системи поступає гармонійний сигнал з відомою частотою і комплексною амплітудою , то комплексна амплітуда вихідного сигналу буде рівною:
(1)
Представлення частотного коефіцієнта передачі (див. формулу 1) в показниковій формі має вигляд:
,
де - амплітудно-частотна характеристика (АЧХ).
Оскільки для фільтрів з скінченою імпульсною характеристикою АЧХ є однією з визначальних характеристик, на основі її аналізу визначається достовірність побудови фільтра. Розглянемо варіант перевірки фільтра методом аналізу його АЧХ на прикладі системи опрацювання інформації когерентно-імпульсної РЛС з n каналами погоджених фільтрів. Для процесора, що виконує N-точкове амплітудне дискретне перетворення Фур’є згідно з формулою (2)
, (2)
де N визначає розмір перетворення, n-номер елемента віддалі, l – номер гармоніки, i-номер періоду повторення в межах інтервалу обчислення ДПФ, W(i) вагова функція, вхідний сигнал представимо у вигляді:
, (3)
де А - амплітуда сигналу, S - кількість частотних діапазонів між сусідніми l, Q – визначає смугу перевірки АЧХ (, де m, p - кількість гармонік, в діапазоні яких (відносно l) перевіряється АЧХ, , , si – біжуче значення частотного діапазону між сусідніми l).
Процедура діагностики відбувається таким чином. Для процесора задається значення гармоніки lj. На його інформаційні входи поступає вхідний сигнал . Зміна значень (синфазна і квадратурна складові) на вході процесора відбувається на кожному періоді повторення (по і). Одне значення визначається сумуванням по і (див.формулу 2). Після того змінюється частота поступлення , зміна задається значенням , і вираховується наступне значення .
Повна АЧХ, для заданого lj, отримується після поступлення на вхід S*N значень вхідного сигналу. На практиці обмежуються перевіркою АЧХ для 3l, відносно lj. Після перевірки амплітудно-частотних характеристик для всіх гармонік і елементів віддалі процес діагностики завершується. В ідеальному випадку характеристики всіх АЧХ повинні бути ідентичними.
Тобто, при використанні такого підходу процес перевірки розбивається на три етапи:
- задання значень для отримання числової послідовності вхідних сигналів;
- визначення значень Y(n,l) реальної АЧХ;
- порівняння значень ідеальної і реальної АЧХ в кожній точці виміру.
Застосування підходу дозволяє:
- виявити помилки в роботі з точністю до функціонального вузла, наприклад помилки в заданні вагової функції, при сумуванні, в ОЗП проміжних результатів, при пересиланні інформації між процесорами, конструктивні та технологічні помилки при проектуванні цифрових вузлів і т.п.;
- проводити діагностику в режимі реального часу;
- перевірити правильність функціювання і рівень шумів зовнішніх пристроїв, наприклад, приймача проміжної частоти;
- оцінити вплив різних типів вагових функцій на значення вихідного сигналу;
- перевірити в РРЧ значення інформації, що поступає на вхід системи опрацювання шляхом її запису в ОЗП;
- перевірити точностні параметри роботи процесорів;
- перевірити реакцію фільтра на поступлення збійної інформації.
Алгоритм формування вхідних даних для формування АЧХ полягають у видачі на кожному етапі обчислень синусоїдальної і косинусоїдальної складової комплексного сигналу, фаза яких відрізняється на значення Q на двох сусідніх періодах, на кожному з яких обчислюється одне значення U (i).
Хід роботи
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) згідно варіанту завдання.
Для вагової функції №27 обчислення виконується згідно виразу:
w(n) = 0.25 + 0,75 cos [ ((n-16)/32]
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;
namespace Zakrevskyi
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void zedGraph_Load(object sender, EventArgs e)
{
// DrawGraph();
}
private void button1_Click(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;
// Установим размеры шрифтов для меток вдоль осей
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);
}
masterPane.Add(pane);
masterPane.Add(pane1);
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);
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[512];
double [] cos0= new double[512];
double [] sin1=new double[512];
double [] cos1=new double[512];
double Re=0;
double Im =0;
double [] y=new double[512];
double[] yw = new double[512];
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];
}
y[r] = (new Complex(Re, Im).Abs());
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[512];
double[] cos0 = new double[512];
double[] sin1 = new double[512];
double[] cos1 = new double[512];
double Re = 0;
double Im = 0;
double[] y = new double[512];
double[] yw = new double[512];
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];
} y[r] = (new Complex(Re, Im).Abs());
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);
double w;
for (n = 1; n < N; n++)
{
w = 0.25 + 0.75 * Math.Cos(Math.PI * ((n - 16) / 32));
return w;
}
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,a.Abs());
}
return U;
}
}
}
Висновок:
Виконавши дану лабораторну роботу, я дослідив і проаналізував параметри амплітудно-частотної характеристики та вплив віконної обробки при спектральному аналізі сигналів.