|
libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
|
28 #ifdef DOXYGEN_ENGLISH
31 #ifdef DOXYGEN_RUSSIAN
157 int win_type,
double win_param,
158 int nfft,
int noverlap,
fft_t* pfft,
double fs,
159 int flag,
double* ppsd,
double* pfrq)
161 int err, pos, cnt, k;
165 fft_t *ptr_fft = NULL;
170 pdgr = (
double*)malloc(nfft *
sizeof(
double));
180 w = (
double*)malloc(nfft*
sizeof(
double));
188 err =
window(w, nfft, win_type, win_param);
194 for(k = 0; k < nfft; k++)
201 memset(ptr_fft, 0,
sizeof(
fft_t));
209 memset(ppsd, 0, nfft *
sizeof(
double));
210 while(pos + nfft <= n)
212 for(k = 0; k < nfft; k++)
214 RE(tmp[k]) =
RE(x[pos+k]) * w[k];
215 IM(tmp[k]) =
IM(x[pos+k]) * w[k];
217 err = fft_mag_cmplx(tmp, nfft, ptr_fft, fs,
218 flag & DSPL_FLAG_FFT_SHIFT, pdgr, NULL);
221 for(k = 0; k < nfft; k++)
230 memset(tmp ,0, nfft *
sizeof(
complex_t));
231 for(k = 0; k < n - pos; k++)
233 RE(tmp[k]) =
RE(x[pos+k]) * w[k];
234 IM(tmp[k]) =
IM(x[pos+k]) * w[k];
237 err = fft_mag_cmplx(tmp, nfft, ptr_fft, fs,
238 flag & DSPL_FLAG_FFT_SHIFT, pdgr, NULL);
242 for(k = 0; k < nfft; k++)
251 if(flag & DSPL_FLAG_FFT_SHIFT)
253 err =
linspace(- fs * 0.5 + fs * 0.5 / (
double)nfft,
254 fs * 0.5 - fs * 0.5 / (
double)nfft,
255 n, DSPL_SYMMETRIC, pfrq);
257 err =
linspace(-fs*0.5, fs*0.5, nfft, DSPL_PERIODIC, pfrq);
259 err =
linspace(0, fs, nfft, DSPL_PERIODIC, pfrq);
263 if(flag & DSPL_FLAG_LOGMAG)
265 for(k = 0; k < nfft; k++)
266 ppsd[k] = 10.0 * log10(ppsd[k] / (fs * wn * (
double)cnt));
270 for(k = 0; k < nfft; k++)
271 ppsd[k] /= fs * wn * (
double)cnt;
282 if(ptr_fft && (ptr_fft != pfft))
int window(double *w, int n, int win_type, double param)
Расчет функции оконного взвешивания
#define RE(x)
Макрос определяющий реальную часть комплексного числа.
int psd_welch_cmplx(complex_t *x, int n, int win_type, double win_param, int nfft, int noverlap, fft_t *pfft, double fs, int flag, double *ppsd, double *pfrq)
Непараметрическая оценка спектральной плотности мощности (СПМ) комплексного сигнала методом Уэлча.
void fft_free(fft_t *pfft)
Очистить структуру fft_t алгоритма БПФ
Структура данных объекта быстрого преобразования Фурье
double complex_t[2]
Описание комплексного типа данных.
#define RES_OK
Функция завершилась корректно. Ошибки отсутствуют.
int linspace(double x0, double x1, int n, int type, double *x)
Функция заполняет массив линейно-нарастающими, равноотстоящими значениями от x0 до x1
#define IM(x)
Макрос определяющий мнимую часть комплексного числа.
#define ERROR_MALLOC
Ошибка динамического выделения памяти. Данная ошибка означает, что при динамическом выделении памяти ...