首页 > 解决方案 > 阵列功率谱的 0 次谐波问题

问题描述

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

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

  2. 计算 X-Signature 的功率谱 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 如本文所述公式已提取)

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

而且,如果我将 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 指南复制粘贴的,我得到了这个。我扩大了 xSig 数组,还改变了计算功率谱的方式。如您所见,功率谱图是正确的,但在 0 次谐波上仍然存在我认为不应该存在的“尖峰”,但这是一种改进。

标签: c++opencvfftfingerprint

解决方案


abs是错误的操作。你需要split跟着得到你从中得到的压缩复数magnitude的范数。dft

如果您没有得到任何高次谐波,您的输入向量也可能太短。


推荐阅读