- •Лабораторная работа 2 Анализ качества гспч
- •Тестирование равномерности распределения
- •Косвенная проверка равномерности распределения.
- •Проверка статистической независимости
- •Проверка длины периода
- •Лабораторная работа 3 Синтез генераторов случайных величин с заданными законами распределения
- •Лабораторная работа 4 Генератор гармонического сигнала. Преобразование Фурье.
- •Загрузка файла с индивидуальным сигналом и его разложение в спектр (в данном случае мы обнаружили гармоники 5Гц и 78Гц) Пояснения к выполнению работы
- •Задание
- •Генерация двух сигналов, их сумма и спектр
- •Исходные сигналы без фильтрации (коэффициент корреляции 0,64)
- •Сигналы после фильтра с окном 1-100 точек (коэффициент корреляции до 0,99 – требуемый результат)
Задание
Изучить теоретическую часть;
Запрограммировать генерацию двух гармонических сигналов заданной частоты (частота – произвольная) и их отображение на двух графиках;
Реализовать сигнал, равный сумме двух гармонических сигналов, сгенерированных по п.2;
Реализовать разложение итогового сигнала в спектр;
Выполнить загрузку файла с сигналом (1280 точек), выданным преподавателем (по вариантам), отобразить его на графике и реализовать его спектральное разложение. Пример:
Первый сигнал (20Гц)
Второй сигнал (50Гц)
Сумма 20Гц + 50Гц
Спектр
Генерация двух сигналов, их сумма и спектр
Загруженный из файла сигнал
Спектр
Сигнал из файла
Загрузка файла с индивидуальным сигналом и его разложение в спектр (в данном случае мы обнаружили гармоники 5Гц и 78Гц) Пояснения к выполнению работы
Создаем новый проект в C++ Builder (в данном примере использовался C++ Builder XE);
Помещаем необходимые элементы на форму, как указано в примере:
В обработчике события нажатия кнопки необходимо прописать генерацию трех сигналов по формуле (1).
Пример генерации с временным шагом (частота дискретизации) 1/1280:
for (float i=0;i<128;i=i+0.1)
{
aa[ii] = sin(2*3.14*i/128*f1); // генерация первой гармоники
bb[ii] = sin(2*3.14*i/128*f2); // генерация второй гармоники
SS[ii] = aa[ii]+bb[ii]; // генерация суммы двух колебаний
Form1->Series1->AddXY(i,aa[ii]); // отображение первой синусоиды
Form1->Series2->AddXY(i,bb[ii]); // отображение второй синусоиды
Form1->Series3->AddXY(i,SS[ii]); // отражение суммарного сигнала
ii+=1;
}
В приведенном примере осуществляется построение синусоиды частотой f1 и f2 из 1280 точек с шагом в 1/1280 и суммарный сигнал.
4. Для построения спектра, необходимо умножать каждую точку исходного сигнала на каждую точку синусоиды с частотой от 1 до 100Гц и накапливать сумму этих произведений. Иными словами, построение спектра с помощью ДПФ – это умножение исходного сигнала на синусоиды частотами 1,2,3…100Гц (или более, если необходимо) и фиксирование (откладывание на графике спектра) значения суммы произведений. В случае если исходный сигнал совпадет с искомой синусоидой, то сумма произведений окажется значительной и на графике появится ярко выраженный пик, что покажет наличие синусоиды искомой частоты.
Построение спектра реализуется с помощью формулы:
S = S + SS[ii]*sin(2*3.14*j*i/1280), где j – перебираемая частота синусоиды (от 1 до 100), SS[ii] – точка исходного сигнала, i/1280 – временной чаг (дискретизация), S – сумма в накопителе, откладываемая на графике спектра попарно с j. S необходимо брать по модулю. Перебираем все значения i и производим умножение. Затем увеличиваем j на единицу и повторяем цикл нахождения суммы произведений пока все 100 синусоид не будут умножены.
5. Создать вторую вкладку на форме для загрузки файла и построения спектра. Установить необходимые компоненты как указано на рис.:
6. Поместить выданный преподавателем файл .txt с сигналом в папку с проектом и загрузить сигнал в компонент Memo с помощью следующей строки кода:
Memo2->Lines->LoadFromFile("название.txt");
Для обращения к данным из компоненты Memo2 и построения графика сигнала следует использовать код (в файле 1280 значений):
for (int i = 0; i < Memo2->Lines->Count; i++)
LineSeries1->AddXY(i,StrToFloat(Memo2->Lines->Strings[i]));
Построить спектр сигнала, обращаясь к элементам компоненты Memo2, как указано в п.4.
Отчет должен содержать:
цель работы;
скриншот с сигналами S1,S2 и S3=S2+S1 с выбранными вами частотами (от 0 до 100Гц) и описанием к изображению;
скриншот с разложением сигнала S3 в спектр с тектовым описанием к нему;
скриншот с графиком сигнала, выданного преподавателем (по вариантам) и описанием к нему;
скриншот с разложением выданного сигнала в спектр и описанием графика;
исходный код программы;
выводы о зафиксированных гармониках в сигнале.
Лабораторная работа 5
Генератор гармонического сигнала с наложением шума. Накопление сигнала
Цель работы
Разработка программного генератора гармонического сигнала заданной частоты с наложением помехи и восстановлением сигнала с помощью импульсного накопления.
Краткие сведения из теории
Метод накопления с усреднением позволяет выделить сигнал из шума, теоретически, возможно обнаружить сколь угодно слабый сигнал с помощью данного метода
Введем обозначения:
ξ – помеха;
Sig – сигнал;
Пусть, необходимо выделить сигнал Sig на фоне помехи ξ. Помеха накладывается на импульс и в каждой точке она различна, в отличие от сигнала, поэтому можно записать:
(1)
- сумма периодов следования импульсов с помехой, накладываемой на него. Запись (1) можно представить в виде:
,
(2)
где n – количество сигналов для суммирования
Отношение сигнал/шум можно записать в виде:
(3)
Знаменателем выражения (3) является среднее значение помехи, а так как оно флуктуирует около нуля (то в положительную область, то в отрицательную), то с ростом n значение математического ожидания помехи будет стремиться к нулю и полезный сигнал начнет выделяться из шума.
Для реализации накопления сигнала необходимо знать, в какие моменты появляется периодичный сигнал (импульс), который требуется выделить из шума. Затем, временные промежутки, соответствующие следованию импульсов суммируются и делятся на количество импульсов (определяется среднее арифметическое каждого из значений).
Отношение сигнал/шум
в данном случае пропорционально значению
,
поскольку соотношение сигнал/шум можно
представить в виде:
,
где
-
среднеквадратичное отклонение. Т.е. с
ростом числа накопленных импульсов,
соотношение сигнал/шум будет расти в
,
где n
– число накопленных импульсов.
Сравнив график накопленных восьми импульсов и сводный график наложения этих импульсов, можно с уверенностью сказать, что теория накопления работает. На рисунке 1 изображен уровень шума с накоплением и уровень шума с наложением сигналов друг на друга (отображение максимальной амплитуды из восьми импульсов и шума).
Рисунок 1. Сравнение уровня шума без накопления и с применением метода накопления
Применив суммирование и усреднение восьми импульсов, нам удалось снизить максимальное значение амплитуды шума с 1000 до 300 единиц (значения амплитуды 16-битного файла находятся в интервале [-32767;32767]).
Сводная таблица значений среднеквадратичной амплитуды сигнала, и среднеквадратичного отклонения шума, а также отношения сигнал/шум
N |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
Ас |
1541 |
1426 |
1398 |
1294 |
1268 |
1067 |
1100 |
1106 |
σш |
304 |
225 |
181 |
155 |
136 |
121 |
110 |
104 |
Сигнал/шум, дБ |
14,09 |
16,03 |
17,7 |
18,44 |
19,4 |
18,9 |
20 |
20,5 |
График 1. Применение метода накопления сигнала
Применение метода накопления сигнала позволило увеличить соотношение сигнал/шум с 14.09дБ до 20.5дБ при накоплении восьми импульсов. Значение параметра сигнал/шум в точке 6 меньше, чем в точке 5 ввиду смещения фазы и колебания амплитуд импульсов (график 1).
График 2. Падение значения среднеквадратичного отклонения шума
На графике 2 видим падение амплитуды шума с каждым последующим суммированием.
Задание
Изучить теоретическую часть;
Запрограммировать генерацию гармонического сигнала (частота – по выбору студента);
Запрограммировать генерацию шума (использовать равномерный закон распределения);
Получить сигнал, равный сумме полученного гармонического сигнала и шума (имитация передачи сигнала по каналу связи);
Реализовать алгоритм накопления сигнала, описанный в теоретической части и графически показать, что происходит восстановление сигнала с ростом числа накопленных импульсов, меняя их число от 1 до 20 и отражая графики в отчете (можно сделать число импульсов следующим: 1, 3, 5, 10, 20 – 5 графиков).
Пояснения к выполнению работы
Создадим новый проект
Помещаем необходимые элементы на форму, как указано в примере:
В обработчике события нажатия кнопки необходимо прописать генерацию синусоиды, помехи, синусоиды+помехи и результат накопления сигнала
Для наложения помехи следует использовать равномерный закон распределения для генерации чисел от 0 до 1 (возможен и другой диапазон). Пример кода для создания помехи встроенными средствами языка С++:
for (int i=0; i < 10000; i++) // генерируем 10000 чисел
{
ABC=(float)random(10000)/10000*md; // ABC – сл. Величина; md – модификатор амплитуды (может быть равен 1)
buff[i]=ABC; // заполняем массив данных случайными величинами
Series7->AddXY(i,ABC); // выводим шум на график
}
Для создания гармонического сигнала можно генерировать синусоиду выбранной вами частоты и обнулить отрицательную область. Мы получим точку начала импульса – 0, его завершение – 128. Точка начала второго импульса – 384 (со смещением 256), точка его завершения – 512 и т.д. до 20 импульсов (до 5120). Пример на частоте 20Гц:
for (float i=0;i<512;i=i+0.1) // генерация 5120 точек синусоиды
{
aaa[j] = sin(2*3.14*i/512*20)*A; // сразу заполняем массив данными, A – модификатор амплитуды, можно выбрать равным 1
if (aaa[j]<0) // обнуляем отрицательную область
aaa[j]=0;
Series8->AddXY(j,aaa[j]); // выводим сигнал
j+=1;
}
Получим нечто подобное (20 импульсов – 20Гц):
Для понимания, отобразим интервалы, в которых следует импульс (0-128, 256-384, 512-640 и т.д.):
Осуществляем наложение помехи на сигнал:
for (int i = 0; i < 5120; i++)
aaa[i]+=buff[i];
Отображаем сигнал+шум:
for (float i=0;i<512;i=i+0.1)
{
LineSeries5->AddXY(j,aaa[j]);
j+=1;
}
Накопление сигнала подразумевает суммирование каждого отсчета каждого импульса и деление суммы на количество импульсов. Отношение суммы к количеству импульсов можно заменить отношением каждого члена суммы к количеству импульсов (a+b)/n=a/n+b/n и сразу разделить каждый отсчет на требуемое количество импульсов (столько, сколько будем накапливать, в нашем случае от 1 до 20)
for (int i = 0; i < 5120; i++) {
aaa[i]=aaa[i]/NN; // NN – число накапливаемых импульсов
}
Суммируем i-й отсчет всех интервалов (количество импульсов):
for (int j=0; j < 128; j++) // длина импульса у нас – 128 отсчетов
{
for (int i=k; i < 256*NN; i+=256) // пробегаем каждый отсчет в каждом импульсе
S=S+aaa[i]; // находим сумму отсчетов
LineSeries4->AddXY(j,S); // отображаем накопленный импульс
S=0;
k++;
}
10. Результат работы программы должен выглядеть так, чтобы было приближение накопленного импульса по форме к исходному с ростом числа накоплений:
N=1
N=3
N=5
N=10
N=20
Отчет должен содержать:
цель работы;
скриншоты с 4 графиками для N=1,3,5,10,20 (5 изображений со сравнением исходного импульса и восстановленного из шума)
исходный код программы;
выводы о работе алгоритма накопления для выделения сигнала из шума
Лабораторная работа 6
Генератор гармонического сигнала с наложением шума. Фильтрация с использованием скользящего среднего и оценка эффективности фильтра корреляционным анализом.
Цель работы
Разработка программного генератора гармонического сигнала заданной частоты с наложением помехи и восстановлением сигнала с помощью применения фильтра скользящего среднего с изменяемым размером окна
Краткие сведения из теории
Скользящая средняя, скользящее среднее (англ. moving average, англ. MA) — общее название для семейства функций, значения которых в каждой точке определения равны среднему значению исходной функции за предыдущий период. Скользящие средние обычно используются с данными временных рядов для сглаживания краткосрочных колебаний и выделения основных тенденций или циклов. Математически скользящее среднее является одним из видов свёртки, и поэтому его можно рассматривать как фильтр нижних частот, используемых в обработке сигналов.
Скользящие средние используются:
- В статистике и экономике для сглаживания числовых рядов (в первую очередь временных). Например, для оценки ВВП, показателей занятости или других макроэкономических индикаторов.
- В технике, в качестве фильтра
- В техническом анализе, в качестве самостоятельного технического индикатора либо в составе других инструментов
Так как при расчёте скользящего среднего значение функции вычисляется каждый раз заново, при этом учитывается конечное значимое множество предыдущих значений скользящее среднее «перемещается» (движется), как бы «скользя» по временному ряду.
Простое скользящее среднее, или арифметическое скользящее среднее (англ. simple moving average, англ. SMA) численно равно среднему арифметическому значений исходной функции за установленный период и вычисляется по формуле:
(1)
Где
— значение простого скользящего
среднего в точке
,
— предыдущее значение простого
скользящего среднего,
— значение исходной функции в точке
(в случае временного ряда, самое «раннее»
значение исходной функции, используемое
для вычисления предыдущей скользящей
средней),
— значение исследуемой функции точке
(в случае временного ряда, текущее —
последнее значение).
Например, простое скользящее среднее для временного ряда с количеством периодов равным 10 вычисляется как:
(2)
В данной работе реализуется применение простого скользящего среднего к двум сгенерированным сигналам одинаковой частоты (аналогичным образом, как в лаб.№5).
Для оценки эффективности алгоритма фильтрации предлагается использовать коэффициент корреляции Пирсона, определяющийся по формуле:
(3)
, где X
– текущее значение функции первого
сигнала,
- среднее значение функции первого
сигнала, Y
– текущее значение функции первого
сигнала,
- среднее значение
функции второго сигнала
Задание
Изучить теоретическую часть;
Запрограммировать генерацию гармонического сигнала (частота – по выбору студента);
Запрограммировать генерацию шума (использовать равномерный закон распределения);
Сгенерировать второй гармонический сигнал той же частоты;
Наложить шум, сгенерированный по тому же закону распределения (как для первого сигнала) на второй сигнал;
Применить скользящее среднее с окном в 1-100 точек (с шагом в одно значение) для двух сгенерированных сигналов с шумом;
При каждом фиксированном значении окна скользящего среднего провести оценку сходства двух сигналов нахождением коэффициента корреляции;
Построить графики: 2 исходных сигнала с шумом, 2 отфильтрованных сигнала, график зависимости коэффициента корреляции от размера окна скользящего среднего (100 точек);
Убедиться в повышении значения коэффициента корреляции с увеличением размера окна фильтра.
Пояснения к выполнению работы
Добавляем новую вкладку в программе, написанной в рамках лабораторной работы №5.
Помещаем необходимые элементы на форму, как указано в примере:
В обработчике события нажатия кнопки необходимо прописать генерацию синусоиды, помехи, синусоиды+помехи и результат накопления сигнала.
Для наложения помехи следует использовать равномерный закон распределения для генерации чисел от 0 до 1 (возможен и другой диапазон). Пример кода для создания помехи встроенными средствами языка С++:
for (int i=0; i < 10000; i++) // генерируем 10000 чисел
{
ABC=(float)random(10000)/10000*md; // ABC – сл. Величина; md – модификатор амплитуды (может быть равен 1)
buff[i]=ABC; // заполняем массив данных случайными величинами
Series7->AddXY(i,ABC); // выводим шум на график
}
Для создания гармонического сигнала можно генерировать синусоиду выбранной вами частоты и обнулить отрицательную область. Мы получим точку начала импульса – 0, его завершение – 128. Точка начала второго импульса – 384 (со смещением 256), точка его завершения – 512 и т.д. до 20 импульсов (до 5120). Пример на частоте 20Гц:
for (float i=0;i<512;i=i+0.1) // генерация 5120 точек синусоиды
{
aaa[j] = sin(2*3.14*i/512*20)*A; // сразу заполняем массив данными, A – модификатор амплитуды, можно выбрать равным 1
if (aaa[j]<0) // обнуляем отрицательную область
aaa[j]=0;
Series8->AddXY(j,aaa[j]); // выводим сигнал
j+=1;
}
Получим нечто подобное (20 импульсов – 20Гц):
Осуществляем наложение помехи на сигнал:
for (int i = 0; i < 5120; i++)
aaa[i]+=buff[i];
Отображаем сигнал+шум:
for (float i=0;i<512;i=i+0.1)
{
LineSeries5->AddXY(j,aaa[j]);
j+=1;
}
Повторяем пункты 3-6, чтобы сгенерировать второй сигнал, идентичный первому с наложением новой помехи;
Для осуществления фильтрации сигнала скользящим средним можно воспользоваться следующим кодом:
for (int i = 0; i < 5000; i++) // проходим весь сигнал из 5000 точек
{
for (int j = k; j < k+avg_size; j++) // j – текущее значение ползунка
avg_sum+=aaa[j]; // находим сумму значений сигнала с шумом в интервале k+avg_size
k=k+1; // после того, как нашли сумму значений в интервале, сдвигаем ползунок на единицу
avg=avg_sum/avg_size; // делим найденную сумму на avg_size – находим среднее арифметическое в интервале k+avg_size
aaa_avg[i]=avg;
Series10->AddXY(i,avg); // отображаем отфильтрованный сигнал
avg_sum=0; // обнуляем сумму для заполнения буфера для следующего интервала
}
Повторяем пункт 8 для второго сигнала;
Находим коэффициент корреляции по формуле (3), строим график его зависимости от текущего значения окна фильтра и отображаем коэффициент в Memo;
Увеличиваем размер окна скользящего среднего (avg_size) на единицу и повторяем пункты 8-10 для нахождения коэффициента корреляции для увеличенного на единицу размера окна;
Фильтруем, находим коэффициент корреляции вплоть до размера окна фильтра, равного 100.
Пример работы программы:
