59 lines
1.9 KiB
C++
59 lines
1.9 KiB
C++
#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<double> & vecData, QVector<double> & vecFFTrealData,QVector<double> & 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<double> & vecData, QVector<double> & 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);
|
|
}
|