Лабораторная работа №1
Тема: «Спектральное оценивание сигналов»
Задание:
Реализовать программу, моделирующую полигармонический сигнал, и оценивающую его спектр.
Ход работы:
Теория:
Гармонический сигнал — это гармонические колебания, со временемраспространяющиеся в пространстве, которые несут в себе информацию или какие-то данные и описываются уравнением:
где А — амплитуда сигнала;
— фаза гармонического сигнала;
— время;
— циклическая частота сигнала;
Полигармонический сигнал – сумма гармонических сигналов.
Для спектрального оценивания сигнала используем процедуру вычисления дискретного преобразования Фурье.
Для этого необходимо выполнить следующие 3 шага
1) Вычислить
2) Вычислить
3) Вычислить
Программная реализация:
Для реализации поставленной задачи, было решено использовать язык С++ и кроссплатформенный инструментарий для разработки ПО QT.
Рассмотрим, как работает разработанное приложение:
При запуске исполняемого файла открывается главное окно
Рисунок 1 – Главное окно программы
Необходимо ввести данные и нажать кнопку «рассчитать данные», а затем выбрать какой график отрисовывать и нажать кнопку «Отрисовка графика»
Рисунок 2 – Окно программы с построенным графиком
Рисунок 3 – Рассчитанный программно спектр гармонического сигнала
Лабораторная работа №2
Тема: «Типовые процедуры цифровой обработки сигнала. Цифровые фильтры»
Задание: Реализовать программу, моделирующую работу следующих цифровых фильтров:
· Фильтр Хеннинга
· Параболический фильтр
· Рекурсивный фильтр первого порядка
· НЧФ
· ВЧФ
· Полосовой фильтр
· Режекторный фильтр
Ход работы:
Теория:
Рассмотрим, какие формулы применяются для реализации указанных в задании цифровых фильтров
1) Фильтр Хеннинга.
y(u) = 1/4[x(u) + 2x(u-1) + x (u-2)]
2) Параболический фильтр.
y(u) = 1/35[-3 x(u-2) + 12 x(n-1) + 17x(u) + 12x(u+1) - 3x(u-2)]
3) Рекурсивный фильтр первого порядка
y(u) = x(u) + 1/2 * y(u-1)
4) Рекурсивные фильтры второго порядка
y(u) = b0 * x(u) + b1 * x(u-1) + b2 * x(u-2) - a1 * y(u-1) - a2 * y(u-2)
Коэффициенты для формулы необходимо брать из следующей таблицы (в зависимости от того, какой фильтр используется).
b1 | b2 | a1 | a2 | |
Низкочастотный | 2 r cos(![]() | ![]() | ||
Полосовой | -1 | -2 r cos(![]() | ![]() | |
Высокочастотный | -2 | -2 r cos(![]() | ![]() | |
Режекторный | -2соs(![]() | -r cos (![]() | ![]() |
Программная реализация:
Для реализации поставленной задачи было решено использовать язык С++ и кроссплатформенный инструментарий для разработки программного обеспечений QT.
Рассмотрим как работает разработанное приложение:
При запуске исполняемого файла открывается главное окно.
Рисунок 4 – График сигнала с помехами
После ввода в него исходных данных отрисуем график сигнала с помехами.
Далее перейдем к вкладке фильтры и выберем фильтр (например фильтр Хеннинга).
Рисунок 5 – График сигнала до использования фильтра
Применяем фильтр и видим, что график сигнала изменился (помеха уменьшилась).
Рисунок 6 – График сигнала после использования фильтра
Для того, чтобы посмотреть амплитудно-частотную характеристику фильтра необходимо открыть вкладку АЧХ.
Рисунок 7 – АЧХ фильтра Хеннинга
Вкладки «спектральная плотность мощности» и «спектр гармонического сигнала» отображают соответственно спектральную плотность мощности и спектр гармонического сигнала.
Рисунок 8 – Спектральная плотность мощности
Рисунок 9 – Спектр гармонического сигнала
Аналогично работают остальные фильтры:
Рисунок 10 - Фильтр первого порядка Рисунок 11 - ВЧФ
Рисунок 12–НЧФ Рисунок 13–Полосовой фильтр
Рисунок 14 – Режекторный фильтр Рисунок 15 Параболический фильтр
Вывод:
После того, как была проделана работа по написанию и отладке программы, реализующей различный цифровые фильтры, был сделан следующий вывод: каждый фильтр имеет свои преимущества и недостатки при использовании с различными сигналами и различными помехами.
Кодпрограммы:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qmath.h>
#include <QGraphicsTextItem>
#include <QMessageBox>
qreal Objects::max_h_sig =0;
qreal Objects::max_w_sig =0;
qreal Objects::max_h_spk =0;
qreal Objects::max_w_spk =0;
qreal Objects::max_h_spk_grm =0;
qreal Objects::max_w_spk_grm =0;
QList <QPointF>* Objects::Signal =new QList<QPointF>();
QList <QPointF>* Objects::Signal_s_pomehoi =new QList<QPointF>();
QList <QPointF>* Objects::Pobeha =new QList<QPointF>();
QList <QPointF>* Objects::Filtrovannii_signal =new QList<QPointF>();
QList<QPointF>* Objects::Spektr =new QList<QPointF>();
QList<QPointF>* Objects::Spektr_garm =new QList<QPointF>();
QList <QPointF>* Objects::Filtr_1 =new QList<QPointF>();
QList <QPointF>* Objects::Filtr_2 =new QList<QPointF>();
QList <QPointF>* Objects::Filtr_3 =new QList<QPointF>();
QList <QPointF>* Objects::Filtr_4 =new QList<QPointF>();
QList <QPointF>* Objects::Filtr_5 =new QList<QPointF>();
QList <QPointF>* Objects::Filtr_6 =new QList<QPointF>();
QList <QPointF>* Objects::Filtr_7 =new QList<QPointF>();
QList <QPointF>* Objects::ACH1 =new QList<QPointF>();
QList <QPointF>* Objects::ACH2 =new QList<QPointF>();
QList <QPointF>* Objects::ACH3 =new QList<QPointF>();
QList <QPointF>* Objects::ACH4 =new QList<QPointF>();
QList <QPointF>* Objects::ACH5 =new QList<QPointF>();
QList <QPointF>* Objects::ACH6 =new QList<QPointF>();
QList <QPointF>* Objects::ACH7 =new QList<QPointF>();
QList <QPointF>* Spektr;
inline void MainWindow::DrawACH(int scale)
{
QList<QPointF>* CurrentSignal;
{
if (ui->radioButtonF1->isChecked() == true) CurrentSignal = Objects::ACH1;
if (ui->radioButtonF2->isChecked() == true) CurrentSignal = Objects::ACH2;
if (ui->radioButtonF3->isChecked() == true) CurrentSignal = Objects::ACH3;
if (ui->radioButtonF4->isChecked() == true) CurrentSignal = Objects::ACH4;
if (ui->radioButtonF5->isChecked() == true) CurrentSignal = Objects::ACH5;
if (ui->radioButtonF6->isChecked() == true) CurrentSignal = Objects::ACH6;
if (ui->radioButtonF7->isChecked() == true) CurrentSignal = Objects::ACH7;
}
QGraphicsScene *scene = new QGraphicsScene();
scene->clear();
ui->graphicsView_4->setScene(scene);
scene->addLine(0,0,ui->graphicsView->size().width()*scale/100,0);
qreal max_x =CurrentSignal->back().rx();
qreal max_y = 0;
for (QList<QPointF>::Iterator i = CurrentSignal->begin();i!= CurrentSignal->end();i++)
{
if ((*i).y()>max_y) max_y=(*i).y();
}
qreal coefficient_x=ui->graphicsView->size().width()*scale/max_x/100;
qreal coefficient_y=ui->graphicsView->size().height()/max_y;
QPen * colour = new QPen(QColor(255,0,0));
colour->setWidth(2);
for (QList<QPointF>::iterator CurrObj= CurrentSignal->begin(); CurrObj!=CurrentSignal->end(); CurrObj++)
{
scene->addLine(QLineF((*CurrObj).x()*coefficient_x,
-(*CurrObj).y()*coefficient_y,
(*CurrObj).x()*coefficient_x,
qreal(0.0)),
*colour);
}
for (int i=0;i<=floor(max_x);i+=(1.0/ui->doubleSpinBox_2->value())/20)
{
scene->addLine(i*coefficient_x,-10,i*coefficient_x,10);
QString Text;
Text.setNum(i);
QGraphicsTextItem *tempText = scene->addText(Text.toLower());
tempText->setPos(i*coefficient_x,10);
}
}
inline void MainWindow::DrawSignal(int scale)
{
QList<QPointF>* CurrentSignal;
if (ui->radioButton1->isChecked()) CurrentSignal = Objects::Signal;
if (ui->radioButton2->isChecked()) CurrentSignal = Objects::Pobeha;
if (ui->radioButton3->isChecked()) CurrentSignal = Objects::Signal_s_pomehoi;
if (ui->radioButton4->isChecked())
{
if (ui->radioButtonF1->isChecked() == true) CurrentSignal = Objects::Filtr_1;
if (ui->radioButtonF2->isChecked() == true) CurrentSignal = Objects::Filtr_2;
if (ui->radioButtonF3->isChecked() == true) CurrentSignal = Objects::Filtr_3;
if (ui->radioButtonF4->isChecked() == true) CurrentSignal = Objects::Filtr_4;
if (ui->radioButtonF5->isChecked() == true) CurrentSignal = Objects::Filtr_5;
if (ui->radioButtonF6->isChecked() == true) CurrentSignal = Objects::Filtr_6;
if (ui->radioButtonF7->isChecked() == true) CurrentSignal = Objects::Filtr_7;
}
QGraphicsScene *scene = new QGraphicsScene();
scene->clear();
ui->graphicsView->setScene(scene);
scene->addLine(0,0,ui->graphicsView->size().width()*scale/100,0);
qreal coefficient_x=ui->graphicsView->size().width()*scale/Objects::max_w_sig/100;
qreal coefficient_y=ui->graphicsView->size().height()/Objects::max_h_sig/2;
QPen * colour = new QPen(QColor(255,0,0));
colour->setWidth(2);
for (QList<QPointF>::iterator CurrObj= CurrentSignal->begin(); CurrObj!=CurrentSignal->end()-1; CurrObj++)
{
scene->addLine(QLineF((*CurrObj).x()*coefficient_x,
(*CurrObj).y()*coefficient_y,
(*(CurrObj+1)).x()*coefficient_x,
(*(CurrObj+1)).y()*coefficient_y),
*colour);
}
for (int i=0;i<=floor(Objects::max_w_sig);i++)
{
scene->addLine(i*coefficient_x,-10,i*coefficient_x,10);
QString Text;
Text.setNum(i);
QGraphicsTextItem *tempText = scene->addText(Text.toLower());
tempText->setPos(i*coefficient_x,10);
}
}
inline void MainWindow::DrawSpektr(int scale)
{
QGraphicsScene *scene = new QGraphicsScene();
scene->clear();
ui->graphicsView_2->setScene(scene);
scene->addLine(0,0,ui->graphicsView->size().width()*scale/100,0);
qreal coefficient_x=ui->graphicsView_2->size().width()*scale/Objects::max_w_spk/100;
qreal coefficient_y=ui->graphicsView_2->size().height()/Objects::max_h_spk/2*-1;
QPen * colour = new QPen(QColor(255,0,0));
colour->setWidth(2);
int step = 1/ui->doubleSpinBox_2->value();
for (QList<QPointF>::iterator CurrObj= Objects::Spektr->begin(); CurrObj!=Objects::Spektr->end()-1; CurrObj++)
{
scene->addLine(QLineF((*CurrObj).x()*coefficient_x,
(*CurrObj).y()*coefficient_y,
(*(CurrObj+1)).x()*coefficient_x,
(*(CurrObj+1)).y()*coefficient_y),
*colour);
}
for (qreal i=0;i<=(Objects::max_w_sig);i+=0.025)
{
scene->addLine(i*coefficient_x,-10,i*coefficient_x,10);
QString Text;
Text.setNum(floor(i/(Objects::max_w_sig) * (1/ui->doubleSpinBox_2->value())));
QGraphicsTextItem *tempText = scene->addText(Text.toLower());
tempText->setPos(i*coefficient_x,10);
}
}
inline void MainWindow::DrawSpektrGarm(int scale)
{
QGraphicsScene *scene = new QGraphicsScene();
scene->clear();
ui->graphicsView_3->setScene(scene);
scene->addLine(0,0,ui->graphicsView->size().width()*scale/100,0);
qreal coefficient_x=ui->graphicsView_2->size().width()*scale/Objects::max_w_spk_grm/100;
qreal coefficient_y=ui->graphicsView_2->size().height()/Objects::max_h_spk_grm/2*-1;
QPen * colour = new QPen(QColor(255,0,0));
colour->setWidth(2);
int step = 1/ui->doubleSpinBox_2->value();
for (QList<QPointF>::iterator CurrObj= Objects::Spektr_garm->begin(); CurrObj!=Objects::Spektr_garm->end()-1; CurrObj++)
{
scene->addLine(QLineF((*CurrObj).x()*coefficient_x,
(*CurrObj).y()*coefficient_y,
(*(CurrObj+1)).x()*coefficient_x,
(*(CurrObj+1)).y()*coefficient_y),
*colour);
}
for (qreal i=0;i<=(Objects::max_w_sig);i+=0.025)
{
scene->addLine(i*coefficient_x,-10,i*coefficient_x,10);
QString Text;
Text.setNum(floor(i/(Objects::max_w_sig) * (1/ui->doubleSpinBox_2->value())));
QGraphicsTextItem *tempText = scene->addText(Text.toLower());
tempText->setPos(i*coefficient_x,10);
}
}
MainWindow::MainWindow(QWidget *parent):
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->tableWidget->setRowCount(1);
ui->tableWidget->setColumnCount(3);
ui->tableWidget->setHorizontalHeaderItem(0,new QTableWidgetItem("Амплитуда",1));
ui->tableWidget->setHorizontalHeaderItem(1,new QTableWidgetItem("Частота",1));
ui->tableWidget->setHorizontalHeaderItem(2,new QTableWidgetItem("Фаза",1));
ui->tableWidget_2->setRowCount(1);
ui->tableWidget_2->setColumnCount(3);
ui->tableWidget_2->setHorizontalHeaderItem(0,new QTableWidgetItem("max амплитуда",1));
ui->tableWidget_2->setHorizontalHeaderItem(1,new QTableWidgetItem("Частота",1));
ui->tableWidget_2->setHorizontalHeaderItem(2,new QTableWidgetItem("Фаза",1));
ui->label_5-> setVisible (false);
}
MainWindow::~ MainWindow ()
{
delete ui;
}
void MainWindow::on_spinBox_valueChanged(int arg1)
{
ui->tableWidget->setRowCount(arg1);
}
void MainWindow::on_pushButton_clicked()
{
try
{
bool OK = true;
for (int i=0; i<ui->tableWidget->rowCount(); i++)
for (int j=0; j<ui->tableWidget->columnCount(); j++)
{
if (ui->tableWidget->item(i,j)==NULL) throw 1; //Заполненыневсеполя
ui->tableWidget->item(i,j)->text().toDouble(&OK);
}
for (int i=0; i<ui->tableWidget_2->rowCount(); i++)
for (int j=0; j<ui->tableWidget_2->columnCount(); j++)
{
if (ui->tableWidget_2->item(i,j)==NULL) throw 1; //Заполненыневсеполя
ui->tableWidget_2->item(i,j)->text().toDouble(&OK);
}
if (!OK) throw 2; //Ошибка при вводе данных
ui->horizontalSlider->setEnabled(true);
ui->horizontalSlider->setValue(100);
Objects::Signal->clear();
Objects::Signal->clear();
for (qreal x=0; x<ui->doubleSpinBox->value(); x+=ui->doubleSpinBox_2->value())
{
QPointF * CurrObj = new QPointF(x,0);
for (int i=0;i<ui->tableWidget->rowCount();i++)
{
qreal A = ui->tableWidget->item(i,0)->text().toDouble();
qreal f = ui->tableWidget->item(i,1)->text().toDouble();
qreal F = ui->tableWidget->item(i,2)->text().toDouble();
CurrObj->setY(CurrObj->y()+ A * cos(2 * 3.14 *f * (*CurrObj).x() + F));
}
Objects::Signal->push_back(*CurrObj);
}
Objects::Pobeha->clear();
for (qreal x=0; x<ui->doubleSpinBox->value(); x+=ui->doubleSpinBox_2->value())
{
QPointF * CurrObj = new QPointF(x,0);
for (int i=0;i<ui->tableWidget_2->rowCount();i++)
{
qreal A = ui->tableWidget_2->item(i,0)->text().toDouble();
qreal f = ui->tableWidget_2->item(i,1)->text().toDouble();
qreal F = ui->tableWidget_2->item(i,2)->text().toDouble();
CurrObj->setY(CurrObj->y()+ A *(qrand()%10000) /10000 * cos(2 * 3.14 *f * (*CurrObj).x() + F));
}
Objects::Pobeha->push_back(*CurrObj);
}
Objects::Signal_s_pomehoi->clear();
int i=0;
for (qreal x=0; x<ui->doubleSpinBox->value(); x+=ui->doubleSpinBox_2->value())
{
QPointF * CurrObj = new QPointF(x,0);
QList <QPointF>::iterator t1 = Objects::Signal->begin();
QList <QPointF>::iterator t2 = Objects::Pobeha->begin();
CurrObj->setY(Objects::Signal->at(i).y() + Objects::Pobeha->at(i).y());
Objects::Signal_s_pomehoi->push_back(*CurrObj);
i++;
}
Objects::max_w_sig = Objects::Signal->at(Objects::Signal->size()-1).x();
Objects::max_h_sig = 0;
for (QList <QPointF>::iterator j = Objects::Signal_s_pomehoi->begin(); j!=Objects::Signal_s_pomehoi->end(); j++)
{
if ((*j).y()> Objects::max_h_sig) Objects::max_h_sig = (*j).y();
}
ui->pushButton_2->setEnabled(true);
/////////////////
Objects::Spektr->clear();
for (int k=0;k<Objects::Signal_s_pomehoi->size();k++)
{
qreal Re=0;
qreal Im=0;
for (int n=0;n<Objects::Signal_s_pomehoi->size();n++)
{
Re+= Objects::Signal_s_pomehoi->at(n).y() *cos(-2 * 3.14 * n *k / Objects::Signal_s_pomehoi->size());
Im+= Objects::Signal_s_pomehoi->at(n).y() *sin(-2 * 3.14 * n *k / Objects::Signal_s_pomehoi->size());
}
Objects::Spektr->push_back(QPointF(Objects::Signal_s_pomehoi->at(k).x(),((Re*Re) + (Im*Im))/Objects::Signal_s_pomehoi->size()));
}
Objects::Spektr_garm->clear();
for (int k=0;k<Objects::Signal->size();k++)
{
qreal Re=0;
qreal Im=0;
for (int n=0;n<Objects::Signal->size();n++)
{
Re+= Objects::Signal->at(n).y() *cos(-2 * 3.14 * n *k / Objects::Signal->size());
Im+= Objects::Signal->at(n).y() *sin(-2 * 3.14 * n *k / Objects::Signal->size());
}
Objects::Spektr_garm->push_back(QPointF(Objects::Signal->at(k).x(),sqrtf((Re*Re) + (Im*Im))));
}
Objects::max_w_spk = Objects::Signal->at(Objects::Spektr->size()-1).x();
Objects::max_h_spk = 0;
for (QList <QPointF>::iterator j = Objects::Spektr->begin(); j!=Objects::Spektr->end(); j++)
{
if ((*j).y()> Objects::max_h_spk) Objects::max_h_spk = (*j).y();
}
Objects::max_w_spk_grm = Objects::Signal->at(Objects::Spektr_garm->size()-1).x();
Objects::max_h_spk_grm = 0;
for (QList <QPointF>::iterator j = Objects::Spektr_garm->begin(); j!=Objects::Spektr_garm->end(); j++)
{
if ((*j).y()> Objects::max_h_spk_grm) Objects::max_h_spk_grm = (*j).y();
}
////Фильтры
/// F1 Хеннинг
{
Objects::Filtr_1->clear();
QList <QPointF>::iterator x0 = Objects::Signal_s_pomehoi->begin();
QList <QPointF>::iterator x1 = x0+1;
QList <QPointF>::iterator x2 = x1+1;
while (x2!= Objects::Signal_s_pomehoi->end())
{
QPointF * CurrObj = new QPointF((*x2).x(),0);
CurrObj->setY((*x0).y()/4 + (*x1).y()/2 + (*x2).y()/4);
Objects::Filtr_1->push_back(*CurrObj);
x0++;
x1++;
x2++;
}
}
/// F2 Параболический
{
Objects::Filtr_2->clear();
QList <QPointF>::iterator x0 = Objects::Signal_s_pomehoi->begin();
QList <QPointF>::iterator x1 = x0+1;
QList <QPointF>::iterator x2 = x1+1;
QList <QPointF>::iterator x3 = x2+1;
QList <QPointF>::iterator x4 = x3+1;
while (x4!= Objects::Signal_s_pomehoi->end())
{
QPointF * CurrObj = new QPointF((*x2).x(),0);
CurrObj->setY(((*x0).y() * (-3) + (*x1).y() *12 + (*x2).y() * 17 + (*x3).y()*12 + (*x4).y()*(-3))/35);
Objects::Filtr_2->push_back(*CurrObj);
x0++;
x1++;
x2++;
x3++;
x4++;
}
}
/// F3 Первого порядка (!!!!)
{
Objects::Filtr_3->clear();
QList <QPointF>::iterator x0 = Objects::Signal_s_pomehoi->begin()+1;
QPointF y1 = Objects::Signal_s_pomehoi->at(0);
// QPointF y1(0,0);
while (x0!= Objects::Signal_s_pomehoi->end())
{
QPointF * CurrObj = new QPointF((*x0).x(),0);
CurrObj->setY((*x0).y() + ui->doubleSpinBoxR->value() * y1.y());
Objects::Filtr_3->push_back(*CurrObj);
y1.setY(CurrObj->y());
x0++;
}
}
/// F4 НЧФ (!!!!)
{
Objects::Filtr_4->clear();
QList <QPointF>::iterator x0 = Objects::Signal_s_pomehoi->begin()+3;
QList <QPointF>::iterator x1 = Objects::Signal_s_pomehoi->begin()+2;
QList <QPointF>::iterator x2 = Objects::Signal_s_pomehoi->begin()+1;
//QPointF y0 = Objects::Signal_s_pomehoi->at(0);
QPointF y1(0,0);
QPointF y2(0,0);
qreal a0=1;
qreal b0=1;
qreal a1=2;
qreal a2=1;
qreal b1=-2*ui->doubleSpinBoxR->value()*cos(2*3.14*(ui->doubleSpinBoxFi->value()/ui->doubleSpinBox_2->value()));
qreal b2=(ui->doubleSpinBoxR->value()*ui->doubleSpinBoxR->value());
while (x0!= Objects::Signal_s_pomehoi->end())
{
QPointF * CurrObj = new QPointF((*x1).x(),0);
CurrObj->setY(a0*(*x0).y() + a1 *(*x1).y() + a2 *(*x2).y() + b1 * y1.y() - b2*y2.y()); ///добавитькоэфф r //fc и fd
Objects::Filtr_4->push_back(*CurrObj);
y2.setY(y1.y());
y1.setY(CurrObj->y());
x0++;
x1++;
x2++;
}
}
/// F5 ВЧФ (!!!!)
{
Objects::Filtr_5->clear();
QList <QPointF>::iterator x0 = Objects::Signal_s_pomehoi->begin()+3;
QList <QPointF>::iterator x1 = Objects::Signal_s_pomehoi->begin()+2;
QList <QPointF>::iterator x2 = Objects::Signal_s_pomehoi->begin()+1;
//QPointF y0 = Objects::Signal_s_pomehoi->at(0);
QPointF y1(0,0);
QPointF y2(0,0);
qreal a0=1;
qreal b0=1;
qreal a1=-2;
qreal a2=1;
qreal b1=-2*ui->doubleSpinBoxR->value()*cos(2*3.14*(ui->doubleSpinBoxFi->value()/ui->doubleSpinBox_2->value()));
qreal b2=(ui->doubleSpinBoxR->value()*ui->doubleSpinBoxR->value());
while (x0!= Objects::Signal_s_pomehoi->end())
{
QPointF * CurrObj = new QPointF((*x1).x(),0);
CurrObj->setY(a0*(*x0).y() + a1 *(*x1).y() + a2 *(*x2).y() + b1 * y1.y() - b2*y2.y()); ///добавитькоэфф r //fc и fd
Objects::Filtr_5->push_back(*CurrObj);
y2.setY(y1.y());
y1.setY(CurrObj->y());
x0++;
x1++;
x2++;
}
}
/// F6 Полосовой (!!!!)
{
Objects::Filtr_6->clear();
QList <QPointF>::iterator x0 = Objects::Signal_s_pomehoi->begin()+3;
QList <QPointF>::iterator x1 = Objects::Signal_s_pomehoi->begin()+2;
QList <QPointF>::iterator x2 = Objects::Signal_s_pomehoi->begin()+1;
//QPointF y0 = Objects::Signal_s_pomehoi->at(0);
QPointF y1(0,0);
QPointF y2(0,0);
qreal a0=1;
qreal b0=1;
qreal a1=0;
qreal a2=-1;
qreal b1=-2*ui->doubleSpinBoxR->value()*cos(2*3.14*(ui->doubleSpinBoxFi->value()/ui->doubleSpinBox_2->value()));
qreal b2=(ui->doubleSpinBoxR->value()*ui->doubleSpinBoxR->value());
while (x0!= Objects::Signal_s_pomehoi->end())
{
QPointF * CurrObj = new QPointF((*x1).x(),0);
CurrObj->setY(a0*(*x0).y() + a1 *(*x1).y() + a2 *(*x2).y() + b1 * y1.y() - b2*y2.y()); ///добавитькоэфф r //fc и fd
Objects::Filtr_6->push_back(*CurrObj);
y2.setY(y1.y());
y1.setY(CurrObj->y());
x0++;
x1++;
x2++;
}
}
/// F7 Режекторный (!!!!)
{
Objects::Filtr_7->clear();
QList <QPointF>::iterator x0 = Objects::Signal_s_pomehoi->begin()+3;
QList <QPointF>::iterator x1 = Objects::Signal_s_pomehoi->begin()+2;
QList <QPointF>::iterator x2 = Objects::Signal_s_pomehoi->begin()+1;
//QPointF y0 = Objects::Signal_s_pomehoi->at(0);
QPointF y1(0,0);
QPointF y2(0,0);
qreal a0=1;
qreal b0=1;
qreal a1=-2 * cos (2 * 3.14 * (ui->doubleSpinBoxFi->value()/ui->doubleSpinBox_2->value()));
qreal a2=1;
qreal b1=-ui->doubleSpinBoxR->value()*cos(2*3.14*(ui->doubleSpinBoxFi->value()/ui->doubleSpinBox_2->value()));
qreal b2=(ui->doubleSpinBoxR->value()*ui->doubleSpinBoxR->value());
while (x0!= Objects::Signal_s_pomehoi->end())
{
QPointF * CurrObj = new QPointF((*x1).x(),0);
CurrObj->setY(a0*(*x0).y() + a1 *(*x1).y() + a2 *(*x2).y() + b1 * y1.y() - b2*y2.y()); ///добавитькоэфф r //fc и fd
Objects::Filtr_7->push_back(*CurrObj);
y2.setY(y1.y());
y1.setY(CurrObj->y());
x0++;
x1++;
x2++;
}
}
///АЧХ 1 фильтра
{
Objects::ACH1->clear();
float N = 1/ui->doubleSpinBox_2->value();
float r = ui->doubleSpinBoxR->value();
for (float i=0;i< N;i = i+1)
{
double acos = (1.0/4.0 + (1.0/2.0)*cos(1*2*3.14*i/N) + (1.0/4.0)*cos(2*2*3.14*i/N));
double asin = ((1.0/2.0)*sin(1*2*3.14*i/N) + (1.0/4.0) * sin(2*2*3.14*i/N));
double bcos = (1.0 + 0.0*cos(1*2*3.14*i/N) + 0.0*cos(2*2*3.14*i/N));
double bsin = (0.0*sin(1*2*3.14*i/N) + 0.0 * sin(2*2*3.14*i/N));
QPointF * CurrPoint = new QPointF(i,sqrt(((acos*acos)+(asin*asin))/((bcos*bcos)+(bsin*bsin))));
Objects::ACH1->push_back(*CurrPoint);
}
}
///АЧХ 2 фильтра
{
Objects::ACH2->clear();
float N = 1/ui->doubleSpinBox_2->value();
float r = ui->doubleSpinBoxR->value();
for (float i=0;i< N;i = i+1)
{
double acos = (17.0/35.0 + (12.0/35.0)*cos(1*2*3.14*i/N) + (-3.0/35.0)*cos(2*2*3.14*i/N) + (12.0/35.0)*cos(-1*2*3.14*i/N) + (-3.0/35.0)*cos(-2*2*3.14*i/N));
double asin =(12.0/35.0)*sin(1*2*3.14*i/N) + (-3.0/35.0)*sin(2*2*3.14*i/N) + (12.0/35.0)*sin(-1*2*3.14*i/N) + (-3.0/35.0)*sin(-2*2*3.14*i/N);
double bcos = (1.0 + 0.0*cos(1*2*3.14*i/N) + 0.0*cos(2*2*3.14*i/N));
double bsin = (0.0*sin(1*2*3.14*i/N) + 0.0 * sin(2*2*3.14*i/N));
QPointF * CurrPoint = new QPointF(i,sqrt(((acos*acos)+(asin*asin))/((bcos*bcos)+(bsin*bsin))));
Objects::ACH2->push_back(*CurrPoint);
}
}
///АЧХ 3 фильтра
{
Objects::ACH3->clear();
float N = 1/ui->doubleSpinBox_2->value();
float r = ui->doubleSpinBoxR->value();
for (float i=0;i< N;i = i+1)
{
double acos = (1.0/4.0 + (0.0)*cos(1*2*3.14*i/N) + (0.0)*cos(2*2*3.14*i/N));
double asin = ((0.0)*sin(1*2*3.14*i/N) + (0.0) * sin(2*2*3.14*i/N));
double bcos = (1.0 + (-r)*cos(1*2*3.14*i/N) + 0.0*cos(2*2*3.14*i/N));
double bsin = ((-r)*sin(1*2*3.14*i/N) + 0.0 * sin(2*2*3.14*i/N));
QPointF * CurrPoint = new QPointF(i,sqrt(((acos*acos)+(asin*asin))/((bcos*bcos)+(bsin*bsin))));
Objects::ACH3->push_back(*CurrPoint);
}
}
///АЧХ 4 фильтра
{
Objects::ACH4->clear();
float N = 1/ui->doubleSpinBox_2->value();
float r = ui->doubleSpinBoxR->value();
float fc = ui->doubleSpinBoxFi->value();
float fd = ui->doubleSpinBox_2->value();
for (float i=0;i< N;i = i+1)
{
double acos = (1.0 + (2.0)*cos(1*2*3.14*i/N) + (1.0)*cos(2*2*3.14*i/N));
double asin =(2.0)*sin(1*2*3.14*i/N) + (1.0)*sin(2*2*3.14*i/N);
double bcos = (1.0 + -2.0 * r * cos (2*3.14*(fc/fd))*cos(1*2*3.14*i/N) + r*r*cos(2*2*3.14*i/N));
double bsin = (-2.0 * r * cos (2*3.14*(fc/fd))*sin(1*2*3.14*i/N) + r*r * sin(2*2*3.14*i/N));
QPointF * CurrPoint = new QPointF(i,sqrt(((acos*acos)+(asin*asin))/((bcos*bcos)+(bsin*bsin))));
Objects::ACH4->push_back(*CurrPoint);
}
}
///АЧХ 5 фильтра
{
Objects::ACH5->clear();
float N = 1/ui->doubleSpinBox_2->value();
float r = ui->doubleSpinBoxR->value();
float fc = ui->doubleSpinBoxFi->value();
float fd = ui->doubleSpinBox_2->value();
for (float i=0;i< N;i = i+1)
{
double acos = (1.0 + (0.0)*cos(1*2*3.14*i/N) + (-1.0)*cos(2*2*3.14*i/N));
double asin =(0.0)*sin(1*2*3.14*i/N) + (-1.0)*sin(2*2*3.14*i/N);
double bcos = (1.0 + -2.0 * r * cos (2*3.14*(fc/fd))*cos(1*2*3.14*i/N) + r*r*cos(2*2*3.14*i/N));
double bsin = (-2.0 * r * cos (2*3.14*(fc/fd))*sin(1*2*3.14*i/N) + r*r * sin(2*2*3.14*i/N));
QPointF * CurrPoint = new QPointF(i,sqrt(((acos*acos)+(asin*asin))/((bcos*bcos)+(bsin*bsin))));
Objects::ACH5->push_back(*CurrPoint);
}
}
///АЧХ 6 фильтра
{
Objects::ACH6->clear();
float N = 1/ui->doubleSpinBox_2->value();
float r = ui->doubleSpinBoxR->value();
float fc = ui->doubleSpinBoxFi->value();
float fd = ui->doubleSpinBox_2->value();
for (float i=0;i< N;i = i+1)
{
double acos = (1.0 + (-2.0*cos(2.0*3.14*(fc/fd)))*cos(1*2*3.14*i/N) + (-1.0)*cos(2*2*3.14*i/N));
double asin =(-2.0*cos(2.0*3.14*(fc/fd)))*sin(1*2*3.14*i/N) + (-1.0)*sin(2*2*3.14*i/N);
double bcos = (1.0 + - r * cos (2*3.14*(fc/fd))*cos(1*2*3.14*i/N) + r*r*cos(2*2*3.14*i/N));
double bsin = (-r * cos (2*3.14*(fc/fd))*sin(1*2*3.14*i/N) + r*r * sin(2*2*3.14*i/N));
QPointF * CurrPoint = new QPointF(i,sqrt(((acos*acos)+(asin*asin))/((bcos*bcos)+(bsin*bsin))));
Objects::ACH6->push_back(*CurrPoint);
}
}
///АЧХ 7 фильтра
{
Objects::ACH7->clear();
float N = 1/ui->doubleSpinBox_2->value();
float r = ui->doubleSpinBoxR->value();
float fc = ui->doubleSpinBoxFi->value();
float fd = ui->doubleSpinBox_2->value();
for (float i=0;i< N;i = i+1)
{
double acos = (1.0 + (-2.0*cos(2.0*3.14*(fc/fd)))*cos(1*2*3.14*i/N) + (1.0)*cos(2*2*3.14*i/N));
double asin =(-2.0*cos(2.0*3.14*(fc/fd)))*sin(1*2*3.14*i/N) + (1.0)*sin(2*2*3.14*i/N);
double bcos = (1.0 + - r * cos (2*3.14*(fc/fd))*cos(1*2*3.14*i/N) + r*r*cos(2*2*3.14*i/N));
double bsin = (-r * cos (2*3.14*(fc/fd))*sin(1*2*3.14*i/N) + r*r * sin(2*2*3.14*i/N));
QPointF * CurrPoint = new QPointF(i,sqrt(((acos*acos)+(asin*asin))/((bcos*bcos)+(bsin*bsin))));
Objects::ACH7->push_back(*CurrPoint);
}
}
///
/////////////////////
//АЧХфильтра
//for j:=0 to N-1 do
//begin
//acos:=a0+a1*cos(1*2*pi*j/N)+a2*cos(2*2*pi*j/N);
//asin:= a1*sin(1*2*pi*j/N)+a2*sin(2*2*pi*j/N);
//bcos:=1+b1*cos(1*2*pi*j/N)+b2*cos(2*2*pi*j/N);
//bsin:= b1*sin(1*2*pi*j/N)+b2*sin(2*2*pi*j/N);
//AX[j]:=sqrt((sqr(acos)+sqr(asin))/(sqr(bcos)+sqr(bsin)));
//end;
/////////////////////
}
catch (int err)
{
/////
}
}
void MainWindow::on_horizontalSlider_valueChanged(int value)
{
DrawSignal(value);
}
void MainWindow::on_spinBox_2_valueChanged(int arg1)
{
ui->tableWidget_2->setRowCount(arg1);
}
void MainWindow::on_radioButton1_clicked()
{
// DrawSignal(ui->spinBox_2->value());
}
void MainWindow::on_radioButton2_clicked()
{
// DrawSignal(ui->spinBox_2->value());
}
void MainWindow::on_radioButton3_clicked()
{
// DrawSignal(ui->spinBox_2->value());
}
void MainWindow::on_radioButton4_clicked()
{
// DrawSignal(ui->spinBox_2->value());
}
void MainWindow::on_pushButton_2_clicked()
{
DrawSignal(ui->horizontalSlider->value());
DrawSpektr(ui->horizontalSlider_2->value());
DrawSpektrGarm(ui->horizontalSlider_3->value());
DrawACH(ui->horizontalSlider_4->value());
}
void MainWindow::on_horizontalSlider_2_valueChanged(int value)
{
DrawSpektr(value);
}
void MainWindow::on_horizontalSlider_3_valueChanged(int value)
{
DrawSpektrGarm(value);
}
void MainWindow::on_tabWidget_currentChanged(int index)
{
ui->horizontalSlider_2->setValue(100);
ui->horizontalSlider->setValue(100);
ui->horizontalSlider_3->setValue(100);
}
void MainWindow::on_horizontalSlider_4_valueChanged(int value)
{
DrawACH(value);
}
Лабораторная работа №3