Otchet_lab3_VSx

advertisement
Нижегородский государственный технический университет
им. Р. Е. Алексеева
Кафедра «Вычислительные системы и технологии»
Лабораторная работа №3
по дисциплине: Вычислительные системы
«Настройка дискретного прогнозирующего фильтра
по алгоритму RLS»
Вариант 1
Выполнил:
магистрант группы М14-ИВТ-2
Блажнов И.Д.
Проверил:
Саладаев Е.Н.
г. Нижний Новгород
1
Задание
(Вариант №1)
Количество гармоник в прогнозируемом процессе (наблюдаемом сигнале) m = 5.
Частота первой гармоники f1 = 5 кГц.
Амплитудный спектр наблюдаемого сигнала Um(i), i=1,2,…….m.
i
Um(i)





1
1
2
0,8
3
0,5
4
0,3
5
0,1
Среднеквадратичное значение помехи: SQE = 0,01
Частота дискретизации: Fd = 500 кГц
Период дискретизации: Td = 1/Fd
Интервал прогнозирования: T = 1
Длительность интервала настройки: Km = 1000
Выполнение работы:
1.Формирование прогнозируемого процесса.
При формировании прогнозируемого процесса модель информативного сигнала
представим в виде:
m
S (t )   A(i ) * Cos[2f i t  ph(i )]
i 1
где: A(i) – амплитуда i-ой гармоники, ph(i) – фаза i-ой гармоники.
Ниже представлен код вычисления амплитуды и фазы каждой из 5ти гармоник случайным
образом
Ниже фрагмент листинга на языке C#, в котором реализуются данные действия:
Random RanD = new Random();
int i = 0;
for (i = 0; i < 5; i++)
{
amplitude[i] = Um[i] * RanD.Next(0, 100) / 100;
phase[i] = Math.PI * RanD.Next(0, 100) / 100;
f[i] = Convert.ToInt32(UDF1.Value) * (i + 1);
dataView1.Rows.Add(i+1, A[i], phase[i], f[i]);
}
Далее вычисляем массив отсчетов информативного сигнала S(t) по формуле 1
Массив отсчетов наблюдаемого процесса вычисляется как X(k) = S(k) + E(k), где E(k)
– случайная величина с математическим ожиданием равным нулю и дисперсией DE =
SQE^2.
Следующий фрагмент листинга демонстрирует реализацию процесса вычисления
массивов S(k), E(k) и X(k):
for (int k = 0; k < M; k++)
{
S[k] = 0;
2
for (int i = 0; i < 5; i++)
{
S[k] += (double)(amplitude[i] * Math.Cos(2 *
Math.PI * f[i] * k * Td + phase[i]));
}
E[k] = Math.Pow(-1, k) * SQE * SQE;
X[k] = S[k] + E[k];
dataView2.Rows.Add(k, k * Td, S[k], E[k], X[k]);
}
Отобразим на графике сформированные сигналы:
Так как SQE^2 (среднеквадратичная помеха) мала, то зашумленный сигнал мало
отличается от истинного.
Обработка сигнала.
Вычисляются дисперсия информативного сигнала Ds, а также дисперсия Dx,
среднеквадратичное значение SQX  Dx сигнала X(k). Определяется отношение
сигнал/шум SN=Ds/DE в наблюдаемом процессе Х.
Реализуем прогнозирующий фильтр в виде цифрового фильтра (ЦФ)
N
Y (k )  W ( j ) * X (k  j )
j 0
(1)
где W(j) – коэффициенты ЦФ, k – номер отсчета дискретизированных сигналов.

W
W (0)
W (1)
(2)
W (N )
Введем вектор сигнала
3
X (k )
X (k  1)

U (k )  X (k  j )
(3)
X (k  N )
Выходной сигнал фильтра
N
Y (k )  W ( j ) * X (k  j ) .
j 0
где W(j) – коэффициенты фильтра АКФ, N+1 – размерность прогнозирующего
фильтра, к – номер отсчета сигнала. В матричной форме можно записать
T

Y (k )  U (k ) * W
(4)
Считаем, что M{(k)}=0.
Желаемый сигнал d(k) =S(k+T)=M(S(k+T) + (k+T)}=M{X(k+T},
где Т – время прогнозирования.
Ошибка прогнозирования
T

e( k )  d ( k )  Y ( k )  S ( k  T )  U ( k ) * W  X ( k  T )  Y ( k )
M {e(k )}  M {S (k  T )  Y (k )}  M { X (k  T )  Y (k )}
(5)
Введем матрицу U наборов отсчетов помехи в памяти АКФ .




U  U (0), U (1), U (2),..........U ( Km  1)
Введем матрицу P , являющейся оценкой обратной корреляционной матрицы помехи
R.
P  R 1

Ky
Введем вектор-столбец
размерности N+1.
Исходный вид матрицы P  100 * I , где I – единичная матроца.
1..0..0..0..0..0
0..1..0..0..0..0
I
0..0..0..0..0..1
2. Алгоритм настройки прогнозирующего фильтра рекурсивным
методом наименьших квадратов RLS
Вводим массивы зашумленного сигнала SE и помехи Х
4

W 0
Циклически повторяем
P =100*I
k=N to Km Step 1
В теле цикла:
1) Вычисляем
N
Y (k )  W ( j ) * X (k  j )
j 0
e(k) = Х(k) – Y(k-T)
2) Рассчитываем вектор-столбец размерности

