libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
Функции оконного взвешивания

Функции

int window (double *w, int n, int win_type, double param)
 Расчет функции оконного взвешивания Подробнее...
 

Подробное описание

Функции

◆ window()

int window ( double *  w,
int  n,
int  win_type,
double  param 
)

Расчет функции оконного взвешивания


Функция рассчитывает периодическую или симметричную оконную функцию в соответствии с параметром win_type.
Периодическая оконная функция используется для спектрального анализа, а симметричная оконная функция может быть использована для синтеза КИХ-фильтров.

Аргументы
[in,out]wУказатель на вектор оконной функции.
Размер вектора [n x 1].
Память должна быть выделена.
Рассчитанная оконная функция будет помещена по данному адресу.

[in]nРазмер вектора w оконной функции.

[in]win_typeКомбинация флагов для задания типа оконной функции.
Для задания типа окна используется комбинация битовых масок DSPL_WIN_MASK | DSPL_WIN_SYM_MASK.
Маска DSPL_WIN_MASK задает тип оконной функции. Может принимать следующие значения:
-------------------------------------------------------------------------
Значение  DSPL_WIN_MASK      |  Описание
-----------------------------|-------------------------------------------
 DSPL_WIN_BARTLETT           | Непараметрическое окно Бартлетта
-----------------------------|-------------------------------------------
 DSPL_WIN_BARTLETT_HANN      | Непараметрическое окно Бартлетта-Ханна
-----------------------------|-------------------------------------------
 DSPL_WIN_BLACKMAN           | Непараметрическое окно Блэкмана 
-----------------------------|-------------------------------------------
 DSPL_WIN_BLACKMAN_HARRIS    | Непараметрическое окно Блэкмана-Харриса
-----------------------------|-------------------------------------------
 DSPL_WIN_BLACKMAN_NUTTALL   | Непараметрическое окно Блэкмана-Натталла
-----------------------------|-------------------------------------------
 DSPL_WIN_CHEBY              | Параметрическое окно Дольф-Чебышева. 
                             | Данное окно всегда является симметричным и
                             | игнорирует параметр  DSPL_WIN_SYM_MASK . 
                             | Параметр  param  задает уровень боковых 
                             | лепестков в дБ.
-----------------------------|-------------------------------------------
 DSPL_WIN_COS                | Непараметрическое косинус-окно
-----------------------------|-------------------------------------------
 DSPL_WIN_FLAT_TOP           | Непараметрическое окно с максимально 
                             | плоской вершиной
-----------------------------|-------------------------------------------
 DSPL_WIN_GAUSSIAN           | Параметрическое окно Гаусса
-----------------------------|-------------------------------------------
 DSPL_WIN_HAMMING            | Непараметрическое окно Хемминга
-----------------------------|-------------------------------------------
 DSPL_WIN_HANN               | Непараметрическое окно Ханна
-----------------------------|-------------------------------------------
 DSPL_WIN_KAISER             | Параметрическое окно Кайзера
-----------------------------|-------------------------------------------
 DSPL_WIN_LANCZOS            | Непараметрическое окно Ланкзоса
-----------------------------|-------------------------------------------
 DSPL_WIN_NUTTALL            | Непараметрическое окно Натталла
-----------------------------|-------------------------------------------
 DSPL_WIN_RECT               | Непараметрическое прямоугольное окно
-------------------------------------------------------------------------

Маска DSPL_WIN_SYM_MASK задает симметричное или периодическое окно:
-------------------------------------------------------------------------
Значение  DSPL_WIN_SYM_MASK  | Описание
-----------------------------|-------------------------------------------
 DSPL_WIN_SYMMETRIC          | Симметричное окно (по умолчанию)
 DSPL_WIN_PERIODIC           | Периодическое окно
-------------------------------------------------------------------------


[in]paramПараметр окна.
Данный параметр применяется только для параметрических оконных функций.
Для непараметрических окон игнорируется.

Возвращает

RES_OK если оконная функция рассчитана успешно.
В противном случае код ошибки.

