OpenCV的DFT功能可以将DFT结果作为实际和复杂的输出值。
对于复杂的结果,公式如下:exp(-2 * pi i j * k / N)其中i = sqrt(-1)(Reference)
实际输出的公式是什么?
我猜这是formula,但我不确定。
答案 0 :(得分:2)
让我们做一些订单
DFT将复数值的N元组(对应于2 * N个实数值)作为输入,并将复数值的N元组作为输出。
没有用于实际的DFT和用于复杂输出值的DFT
可能你指的是所有输入值都是实数的情况,即每个虚部都是0(并且没有指定)。
这是DFT实际实施中经常需要的
在这种情况下,你总是会得到一个复数值的N元组,但有一些有趣的东西可以将这个结果的内在维度减少到相当于输入的N个实数值(注意我写的是“等价的”) ,他们仍然很复杂)。
我会告诉你一个例子
N = 7
INPUT
index,0,1,2,3,4,5,6
实部,0,2,4,1.5,7,-3,3
虚部,0,0,0,0,0,0,0
OUTPUT
index,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。:您链接的第二个公式是具有无限输入值的FT,而不是我们所讨论的离散版本。
除此之外,它与第一个相同(记住欧拉的公式: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 ;