Нижегородский государственный технический университет им. Р. Е. Алексеева Кафедра «Вычислительные системы и технологии» Лабораторная работа №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[2f 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