Оконная функция |
Предыдущая Содержание Следующая |
![]() |
Вычисление спектра производится на коротком отрезке времени. Спектральный анализ в теории предназначен для анализа непрерывных периодических сигналов. При обрезании сигнала в спектре появляются не существовавшие в сигнале высокочастотные составляющие. Для борьбы с их появлением прибегают к использованию оконных функций, изменяющих оригинальный сигнал в каждом анализируемом отрезке (окне).
Использование оконной функции заключается в предварительном умножении отсчётов сигнала на неё и только затем производится расчёт спектра.
Некоторые типы оконных функций имеют нулевые коэффициенты на краях, что приводит к потере крайних значений выборки. Для таких функций при расчёте используется небольшой сдвиг. Реализация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; }
|
Предыдущая Содержание Следующая |