阵列功率谱的 0 次谐波问题

Problem with the 0th harmonic of the Power Spectrum of an array

这是我的第一个问题! 我要解决的问题是:我正在使用 C++ 中的 OpenCV 创建指纹模式识别程序。在我正在研究的论文之后,我被困在这一部分,上面写着:

  1. 计算 X 签名值数组 -> xSig[0, ..., w-1](我已经完成了这部分)

  2. 计算 X 签名的功率谱 P[k],其中 k=0 是 0 次谐波,依此类推...

现在:我计算的功率谱是由

Mat xSig = getxSig(); //ok
Mat fourier;          //Fourier ARRAY made with Mat for convenience
Mat PS;               //Power Spectrum, Mat for convenience
dft(xSig, fourier);   //
pow(abs(fourier), 2, PS);

问题是功率谱上的 0 次谐波总是比其他谐波大很多,这让我觉得我正在做的事情或我所知道的谐波本身存在问题.我正在处理的 xSignature 数组非常小(最多 20 个值),我认为这可能是具有如此高的 0 次谐波的原因。

功率谱应使用以下公式计算:PS = |Fourier| ^2 如 this 文章所述, (formula extracted)

这是我从 xSignature 计算的功率谱的示例:image

另外,this 是一个示例,如果我将 PS[0] = 0 用于测试。这显示了二次谐波中的一个大峰值,我不太确定其含义但似乎比更高的 0 次谐波更合适...

编辑:

感谢 Ext3h 的回复,我做到了:

Mat planes[] = { Mat_<float>(xSig), Mat::zeros(xSig.size(), CV_32F) };
Mat complexI;
merge(planes, 2, complexI);
dft(complexI, complexI);
split(complexI, planes);                   // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude
Mat magI = planes[0];

实际上是从 OpenCV 指南中复制粘贴的,我得到了 this。 我扩大了 xSig 阵列并改变了计算功率谱的方式。 如您所见,功率谱图是正确的,但在 0 次谐波上仍然存在我认为不应该存在的“尖峰”,但这是一种改进。

abs是错误的操作。您需要 split 后跟 magnitude 以获得从 dft.

获得的 压缩 复数的范数

此外,如果您没有获得任何高次谐波,您的输入向量可能太短了。