logo search
Цифра / ЦОСиИ_2014_2015_заочн / ЦОСиИ_лаб_1

Ход выполнения работы

  1. В соответствии с вариантом для заданного непрерывного сигнала и в соответствии с теоремой Котельникова определить частоту дискретизации непрерывного сигнала.

  2. Для заданного непрерывного сигнала произвести дискретизацию средствами SCILAB с частотой, полученной в п.1 на интервале . Графики исходного и полученного дискретного сигнала занести в отчет.

  3. Для первых 8 отсчетов дискретного сигнала по формуле 7, а затем используя векторно-матричную форму, выполнить ДПФ. Расчеты и полученные результаты занести в отчет.

  4. Выполнить ОДПФ по формуле 8, а затем используя векторно-матричную форму. Расчеты и результаты вычислений занести в отчет.

  5. Сравнить результаты п. 3 и 4. Сделать выводы.

  6. На языке С++ с использованием библиотеки OpenCV 2.4.0 написать программу, вычисляющую ДПФ и ОДПФ для дискретного сигнала длиной N (по формуле 7 и в векторно-матричной форме). Встроенные функции OpenCV для вычисления ДПФ и ОДПФ использовать нельзя.

  7. Выполнить ДПФ и ОДПФ для дискретного сигнала средствами SCILAB на всем интервале дискретизации. Спектр полученного сигнала занести в отчет. Сравнить с результатами п.п.3,4 и 6. Сделать выводы.

  8. Дополнительное задание (необязательное). Программная реализация графического представления спектра сигнала на языке С++ с использованием OpenCV 2.4.0.

Варианты индивидуальных заданий

вар

Непрерывный сигнал

вар

Непрерывный сигнал

1

11

2

12

3

13

4

14

5

15

6

16

7

17

8

18

9

19

10

20

Контрольные вопросы

  1. Сформулируйте теорему Котельникова.

  2. Что такое гармонический сигнал и каковы его основные характеристики.

  3. Что называется дискретизацией и квантованием непрерывного сигнала?

  4. Что такое спектр сигнала?

  5. Приведите формулы для прямого и обратного дискретного преобразования Фурье в показательной и тригонометрической форме.

  6. Выполните ДПФ и ОДПФ для дискретного сигнала S={1, -1, 1, -1}, используя векторно-матричную форму для данных преобразований.

Практические рекомендации по использованию ПО и примеры

Пакет SCILAB

Scilab - это язык высокого уровня для выполнения математических расчетов. Пакет включает в себя набор инструментов и интерактивную документацию. В первом приближении пакет является некоммерческим аналогом пакета Matlab. Пакет разработан Scilab Group INRIA-Rocquencourt Metalau Project. Свободно распространяемую версию пакета вместе с полной документацией на английском языке в формате pdf можно получить по адресу http://www.scilab.org. 

Сигналы в SCILAB

Аналоговый сигнал с математической точки зрения представляет собой функцию времени, и при его дискретизации получают отсчеты, являющиеся значениями этой функции, вычисленными в дискретные моменты времени. Поэтому для расчета дискретизированного сигнала необходимо сформировать вектор дискретных значений времени. Для этого удобно задать значение частоты дискретизации и использовать обратную величину в качестве шага временного ряда:

//частота дискретизации 10 Гц

Fd = 10;

//дискретные значения времени на интервале [0;2*pi] с шагом 0.01

t1 = 0:0.01:2*%pi;

//дискретные значения времени на интервале [0;2*pi] с шагом 1/Fd

t2 = 0:1/Fd:2*%pi;

Сформировав вектор опорных значений времени, можно вычислять значения сигнала, используя этот вектор в соответствующих формулах:

//частота - 2Гц

f1 = 2;

//частота - 4Гц

f2 = 4;

//непрерывный сигнал

s1 = (2*cos(2*%pi*f1*t1)+4*cos(2*%pi*f2*t1));

//дискретный сигнал

