Когда я использую Intel IPP ippsFFTFwd_RToCCS_64f , а затем ippsMagnitude_64f c, я получаю массивный пик при нулевом индексе в массиве величин.
Моя синусоида длинный и интересующий меня главный компонент находится где-то между 0,15 Гц и 0,25 Гц. Я беру образец с частотой дискретизации 500 Гц. Если я уменьшу среднее значение сигнала перед БПФ, я получу действительно небольшую нулевую составляющую, а не этот пик. Ниже приведен заголовок массива величин pi c:
введите описание изображения здесь
Также масштабирование амплитуды кажется в 10 раз больше величины, которую я вижу во временном ряду сигнала, например, если амплитуда 29 по величине, это 290.
Я не уверен почему это так, и мой вопрос: 1. Действительно ли мне нужно обращаться к пику нулевого индекса с помощью среднего сокращения и 2. Откуда взялась эта шкала 10?
void CalculateForwardTransform(array<double> ^signal, array<double> ^transformedSignal, array<double> ^magnitudes)
{
// source signal
pin_ptr<double> pinnedSignal = &signal[0];
double *pSignal = pinnedSignal;
int order = (int)Math::Round(Math::Log(signal->Length, 2));
// get sizes
int sizeSpec = 0, sizeInit = 0, sizeBuf = 0;
int status = ippsFFTGetSize_R_64f(order, IPP_FFT_DIV_INV_BY_N, ippAlgHintNone, &sizeSpec, &sizeInit, &sizeBuf);
// memory allocation
IppsFFTSpec_R_64f* pSpec;
Ipp8u *pSpecMem = (Ipp8u*)ippMalloc(sizeSpec);
Ipp8u *pMemInit = (Ipp8u*)ippMalloc(sizeInit);
// FFT specification structure initialized
status = ippsFFTInit_R_64f(&pSpec, order, IPP_FFT_DIV_INV_BY_N, ippAlgHintNone, pSpecMem, pMemInit);
// transform
pin_ptr<double> pinnedTransformedSignal = &transformedSignal[0];
double *pDst = pinnedTransformedSignal;
Ipp8u *pBuffer = (Ipp8u*)ippMalloc(sizeBuf);
status = ippsFFTFwd_RToCCS_64f(pSignal, pDst, pSpec, pBuffer);
// get magnitudes
pin_ptr<double> pinnedMagnitudes = &magnitudes[0];
double *pMagn = pinnedMagnitudes;
status = ippsMagnitude_64fc((Ipp64fc*)pDst, pMagn, magnitudes->Length); // magnitudes is half of signal len
// free memory
ippFree(pSpecMem);
ippFree(pMemInit);
ippFree(pBuffer);
}