OpenCV的离散傅里叶变换实输出公式是什么?
What is OpenCV's Discrete Fourier Transform real output formula?
OpenCV的DFT函数可以将DFT结果作为实数和复数输出值。
对于复数结果,公式如下:exp(-2*piij*k/N) where i=sqrt(-1) (Reference)
实际输出的公式是什么?
我猜是这个formula,但我不确定。
我们来点单吧。
DFT 将复数值的 N 元组(对应于 2*N 个实数值)作为输入,并将复数值的 N 元组作为输出。
没有针对实数的 DFT,也没有针对复数输出值的 DFT。
可能你指的是所有输入值都是实数的情况,即每个虚部都是0(并且没有指定)。
这是 DFT 实际实现中经常需要的。
在这种情况下,你总是会得到一个复值的 N 元组,但是有一些有趣的东西可以将这个结果的内在维度减少到与输入的 N 个实值相等(注意我写了“等效” ,它们仍然很复杂)。
我给你举个例子。
N=7
输入
索引, 0, 1, 2, 3, 4, 5, 6
实部, 0, 2, 4, 1.5, 7, -3, 3
虚部,0, 0, 0, 0, 0, 0, 0
输出
索引, 0, 1, 2, 3, 4, 5, 6
实部,14.5,-4.763307302,3.286089778,-5.772782476,-5.772782476,3.286089778,-4.763307302
虚部, 0, -3.656303338, -0.287959068, 11.26880763, -11.26880763, 0.287959068, 3.656303338
请注意,在 14 个输出值中,只有 7 个是真正必要的(粗体),因为第一个虚部始终为 0,并且一些值取决于其余值。
下面给大家介绍一下OPENCV是如何处理这种情况的:
double values[7] = {0, 2, 4, 1.5, 7, -3, 3};
Mat x(Size(1,7), CV_64F, values);
Mat X;
dft(x, X);
cout << "X = "<< endl << X << endl;
它只输出严格需要的值。
P.S.: 你的第二个公式link是一个无限输入值的FT,不是我们说的Discrete版本
除此之外,它与第一个相同(记住欧拉公式:e^ix=cosx+isinx)
已更新
复数输入示例,但虚部为空。这是上面的例子,但输入复杂。
double values[14] = {0,0, 2,0, 4,0, 1.5,0, 7,0, -3,0, 3,0};
Mat x(Size(1,7), CV_64FC2, values);
Mat X;
dft(x, X, DFT_COMPLEX_OUTPUT);
cout << "X = "<< endl << X << endl ;
OpenCV的DFT函数可以将DFT结果作为实数和复数输出值。
对于复数结果,公式如下:exp(-2*piij*k/N) where i=sqrt(-1) (Reference)
实际输出的公式是什么?
我猜是这个formula,但我不确定。
我们来点单吧。
DFT 将复数值的 N 元组(对应于 2*N 个实数值)作为输入,并将复数值的 N 元组作为输出。
没有针对实数的 DFT,也没有针对复数输出值的 DFT。
可能你指的是所有输入值都是实数的情况,即每个虚部都是0(并且没有指定)。
这是 DFT 实际实现中经常需要的。
在这种情况下,你总是会得到一个复值的 N 元组,但是有一些有趣的东西可以将这个结果的内在维度减少到与输入的 N 个实值相等(注意我写了“等效” ,它们仍然很复杂)。
我给你举个例子。
N=7
输入
索引, 0, 1, 2, 3, 4, 5, 6
实部, 0, 2, 4, 1.5, 7, -3, 3
虚部,0, 0, 0, 0, 0, 0, 0
输出
索引, 0, 1, 2, 3, 4, 5, 6
实部,14.5,-4.763307302,3.286089778,-5.772782476,-5.772782476,3.286089778,-4.763307302
虚部, 0, -3.656303338, -0.287959068, 11.26880763, -11.26880763, 0.287959068, 3.656303338
请注意,在 14 个输出值中,只有 7 个是真正必要的(粗体),因为第一个虚部始终为 0,并且一些值取决于其余值。
下面给大家介绍一下OPENCV是如何处理这种情况的:
double values[7] = {0, 2, 4, 1.5, 7, -3, 3};
Mat x(Size(1,7), CV_64F, values);
Mat X;
dft(x, X);
cout << "X = "<< endl << X << endl;
它只输出严格需要的值。
P.S.: 你的第二个公式link是一个无限输入值的FT,不是我们说的Discrete版本
除此之外,它与第一个相同(记住欧拉公式:e^ix=cosx+isinx)
已更新
复数输入示例,但虚部为空。这是上面的例子,但输入复杂。
double values[14] = {0,0, 2,0, 4,0, 1.5,0, 7,0, -3,0, 3,0};
Mat x(Size(1,7), CV_64FC2, values);
Mat X;
dft(x, X, DFT_COMPLEX_OUTPUT);
cout << "X = "<< endl << X << endl ;