Оконная функция

Предыдущая  Содержание  Следующая  V*D*V

Вычисление спектра производится на коротком отрезке времени. Спектральный анализ в теории предназначен для анализа непрерывных периодических сигналов. При обрезании сигнала в спектре появляются не существовавшие в сигнале высокочастотные составляющие. Для борьбы с их появлением прибегают к использованию оконных функций, изменяющих оригинальный сигнал в каждом анализируемом отрезке (окне).

 

Использование оконной функции заключается в предварительном умножении отсчётов сигнала на неё и только затем производится расчёт спектра.

 

Некоторые типы оконных функций имеют нулевые коэффициенты на краях, что приводит к потере крайних значений выборки.

Для таких функций при расчёте используется небольшой сдвиг.

Реализация

 public static final byte RECTANGULAR = 0;// Rectangular window function

 public static final byte BARTLETT = 1;// Bartlett (triangular) window

 public static final byte HANNING = 2;// Hanning window

 public static final byte HAMMING = 3;// Hamming window

 public static final byte BLACKMAN = 4;// Blackman window

 public static final byte BLACKMAN_HARRIS = 5;// Blackman-Harris window, боковые лепестки на уровне -92дБ

 public static final byte BLACKMAN_NUTTAL = 6;// Blackman-Nuttal window

 public static final byte NUTTAL = 7;// Nuttal window

 //

/**

* получить коэффициент заданного типа окна

* @param i - индекс

* @param n - размер окна

* @param type - тип окна

* @return коэффициент

*/

 static double getWindow(int i, int n, byte window) {

         if( window == BARTLETT ) {// устраняем нулевые значения

                 double a = i - (n - 1) / 2.0;

                 if( a < 0 ) a = -a;

                 return 2.0 / n * (n / 2.0 - a);

         }

         else if( window == HANNING )// устраняем нулевые значения

                 return 0.5 - 0.5 * Math.cos(Math.PI / n * (1.0 + 2.0 * i));

         if( window == BLACKMAN ) {// устраняем нулевые значения

                 double a = Math.PI / n * (1.0 + 2.0 * i);

                 return 0.5 * (1.0 - 0.16 - Math.cos(a) + 0.16 * Math.cos(2.0 * a));

         }

         else

         {

                 double a = 2.0 * Math.PI * i / (n - 1);

                 if( window == HAMMING )

                         return 0.54 - 0.46 * Math.cos( a );

                 else if( window == BLACKMAN_HARRIS )

                         return 0.35875 - 0.48829 * Math.cos(a) + 0.14128 * Math.cos(2.0 * a) - 0.01168 * Math.cos(3.0 * a);

                 else if( window == BLACKMAN_NUTTAL )

                         return 0.35819 - 0.4891775 * Math.cos(a) + 0.1365995 * Math.cos(2.0 * a) - 0.0106411 * Math.cos(3.0 * a);

                 else if( window == NUTTAL )

                         return 0.355768 - 0.487396 * Math.cos(a) + 0.144232 * Math.cos(2.0 * a) - 0.012604 * Math.cos(3.0 * a);

         }

         //if( type == RECTANGULAR )

         return 1.0;

 }

 

Предыдущая  Содержание  Следующая