org.apache.commons.math3.transform FastFourierTransformer returns 输入为 Complex[] 和 Double[] 时的不同值
org.apache.commons.math3.transform FastFourierTransformer returns different value when input is Complex[] and Double[]
对于这个问题,我使用了 Apache
的数学库
我的目标是在对输入值的正向傅立叶变换的 absolute value 结果执行逆傅立叶变换后取回我的输入。
当我对输入的正向傅立叶变换的 Complex value 结果执行逆傅立叶变换时,我得到了正确的输出。
我可能做错了什么?
public void fourierTestTemp(){
double[] input = new double[]{1,0,0,0,0,0,0,66,888,0,0,0,0,0,0,0};//Length = 16
double[] result = new double[input.length];//This double array will hold the results of the fourier transform
FastFourierTransformer transformer = new FastFourierTransformer(DftNormalization.UNITARY);//The FastFourierTransformer class by Apache
Complex[] complx = transformer.transform(result, TransformType.FORWARD);//Apply fourier transform to double[]
//Go through Complex value results and obtain absolute value
for (int i = 0; i < complx.length; i++) {
result[i] = complx[i].abs();
}
//Perform inverse transform on the obtained absolute values from the forward transform.
complx = transformer.transform(result, TransformType.INVERSE);
//Go through Complex value results and obtain absolute value
for (int i = 0; i < complx.length; i++) {
result[i] = complx[i].abs();
}
//Print results
for (int i = 0; i < result.length; i++) {
System.out.print(result[i]+",");
}
}
ifft(abs(fft(x))) 仅当 x 严格对称时才是恒等式(可以仅由 DFT 的余弦基向量构成)。你的测试向量不是。
余弦是对称函数。正弦是反对称的。
如果 x 不对称,fft(x) 将不是实数,因此 abs() 函数将旋转一些相位结果,从而使 ifft 输出波形失真。
对于这个问题,我使用了 Apache
的数学库我的目标是在对输入值的正向傅立叶变换的 absolute value 结果执行逆傅立叶变换后取回我的输入。
当我对输入的正向傅立叶变换的 Complex value 结果执行逆傅立叶变换时,我得到了正确的输出。
我可能做错了什么?
public void fourierTestTemp(){
double[] input = new double[]{1,0,0,0,0,0,0,66,888,0,0,0,0,0,0,0};//Length = 16
double[] result = new double[input.length];//This double array will hold the results of the fourier transform
FastFourierTransformer transformer = new FastFourierTransformer(DftNormalization.UNITARY);//The FastFourierTransformer class by Apache
Complex[] complx = transformer.transform(result, TransformType.FORWARD);//Apply fourier transform to double[]
//Go through Complex value results and obtain absolute value
for (int i = 0; i < complx.length; i++) {
result[i] = complx[i].abs();
}
//Perform inverse transform on the obtained absolute values from the forward transform.
complx = transformer.transform(result, TransformType.INVERSE);
//Go through Complex value results and obtain absolute value
for (int i = 0; i < complx.length; i++) {
result[i] = complx[i].abs();
}
//Print results
for (int i = 0; i < result.length; i++) {
System.out.print(result[i]+",");
}
}
ifft(abs(fft(x))) 仅当 x 严格对称时才是恒等式(可以仅由 DFT 的余弦基向量构成)。你的测试向量不是。
余弦是对称函数。正弦是反对称的。
如果 x 不对称,fft(x) 将不是实数,因此 abs() 函数将旋转一些相位结果,从而使 ifft 输出波形失真。