Когда я использую Intel IPP ippsFFTFwd_RToCCS_64f, а затем ippsMagnitude_64fc Я получаю массивный пик при нулевом индексе в массиве величин.
Моя синусоида длинная, и основной компонент, который меня интересует, находится где-то между 0,15 Гц и 0,25 Гц. Я беру образец с частотой дискретизации 500 Гц. Если я уменьшу среднее значение сигнала перед БПФ, я получу очень маленькую нулевую составляющую, а не тот пик. Ниже приведено изображение головки массива величин:
Кроме того, масштабирование величины кажется в 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);
}