Следующая программа производит расчет оконных функций длительности 64 отсчета, строит их спектральную плотность при использовании по оси частот индексы бинов дискретного преобразования Фурье.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "dspl.h"
#define N 64
#define K 1024
void win_norm(double* w, int n)
{
int k;
double s = 0.0;
for(k = 0; k < n; k++)
s+=w[k];
for(k = 0; k < n; k++)
w[k] /= s;
}
void window_plot(double* w, int n, int k, int argc, char* argv[],
double ymin, double ymax,
char* png_fn, char* time_fn, char* freq_fn, char* title)
{
void* hplot; /* GNUPLOT handles */
char str[128] = {0};
double* t = NULL;
double* W = NULL;
double* f = NULL;
double fs = (double)n;
fft_t pfft = {0};
t = (double*)malloc(n*sizeof(double));
W = (double*)malloc(k*sizeof(double));
f = (double*)malloc(k*sizeof(double));
linspace(0, n, n, DSPL_PERIODIC, t);
writetxt(t, w, n, time_fn);
win_norm(w, n);
fft_mag(w, k, &pfft, fs, DSPL_FLAG_LOGMAG | DSPL_FLAG_FFT_SHIFT, W, f);
writetxt(f, W, k, freq_fn);
/* plotting 3d surface by GNUPLOT */
/* Create window 0 */
gnuplot_create(argc, argv, 820, 360, png_fn, &hplot);
gnuplot_cmd(hplot, "set grid");
memset(str,0,128);
sprintf(str, "set title '%s'", title);
gnuplot_cmd(hplot, str);
gnuplot_cmd(hplot, "set multiplot layout 1,2 rowsfirst");
gnuplot_cmd(hplot, "set xlabel 'n'");
gnuplot_cmd(hplot, "set ylabel 'w(n)'");
gnuplot_cmd(hplot, "unset key");
gnuplot_cmd(hplot, "set xrange[0:63]");
memset(str,0,128);
sprintf(str, "set yrange[%f:%f]", ymin, ymax);
gnuplot_cmd(hplot, str);
memset(str,0,128);
sprintf(str, "plot '%s' w i lc 1,'%s' w p pt 7 ps 0.5 lc 1",
time_fn, time_fn);
gnuplot_cmd(hplot, str);
gnuplot_cmd(hplot, "set xrange[-20:20]");
gnuplot_cmd(hplot, "set yrange[-130:5]");
memset(str,0,128);
gnuplot_cmd(hplot, "set xlabel 'freq [DFT bins]'");
gnuplot_cmd(hplot, "set ylabel 'W(freq), dB'");
sprintf(str, "plot '%s' w l lc 2 ", freq_fn);
gnuplot_cmd(hplot, str);
gnuplot_close(hplot);
if(t)
free(t);
if(W)
free(W);
if(f)
free(f);
}
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
hdspl = dspl_load(); /* Load DSPL function */
double w[K] = {0};
/* Rectangular window */
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_RECT, 0.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_rect.png",
"dat/win_rect_time.txt",
"dat/win_rect_freq.txt",
"Rectangular window");
/* Bartlett window (triangular)*/
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_BARTLETT, 0.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_bartlett.png",
"dat/win_bartlett_time.txt",
"dat/win_bartlett_freq.txt",
"Bartlett window");
/* Flat top window */
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_FLAT_TOP, 0.0);
window_plot(w, N, K, argc, argv, -1.0, 5.0,
"img/win_flattop.png",
"dat/win_flattop_time.txt",
"dat/win_flattop_freq.txt",
"Flat top window");
/* Bartlett - Hann window*/
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_BARTLETT_HANN, 0.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_bartletthann.png",
"dat/win_bartletthann_time.txt",
"dat/win_bartletthann_freq.txt",
"Bartlett-Hann window");
/* Blackman window*/
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_BLACKMAN, 0.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_blackman.png",
"dat/win_blackman_time.txt",
"dat/win_blackman_freq.txt",
"Blackman window");
/* Blackman - Harris window*/
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_BLACKMAN_HARRIS, 0.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_blackmanharris.png",
"dat/win_blackmanharris_time.txt",
"dat/win_blackmanharris_freq.txt",
"Blackman-Harris window");
/* Blackman - Nuttall window*/
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_BLACKMAN_NUTTALL, 0.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_blackmannuttall.png",
"dat/win_blackmannuttall_time.txt",
"dat/win_blackmannuttall_freq.txt",
"Blackman-Nuttull window");
/* Dolph-Chebyshev window (sidelobes level is -50 dB)*/
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_CHEBY, 50.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_cheby50.png",
"dat/win_cheby50_time.txt",
"dat/win_cheby50_freq.txt",
"Dolph-Chebyshev window (Rs = 50dB)");
/* Dolph-Chebyshev window (sidelobes level is -80 dB)*/
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_CHEBY, 80.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_cheby80.png",
"dat/win_cheby80_time.txt",
"dat/win_cheby80_freq.txt",
"Dolph-Chebyshev window (Rs = 80dB)");
/* Dolph-Chebyshev window (sidelobes level is -120 dB)*/
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_CHEBY, 120.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_cheby120.png",
"dat/win_cheby120_time.txt",
"dat/win_cheby120_freq.txt",
"Dolph-Chebyshev window (Rs = 120dB)");
/* Gaussian window (sigma = 0.5)*/
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_GAUSSIAN, 0.5);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_gaussian0p5.png",
"dat/win_gaussian0p5_time.txt",
"dat/win_gaussian0p5_freq.txt",
"Gaussian window (sigma = 0.5)");
/* Gaussian window (sigma = 0.3)*/
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_GAUSSIAN, 0.3);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_gaussian0p3.png",
"dat/win_gaussian0p3_time.txt",
"dat/win_gaussian0p3_freq.txt",
"Gaussian window (sigma = 0.3)");
/* Hamming window*/
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_HAMMING, 0.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_hamming.png",
"dat/win_hamming_time.txt",
"dat/win_hamming_freq.txt",
"Hamming window");
/* Hann window*/
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_HANN, 0.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_hann.png",
"dat/win_hann_time.txt",
"dat/win_hann_freq.txt",
"Hann window");
/* Lanczos window */
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_LANCZOS, 0.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_lanczos.png",
"dat/win_lanczos_time.txt",
"dat/win_lanczos_freq.txt",
"Lanczos window");
/* Nuttall window */
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_NUTTALL, 0.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_nuttall.png",
"dat/win_nuttall_time.txt",
"dat/win_nuttall_freq.txt",
"Nuttall window");
/* Cosine window */
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_COS, 0.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_cos.png",
"dat/win_cos_time.txt",
"dat/win_cos_freq.txt",
"Cosine window");
/* Kaiser window pi * alpha = 4 */
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_KAISER, 4.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_kaiser4p0.png",
"dat/win_kaiser4p0_time.txt",
"dat/win_kaiser4p0_freq.txt",
"Kaiser window (pi * alpha = 4)");
/* Kaiser window pi * alpha = 8 */
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_KAISER, 8.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_kaiser8p0.png",
"dat/win_kaiser8p0_time.txt",
"dat/win_kaiser8p0_freq.txt",
"Kaiser window (pi * alpha = 8)");
/* Kaiser window pi * alpha = 12 */
window(w, N, DSPL_WIN_PERIODIC | DSPL_WIN_KAISER, 12.0);
window_plot(w, N, K, argc, argv, 0.0, 1.1,
"img/win_kaiser12p0.png",
"dat/win_kaiser12p0_time.txt",
"dat/win_kaiser12p0_freq.txt",
"Kaiser window (pi * alpha = 12)");
dspl_free(hdspl); /* free dspl handle */
return 0;
}

