赞
踩
FFTW库函数的fftw_plan_dft_1d中的第三个输入参数FFTW_FORWARD为正傅里叶变换,FTW_BACKWARD为逆傅里叶变换;第四个输入参数FFTW_MEASURE表示准确计算,FFTW_ESTIMATE表示快速估计。
fftw_plan_dft_1d的执行需要在赋值fftIN之前。
fftIn和fftOut的长度需要一致,默认初始化为0。
int main() { int Nfft = 1024, Ns = 600; double fc1 = 0e6; double fc2 = 1.2e6; double Fs = 3.5e6; fftw_complex *fftIn = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*Nfft); fftw_complex *fftOut = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*Nfft); fftw_plan plan = fftw_plan_dft_1d(Nfft, fftIn, fftOut, FFTW_FORWARD, FFTW_MEASURE); for (int i = 0; i < Ns; i++) { fftIn[i][0] = cos(2 * PI*fc1*i / Fs)+ cos(2 * PI*fc2*i / Fs); // real part fftIn[i][1] = sin(2 * PI*fc1*i / Fs)+ sin(2 * PI*fc2*i / Fs); // imag part } fftw_execute(plan); fftw_destroy_plan(plan); double *fftres = new double[Nfft]; VectorXd freqpoint = VectorXd::LinSpaced(Nfft, -Nfft / 2, Nfft / 2 - 1); freqpoint = freqpoint*Fs / Nfft/1e6; for (int i = 0; i < Nfft; i++) { if (i<Nfft/2) fftres[i + Nfft / 2] = 10 * log10(sqrt(fftOut[i][0] * fftOut[i][0] + fftOut[i][1] * fftOut[i][1])); else fftres[i - Nfft / 2] = 10 * log10(sqrt(fftOut[i][0] * fftOut[i][0] + fftOut[i][1] * fftOut[i][1])); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。