s2 = (2*cos(2*%pi*f1*t2)+4*cos(2*%pi*f2*t2));

//визуализация непрерывного сигнала (рис.4 - слева)

subplot(1, 2, 1);

plot(t1, s1);

xtitle('Непрерывный сигнал', 't', 's[t]');

//визуализация дискретного сигнала (рис.4 - справа)

subplot(1, 2, 2);

plot2d( t2, s2, -0);

xtitle('Дискретный сигнал', 't', 's[t]');

Рисунок 4 – Визуализация непрерывного (слева) и дискретного сигнала (справа)

Рисунок 5 – Считывание значений первых 8 отсчетов сигнала

Прямое и обратное ДПФ в SCILAB

Вычисление амплитуды и фазы спектра дискретного сигнала

Сигнал длительностью дискретизировали и получили массив дискретных отсчетов . Определить частоту дискретизации , найти и построить спектр дискретного сигнала.

Решение

Число дискретных отсчетов непрерывного сигнала .

Период дискретизации .

Частота дискретизации .

Спектр дискретного сигнала :

Модуль спектральной характеристики определяется выражениями:

- амплитуда;

- фаза,

где А(f) – действительная часть; B(f) – мнимая часть.

Спектр амплитуд:

.

, Гц

0

80

160

240

320

400

480

560

640

720

800

8

7,24

5,24

2,76

0,76

0

0,76

2,76

5,24

7,24

8

//период дискретизации

T=0.00125;

//число отсчетов дискретного сигнала

N=5;

s=[0,2,4,2,0];

//вычисление амплитуды и фазы спектра

n=0:N-1;

//частота дискретизации

F=800;

f=0:1:F;

//вычисление спектральных коэффициентов (ДПФ)

// n' – транспонирование вектора n

