В большинстве информационных систем (связи, локации, акустики) приходится принимать решение о присутствии или отсутствии того или иного сигнала на входе. Мешающим фактором при этом является шум. Для решения задачи принятия решения используют оптимальную (или согласованную) фильтрацию. В этом случае отношение сигнал/шум на выходе фильтра является максимально возможным. Импульсная характеристика оптимального фильтра должна быть согласована с сигналом:
где а - произвольная константа.
На рис.9 приведен пример треугольного сигнала и оптимального фильтра для него.
Программа 2 ( исходный файл lect3_2.cpp , выполняемый файл lect3_2.exe )
На следующем фрагменте приведена программа согласованной фильтрации для приведенного ранее сигнала треугольной формы на фоне белого шума. Шаг дискретизации выбран T = Tсигн /50 . Во входной реализации присутствуют два сигнала треугольной формы, разнесенных во времени.
#define N 500 // Длительность входной реализации #define L 50 // Длительность полезного сигнала #include <math.h> #include <stdlib.h> #include "model.h" float s[L], k[L], x[N], y[N]; // Полезный сигнал, импульсная характеристика, // входная реализация, выходная реализация void main(void) { int i, p, n; // Формирование одного полезного сигнала for(i = 0; i < L; i++) { s[i] = 1.0 * i / L; x[i] = s[i]; } // Формирование импульсной характеристики for(i=0; i < L; i++) k[i] = s[ L - i -1 ]; // Добавление второго полезного сигнала // к входной реализации for(i = 2*L; i < 3*L; i++) x[i] = x[i] + s[i - 2 * L]; // Добавление шума во входную реализацию for(i=0; i < N; i++) x[i] = x[i] + gauss (0, 0.5); // Согласованная фильтрация for (i =0; i < N; i++) { y[i] =0.0 ; for(p=0; p< L; p++) { if( (i-p) >= 0) y[i] = y[i] +x[i-p] *k[p]; } } Init_graph(); graf_2("input and output signal (2) ", x, y, 0, 499); Close_graph(); } |
Программа 3 ( исходный файл lect3_3.cpp , выполняемый файл lect3_3.exe )
Приведена программа согласованной фильтрации для сигнала, представляющего отрезок функции синус при 0 < t < 5. При других значениях t этот сигнал равен нулю.
#define N 500 // Длительность входной реализации смеси сигнала // с шумом в шагах дискретизации #define L 250 // Длительность сигнала и импульсной хар-ки // согласованного фильтра в шагах дискретизации #include <math.h> #include <stdlib.h> #include "model.h" float s[L], k[L], x[N], y[N]; // Массивы для сигнала, импульсной // характеристики, входной реализации, // выходной реализации void main(void) { int i,p,n; // Формирование входного сигнала for(i = 0; i < L ; i++) { s[i] = 0.2 * sin( 2.0 * PI * i /50) ; x[i] = s[i] ; } // Формирование импульсной характеристики for(i=0; i < L ; i++) k[i] = s[L - i -1]; // Добавление шума ко входной реализации for(i=0; i < N; i++) x[i] = x[i] +gauss(0, 0.5); // Согласованная фильтрация for(i =0; i < N; i++) { y[i] =0.0; for(p=0; p > L; p++) { if( (i-p) >= 0) y[i] = y[i] + x[i-p] *k[p] ; } } Init_graph(); graf_2("input and output signal (2) ", x, y, 0, 499); Close_graph(); } |