我在 stackoverflow.com 上发布了同样的问题,但收效甚微,所以我想我会在这里尝试!
我正在使用 C++/C 对一些应该是激光脉冲输出的数据执行正向和反向 FFT。
这个想法是获取输出,使用前向 FFT 转换到频域,对相位应用线性最佳拟合(首先展开它),然后从相位信息中减去这个最佳拟合。
然后将得到的相位和幅度转换回时域,最终目标是通过相位补偿压缩脉冲。
我试图在 MATLAB 中这样做没有成功,结果转向了 C++。前向 FFT 工作正常,我从 C++ 中的 Numerical recipes 中获取了基本配方,并使用了一个函数来修改它以适应复杂的输入,如下所示:
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;
}
使用ftt_basic()
取自“数值食谱 C++”的函数。输入变量InverseTransform
只是 FFT 的方向:正向或反向。
我的问题是输入的形式似乎会影响反向 FFT 的输出。这可能是一个精度问题,但我环顾四周,它似乎并没有影响到其他任何人。
将正向 FFT 的输出直接反馈回反向 FFT 会产生与输入相同的脉冲。
然而,将前向 FFT 的功率输出real^2+imag^2
复制到一个数组中,这样:
Reverse_fft_input[i]=complex(real(forwardsoutput[i]),imag(forwardsoutput[i]));
然后将其用作反向 FFT 的输入会产生规则的耦合脉冲,但幅度和周期错误。
最后,获取正向 FFT 的输出并复制如下:
Reverse_fft_input[i]=complex( Amplitude[i]*cos(phase[i]), Amplitude[i]*sin(phase[i]));
其中Amplitude[i]=(real^2+imag^2)^0.5
和phase[i]=atan(imag/real)
在时域中产生非常混乱的输出,峰值朝向中间,类似于频域中的功率谱。
我的问题是,是 cos 和 sin 函数的精度导致反向 fft 的输出变成这样吗?所有变量都存储为“double”类型。为什么复杂数据的不同输入方式存在如此巨大的差异,为什么只有直接反馈到反向FFT时,时域数据才与原始数据相同?输入到前锋FFT?
谢谢你。
(我会张贴图片,但不幸的是我还不能这样做......)