Для каждого вида оконной функция выводится персональный график.

Прямоугольное окно



Непраметрические окна



Параметрические окна Дольф-Чебышева



Параметрические окна Гаусса



Параметрические окна Кайзера



Автор
Бахурин Сергей. www.dsplib.org

См. определение в файле win.c строка 308

Используется в psd_periodogram(), psd_periodogram_cmplx(), psd_welch() и psd_welch_cmplx().

int window(double *w, int n, int win_type, double param)
Расчет функции оконного взвешивания
Definition: win.c:308
void gnuplot_close(void *h)
Закрыть хэндл GNUPLOT.
Definition: gnuplot.c:325
void * dspl_load()
Произвести динамическую линковку и загрузить функции libdspl-2.0.
Структура данных объекта быстрого преобразования Фурье
Definition: dspl.h:227
void gnuplot_cmd(void *h, char *cmd)
Функция посылает команду cmd пакету GNUPLOT, для построения или оформления графика,...
Definition: gnuplot.c:390
int writetxt(double *x, double *y, int n, char *fn)
Сохранить вещественные данные в текстовый файл
Definition: inout.c:491
void dspl_free(void *handle)
Очищает связанную ранее динамическую библиотеку DSPL-2.0.
int linspace(double x0, double x1, int n, int type, double *x)
Функция заполняет массив линейно-нарастающими, равноотстоящими значениями от x0 до x1
Definition: array.c:1009
int gnuplot_create(int argc, char *argv[], int w, int h, char *fn_png, void **hplot)
Создать график GNUPLOT.
Definition: gnuplot.c:200