S_W=s*exp(-sqrt(-1)*n'*2*%pi*f*T);

Mag_S=abs(S_W);

Phase_S=atan(imag(S_W), real(S_W));

//построение графиков амплитуды (рис.6 слева) и фазы (рис.6 справа)

//спектра дискретного сигнала

subplot(1,2,1);

plot2d(f, Mag_S);

xlabel('Частота в Гц');

ylabel('abs(S)');

title('Амплитуда');

subplot(1,2,2);

plot2d(f, Phase_S);

xlabel('Частота в Гц');

ylabel('<(S)');

title('Фаза');

Рисунок 6 – Амплитуда (слева) и фаза (справа) спектра дискретного сигнала

Библиотека OpenCV

OpenCV (Open Source Computer Vision Library) - это библиотека компьютерного зрения, написанная на языке высокого уровня (C/C++) и содержащая алгоритмы для: интерпретации изображений, калибровки камеры по эталону, устранение оптических искажений, определения сходства, анализа движения, определение формы и слежения за объектом, 3D-реконструкции, сегментации, распознавание жестов и т.д.

Установка и настройка OpenCV 2.4.0 в MS VC++ 2010.

Запустив инсталлятор нужно выбрать директорию распаковки. Пусть, например, это будет корневая директория диска С. После распаковки библиотеки нужно настроить рабочую среду Visual C++ для использования OpenCV, т.е. прописать пути к include и lib (рис.7) файлам для Debug и Release конфигураций:

Рисунок 7

и прописать пути к каталогам С:\opencv\build\x86\vc10\bin; C:\opencv\build\common\tbb\ia32\vc10; в переменную PATH (рис.8), перезагрузить компьютер.

Рисунок 8

Далее в настройках проекта подключить библиотеки для Debug (рис.9): opencv_core240d.lib;opencv_imgproc240d.lib;opencv_highgui240d.lib; opencv_ml240d.lib;opencv_video240d.lib и Release (рис. 10) конфигураций: opencv_core240.lib;opencv_imgproc240.lib;opencv_highgui240.lib;opencv_ml240.lib;opencv_video240.lib.

Рисунок 9

Рисунок 10

Пример программы на С++ с использованием библиотеки OpenCV 2.4.0 по работе с комплексными числами, матрицами и векторами

#include <opencv2/opencv.hpp>

#include <ostream>

#include <complex>

using namespace std;

using namespace cv;

int main ( int argc, char **argv ){

/* Комплексное число с вещественной и мнимой частями

* - Вещественная часть: 4.0

* - Мнимая часть: 3.0*/

complex<double> c1(4.0, 3.0);

/* Создание комплексного числа в системе полярных координат

* - Амплитуда: 5.0

* - Фазовый угол: 0.75

*/

complex<float> c2(polar(5.0, 0.75));

// Вывод комплексного числа с вещественной и мнимой частями

cout << "c1: " << c1 << endl;

cout << "c2: " << c2 << endl;

// Вывод комплексного числа в полярных координатах

cout << "c1: magnitude: " << abs(c1) << " (squared magnitude: "

<< norm(c1) << ") " << " phase angle: " << arg(c1) << endl;

cout << "c2: magnitude: " << abs(c2) << " (squared magnitude: "

<< norm(c2) << ") " << " phase angle: " << arg(c2) << endl;

// Вывод сопряжений комплексных чисел

cout << "c1 conjugated: " << conj(c1) << endl;

cout << "c2 conjugated: " << conj(c2) << endl;

// Вывод результата вычисления

cout << "4.4 + c1 * 1.8: " << 4.4 + c1 * 1.8 << endl;

cout << "========================================" << endl;

cout << "========================================" << endl;

//матрица 4x4 комплексных чисел

Mat cMat = ( Mat_<complex<double>>(4, 4) <<

complex<double>(1.0, 0.0), complex<double>(1.0, 0.0),

complex<double>(1.0, 0.0), complex<double>(1.0, 0.0),

complex<double>(1.0, 0.0), complex<double>(0.0, -1.0),

complex<double>(-1.0, 0.0), complex<double>(0.0, 1.0),

complex<double>(1.0, 0.0), complex<double>(-1.0, 0.0),

complex<double>(1.0, 0.0), complex<double>(-1.0, 0.0),

complex<double>(1.0, 0.0), complex<double>(0.0, 1.0),

complex<double>(-1.0, 0.0), complex<double>(0.0, -1.0)

);

//вывод матрицы комплексных чисел

for(int i=0; i<4; i++){

for(int j=0; j<4; j++){

cout << cMat.at<complex<double>>(i, j) << " ";

}

cout << endl;

}

cout << "========================================" << endl;

//вывод элемента c координатами (1;3) матрицы комплексных чисел

//в виде z = Re + Img*i

cout << cMat.at<complex<double>>(1, 3).real() << "+"

<< cMat.at<complex<double>>(1,3).imag() << "*i" << endl;

cout << "========================================" << endl;

//вектор комплексных чисел

Mat cVect = ( Mat_<complex<double>>(1, 4) <<

complex<double>(1.0, 0.0), complex<double>(0.0, 0.0),

complex<double>(0.0, 0.0), complex<double>(1.0, 0.0) );

cout << "========================================" << endl;

//вывод вектора комплексных чисел

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

cout << cVect.at<complex<double>>(0, i);

cout << endl;

cout << "========================================" << endl;

//умножение матрицы на вектор

Mat mulVect = cVect*cMat;

//вывод результата умножения

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

cout << mulVect.at<complex<double>>(0, i);

cout << endl;

cout << "========================================" << endl;

//чтение изображения из файла

Mat img = imread("image.png");

if (!img.data){

printf("No image data\n");

return -1;

}

//создание окна для вывода изображения

namedWindow( "Display image", CV_WINDOW_AUTOSIZE);

//размещение текста на изображении

putText( img, "Hello world!", Point(200, 200),

CV_FONT_HERSHEY_SIMPLEX, 1, Scalar::all(0) );

//вывод изображения в окно

imshow("Display image", img);

//ожидание нажатия любой клавиши

cvWaitKey();

return 0;

}