#include "commonfun.h" CCommonFun::CCommonFun() { } /************************************************************************/ /* 一维数据的复数快速傅里叶变换 */ /************************************************************************/ void CCommonFun::FFT(int n, fftw_complex* in, fftw_complex* out) { if (in == NULL || out == NULL) return; fftw_plan p; p = fftw_plan_dft_1d(n, in, out, FFTW_FORWARD, FFTW_ESTIMATE); fftw_execute(p); fftw_destroy_plan(p); fftw_cleanup(); } void CCommonFun::_FFT(QVector & vecData, QVector & vecFFTrealData,QVector & vecFFTimageData) { fftw_complex *inHilFFt, *outHilFFt; inHilFFt = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * vecData.size()); outHilFFt = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * vecData.size()); for (int j = 0; j < vecData.size(); j++) { inHilFFt[j][0] = (double)vecData[j]; inHilFFt[j][1] = 0; } FFT(vecData.size(), inHilFFt, outHilFFt); //fftShift(outHilFFt, vecData.size()); for (int i = 0; i < vecData.size(); i++) { vecFFTrealData.push_back(outHilFFt[i][0]); vecFFTimageData.push_back(outHilFFt[i][1]); } fftw_free(inHilFFt); fftw_free(outHilFFt); } void CCommonFun::FFTSpec(QVector & vecData, QVector & vecFFTSpecData) { fftw_complex *inFFt, *outFFt; inFFt = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * vecData.size()); outFFt = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * vecData.size()); for (int j = 0; j < vecData.size(); j++) { inFFt[j][0] = (double)vecData[j]; inFFt[j][1] = 0; } FFT(vecData.size(),inFFt, outFFt); for(int j = 0; j < vecData.size()/2; j++) { vecFFTSpecData.push_back(sqrt(outFFt[j][0]*outFFt[j][0] + outFFt[j][1]*outFFt[j][1])*2/vecData.size()); } fftw_free(inFFt); fftw_free(outFFt); }