Ky 

P * U (k )

Ky
(N+1)


1  U T ( k ) * P * U (k )
Числитель
Матрица P размерности (N+1,N+1) умножается на вектор
(N+1), получаем вектор

С
N

U (k ) размерности
размерности (N+1).
С (i)   P(i, j ) * X (k  j )
i  0, N
j 0
Знаменатель
Вектор-строку U(k) умножаем на матрицу Р, получаем вектор-строку Z.


U T (k ) * P  Z  {Z (0), Z (1), Z (2),.......Z ( N )}
N
Z ( j )   X (k  i ) * P (i, j )
i 0
N
 
1  Z * U (k )   Z ( j ) * X (k  j )  Sum
j 0
Искомый вектор
Ky (i ) 
C (i )
Sum
i  0, N
3) Обновление оценки обратной корреляционной матрицы Р


P  P  Ky * U T ( k ) * P
Умножаем вектор-столбец Ky на вектор-строку U(k), получаем матрицу dP
размерности (N+1)x(N+1).


Ky * U T (k )  dP
dP(i, j )  Ky(i ) * X (k  j )
P = P - dP*P
4) Обновление коэффициентов АКФ
5



W  W  Ky * e ( k )
W (i )  W (i )  Ky(i ) * E (k ) i  0, N
Следующий код демонстрирует то, что было описано выше в данном разделе:
for (int i = 0; i <= N; i++) {
W[i] = 0;
for (int j = 0; j <= N; j++) {
if (i == j) {P[i, j] = 100;}
else { P[i, j] = 0; }
}
}
W1[N - 1] = W[0]; W2[N - 1] = W[1];
W3[N - 1] = W[2]; W4[N - 1] = W[3];
W5[N - 1] = W[4];
for (int n = N; n < Km; n++) {
for (int j = 0; j <= N; j++)
{
Y[n] += W[j] * X[n - j];
}
E = X[n] - Y[n];
double MyPerSum = 0;
double dP = 0;
double[] C = new double[N + 1];
double[] Z = new double[N + 1];
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= N; j++) {
C[i] = C[i] +P[i, j] * X[n - j];
Z[i] = Z[i] + X[n - j] * P[j, i];
}
MyPerSum = MyPerSum +Z[i] * X[n - i];
}
for (int i = 0; i <= N; i++) {
Ky[i] = C[i] / (MyPerSum + lam);
dP += Ky[i] * X[n - i];
}
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= N; j++)
{
P[i, j] = (P[i, j] - dP * P[i, j]) / lam;
}
W[i] = W[i] +Ky[i] * E;
}
W1[n] = W[0];
W2[n] = W[1];
W3[n] = W[2];
W4[n] = W[3];
W5[n] = W[4];
}
6
На выходе мы получили график для 2000 квантов:
Как мы видим, картина стала устойчивой и особо не меняется.
Настраиваемые значения вектора параметров фильтра W представлены на графике.
График:
Проанализировав график, видим, что устойчивость начинается с середины графика.
Графики ошибки прогнозирования, которая вычисляется по формуле:
dY  Y k   S k 
Следующий код демонстрирует расчет ошибки:
for (int i = 0; i < Km; i++) {
if (i <= N) { d[i] = 0; }
else { d[i] = Y[i] - S[i]; }
}
7
Проанализировав графики, можно сказать, что по мере настройки фильтра, значения
ошибки прогнозирования уменьшаются, и на последних отсчётах настройки ошибка
сводится к минимуму и лежит в диапазоне от –0,01 до 0,01.
После того как рассчитана ошибка прогнозирования, определим значение текущей оценки
среднеквадратичной погрешности на интервале Kd, которое рассчитывается по
следующей формуле:
1 Kd 1
dY k  i 2

Kd i 0
Следующий код демонстрирует расчёт SQdYKd :
for (int k = Kd; k < Km; k++) {
p = 0;
for (int i = 0; i < Kd; i++) {
p = p+ d[k - i] * d[k - i];
}
SQd_YK_d[k] = Math.Sqrt(tmp / Kd);
}
Полученный график:
SQdYKd k  
Оценив график, можно сказать, что среднеквадратичная ошибка сводится к
значению, равному примерно 0,001.
8
Download