Далее рассмотрена программа, которая моделирует процесс обнаружения сигнала на фоне дискретного белого гауссовского шума. Сигнал представляет зависимость при . Шаг дискретизации выберем 0.02 с.
Программа 4 ( исходный файл lect3_5.cpp , выполняемый файл lect3_5.exe )
#define N 50 //Длительность сигнала в шагах дискретизации #define M 20 // Размер массивов для подсчета вероятности // ложной тревоги #define MM 15 // Размер массива для подсчета // вероятности правильного обнаружения #include <math.h> #include <stdio.h> #include <stdlib.h> #include "model.h" float sogl(void); //Описание шаблона функции согласованной фильтрации float s[N], k[N], x[N]; // Массивы сигнала, импульсной характеристикики //и их смеси float porog; // Значение порога обнаружения для вычисления // вероятности правильного обнаружения float sym; float mass_porog[M]; // Массив порогов float veroa [ M ]; // Массив для вероятностей ложной тревоги float d_prav[ MM]; // Массив для вероятностей правильного обнаружения void main(void) { int i, j, n; long nn; float disp; // Оценка дисперсии шума на выходе системы float z, A; // Формирование полезного сигнала for(i=0; i < N; i++) s[i] = cos( 2.*PI*i/N ); // Формирование импульсной характеристики // согласованного фильтра for(i=0; i < N; i++) k[i] = s[N-1- i]; // Оценка дисперсии шума на выходе системы disp = 0; for (i = 0; i < 200; i++) // Цикл по 200 экспериментам { for(j=0; j < N; j++) x[j] = gauss(0,1); z = sogl(); disp = disp + z * z; } disp = disp / 200.; // Формирование массива порогов for (i = 0; i < M; i++) mass_porog[i] = sqrt(disp) * (1.0 + 0.1*i); // Вычисление зависимости вероятности ложной //тревоги от порога обнаружения for(nn = 0; nn < 30000L; nn++) { for (j=0; j< N; j++) x[j] = gauss(0,1); z = sogl(); for(j=0; j < M ; j++) { if ( z >= mass_porog[j] ) veroa[j]++; } } for(j = 0; j < M; j++) veroa[j] = veroa[j] / 30000.; // Вывод порогов обнаружения и соответствующих им // вероятностей ложных тревог for (i=0; i < M; i++) printf("\n порог обнаружения =%f вероятность ложной тревоги = %f ", mass_porog[i] , veroa[i] ); // Ввод порога для вычисления зависимости вероятности // правильного обнаружения от амплитуды сигнала printf ( "\n Ввод порога обнаружения"); scanf("%f",&porog); // Вычисление зависимости вероятности // правильного обнаружения от амплитуды сигнала for(n = 0; n < MM; n++) { A = 0.2 + 0.05*n; // Амплтитуда входного сигнала for (j = 0; j < 200; j++) // Цикл по 200 экспериментам { for (i=0; i< N; i++) x[i] = gauss(0,1) + A * s[i]; z=sogl(); if(z >= porog) d_prav[n]=d_prav[n] + 1./200.; } printf("\n Амплитуда = %f Вероятность правильного обнаружения %f", A,d_prav[n]); } } float sogl(void) { int i; float sym; sym = 0; for (i = 0; i < N; i++) sym = sym +x[i]*k[N-1-i]; return sym; } |