|
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));
174 tmp = (
double*) malloc(nfft *
sizeof(
double));
179 w = (
double*)malloc(nfft*
sizeof(
double));
187 err =
window(w, nfft, win_type, win_param);
193 for(k = 0; k < nfft; k++)
200 memset(ptr_fft, 0,
sizeof(
fft_t));
208 memset(ppsd, 0, nfft *
sizeof(
double));
209 while(pos + nfft <= n)
211 for(k = 0; k < nfft; k++)
212 tmp[k] = x[pos+k] * w[k];
213 err = fft_mag(tmp, nfft, ptr_fft, fs,
214 flag & DSPL_FLAG_FFT_SHIFT, pdgr, NULL);
217 for(k = 0; k < nfft; k++)
226 memset(tmp ,0, nfft *
sizeof(
double));
227 for(k = 0; k < n - pos; k++)
228 tmp[k] = x[pos+k] * w[k];
231 err = fft_mag(tmp, nfft, ptr_fft, fs,
232 flag & DSPL_FLAG_FFT_SHIFT, pdgr, NULL);
236 for(k = 0; k < nfft; k++)
245 if(flag & DSPL_FLAG_FFT_SHIFT)
247 err =
linspace(-fs*0.5 + fs*0.5/(
double)nfft,
248 fs*0.5 - fs*0.5/(
double)nfft,
249 n, DSPL_SYMMETRIC, pfrq);
251 err =
linspace(-fs*0.5, fs*0.5, nfft, DSPL_PERIODIC, pfrq);
253 err =
linspace(0, fs, nfft, DSPL_PERIODIC, pfrq);
257 if(flag & DSPL_FLAG_LOGMAG)
259 printf(
"wn = %f\n", wn);
260 for(k = 0; k < nfft; k++)
261 ppsd[k] = 10.0 * log10(ppsd[k] / (fs * wn * (
double)cnt));
265 for(k = 0; k < nfft; k++)
266 ppsd[k] /= fs * wn * (
double)cnt;
277 if(ptr_fft && (ptr_fft != pfft))
int window(double *w, int n, int win_type, double param)
Расчет функции оконного взвешивания
void fft_free(fft_t *pfft)
Очистить структуру fft_t алгоритма БПФ
int psd_welch(double *x, int n, int win_type, double win_param, int nfft, int noverlap, fft_t *pfft, double fs, int flag, double *ppsd, double *pfrq)
Непараметрическая оценка спектральной плотности мощности (СПМ) вещественного сигнала методом Уэлча.
Структура данных объекта быстрого преобразования Фурье
#define RES_OK
Функция завершилась корректно. Ошибки отсутствуют.
int linspace(double x0, double x1, int n, int type, double *x)
Функция заполняет массив линейно-нарастающими, равноотстоящими значениями от x0 до x1
#define ERROR_MALLOC
Ошибка динамического выделения памяти. Данная ошибка означает, что при динамическом выделении памяти ...