МОДЕЛИРОВАНИЕ ЛИНЕЙНЫХ СИСТЕМ
Методические указания к лабораторной работе №3 по дисциплине
"Моделирование информационных процессов и систем"

[Титульная страница | Оглавление | Предыдущая страница | Следующая страница ]


5. ЗАДАЧА ОБНАРУЖЕНИЯ СИГНАЛА.

Далее рассмотрена программа, которая моделирует процесс обнаружения сигнала на фоне дискретного белого гауссовского шума. Сигнал представляет зависимость при . Шаг дискретизации выберем 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; 
}

[Титульная страница | Оглавление | Предыдущая страница | Следующая страница ]