Ход выполнения работы
-
В соответствии с вариантом для заданного непрерывного сигнала и в соответствии с теоремой Котельникова определить частоту дискретизации непрерывного сигнала.
-
Для заданного непрерывного сигнала произвести дискретизацию средствами SCILAB с частотой, полученной в п.1 на интервале . Графики исходного и полученного дискретного сигнала занести в отчет.
-
Для первых 8 отсчетов дискретного сигнала по формуле 7, а затем используя векторно-матричную форму, выполнить ДПФ. Расчеты и полученные результаты занести в отчет.
-
Выполнить ОДПФ по формуле 8, а затем используя векторно-матричную форму. Расчеты и результаты вычислений занести в отчет.
-
Сравнить результаты п. 3 и 4. Сделать выводы.
-
На языке С++ с использованием библиотеки OpenCV 2.4.0 написать программу, вычисляющую ДПФ и ОДПФ для дискретного сигнала длиной N (по формуле 7 и в векторно-матричной форме). Встроенные функции OpenCV для вычисления ДПФ и ОДПФ использовать нельзя.
-
Выполнить ДПФ и ОДПФ для дискретного сигнала средствами SCILAB на всем интервале дискретизации. Спектр полученного сигнала занести в отчет. Сравнить с результатами п.п.3,4 и 6. Сделать выводы.
-
Дополнительное задание (необязательное). Программная реализация графического представления спектра сигнала на языке С++ с использованием OpenCV 2.4.0.
Варианты индивидуальных заданий
№ вар | Непрерывный сигнал | № вар | Непрерывный сигнал |
1 | 11 | ||
2 | 12 | ||
3 | 13 | ||
4 | 14 | ||
5 | 15 | ||
6 | 16 | ||
7 | 17 | ||
8 | 18 | ||
9 | 19 | ||
10 | 20 |
Контрольные вопросы
-
Сформулируйте теорему Котельникова.
-
Что такое гармонический сигнал и каковы его основные характеристики.
-
Что называется дискретизацией и квантованием непрерывного сигнала?
-
Что такое спектр сигнала?
-
Приведите формулы для прямого и обратного дискретного преобразования Фурье в показательной и тригонометрической форме.
-
Выполните ДПФ и ОДПФ для дискретного сигнала 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;
}
Yandex.RTB R-A-252273-3