KRS*_*fun 14 c++ fft transform ifft
我正在使用C++/C对某些数据执行前向和反向FFT,这些数据应该是激光器的脉冲输出.
我们的想法是获取输出,使用正向FFT转换到频域,对相位应用线性最佳拟合(首先展开它),然后从相位信息中减去这个最佳拟合.
然后将得到的相位和幅度转换回时域,最终目标是通过相位补偿压缩脉冲.
我试图在MATLAB中不成功地做到这一点,结果转而使用C++.前向FFT工作正常,我从C++中的数字配方中获取了基本配方,并使用函数对复杂输入进行修改,如下所示:
void fft(Complex* DataIn, Complex* DataOut, int fftSize, int InverseTransform, int fftShift)
{
double* Data = new double[2*fftSize+3];
Data[0] == 0.0;
for(int i=0; i<fftSize; i++)
{
Data[i*2+1] = real(DataIn[i]);
Data[i*2+2] = imag(DataIn[i]);
}
fft_basic(Data, fftSize, InverseTransform);
for(int i=0; i<fftSize; i++)
{
DataOut[i] = Complex(Data[2*i+1], Data[2*i+2]);
}
//Swap the fft halfes
if(fftShift==1)
{
Complex* temp = new Complex[fftSize];
for(int i=0; i<fftSize/2; i++)
{
temp[i+fftSize/2] = DataOut[i];
}
for(int i=fftSize/2; i<fftSize; i++)
{
temp[i-fftSize/2] = DataOut[i];
}
for(int i=0; i<fftSize; i++)
{
DataOut[i] = temp[i];
}
delete[] temp;
}
delete[] Data;
}
Run Code Online (Sandbox Code Playgroud)
功能ftt_basic()取自'Numerical recipes C++'.
我的问题是输入的形式似乎影响反向FFT的输出.这可能是一个精确的问题,但我环顾四周,似乎并没有影响到其他任何人.
将前向FFT的输出直接送回反向FFT会产生与输入相同的脉冲:

然而real^2+imag^2,从前向FFT 获取功率输出并将其复制到阵列,使得:
Reverse_fft_input[i]=complex(real(forwardsoutput[i]),imag(forwardsoutput[i]));
Run Code Online (Sandbox Code Playgroud)
然后使用它作为反向FFT的输入产生以下结果:

最后,获取前向FFT的输出并进行复制,以便:
Reverse_fft_input[i]=complex( Amplitude[i]*cos(phase[i]), Amplitude[i]*sin(phase[i]));
Run Code Online (Sandbox Code Playgroud)
其中Amplitude [i] =(real ^ 2 + imag ^ 2)^ 0.5和phase [i] = atan(imag/real).转换回时域时产生以下功率输出:

仔细看看脉冲结构:

当第一张照片产生漂亮的常规脉冲时.
我的问题是,是否cos和sin函数的精度导致反向fft的输出变为这样?为什么在输入复杂数据的不同方法之间存在如此巨大的差异,为什么只有当数据直接反馈到反向FFT时才会使时域中的数据与原始数据相同输入到转发器FFT?
谢谢.
*这里编辑的是函数的实现:
void TTWLM::SpectralAnalysis()
Run Code Online (Sandbox Code Playgroud)
{
Complex FieldSpectrum[MAX_FFT];
double PowerFFT[MAX_FFT];
double dlambda;
double phaseinfo[MAX_FFT]; // Added 07/08/2012 for Inverse FFT
double fftamplitude[MAX_FFT]; // Added 07/08/2012 for Inverse FFT after correction
double phasecorrect[MAX_FFT]; // Added 07/08/2012 for Inverse FFT after correction
double lambdaarray[MAX_FFT]; // Added 07/08/2012 for Inverse FFT after correction
Complex CompressedFFT[MAX_FFT];
Complex correctedoutput[MAX_FFT];
//Calc the wavelength step size
dlambda = lambda*lambda/CONST_C/DT/fftSize;
//Calculate the spectrum
fft(fftFieldData, FieldSpectrum, fftSize, FORWARD, SHIFT); // Forward fft of the output data 'fftFieldData' into frequency domain
//Get power spectrum
for(int i=0; i<fftSize; i++)
{
PowerFFT[i] = norm(FieldSpectrum[i]);
phaseinfo[i] = atan2(imag(FieldSpectrum[i]),real(FieldSpectrum[i]));
fftamplitude[i] = sqrt(PowerFFT[i]); // Added 07/08/2012 for Inverse FFT after correction
}
// Added 07/08/2012 for Inverse FFT after correction, this loop subtracts line of best fit from the phase
for(int i=0; i<fftSize; i++)
{
lambdaarray[i]=dlambda*(i-fftSize/2)*1e-2;
phasecorrect[i]=phaseinfo[i]-((1.902e+10*lambdaarray[i])+29619); // Correction from best fit in MATLAB (DONE MANUALLY) with phase unwrapping
CompressedFFT[i]=(fftamplitude[i]*cos(phaseinfo[i]),fftamplitude[i]*sin(phaseinfo[i]));
}
fft(CompressedFFT, correctedoutput, fftSize, REVERSE, SHIFT); // Reverse fft of corrected phase back to time domain, final output is correctedoutput
Run Code Online (Sandbox Code Playgroud)
再次感谢!
几个可能的错误:
Run Code Online (Sandbox Code Playgroud)Data[0] == 0.0;
也许应该是这样=,不是吗==?
fft_basic(数据,fftSize,逆变换);
我无法访问该函数的源代码;它真的期望您在奇数位置提供实数部分而在偶数位置提供虚数的布局吗?
Run Code Online (Sandbox Code Playgroud)//Swap the fft halfes
正如我在另一个问题中告诉你的,如果你确实交换它们,你需要在逆变换之前将它们交换回来。您执行此交换吗?
您的数据是否符合 fft_basic 函数的预期?可能它期望 fftSize 是 2 的幂。
您是否对 FFT 结果进行归一化?离散 FFT 变换需要归一化。
| 归档时间: |
|
| 查看次数: |
6392 次 |
| 最近记录: |