这是我的第一个问题!我想解决的问题是:我正在使用OpenCV在C++中创建一个指纹模式识别程序。在我正在研究的论文之后,我被困在这部分,上面写着:
现在:我计算出的功率谱是由
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 =x-Fourier_x ^2
下面是我从xSignature:图像中计算出的功率谱的一个例子
而且,如果我将PS =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次谐波的“尖峰”,我认为不应该在那里,但这是一个改进。
发布于 2021-08-27 16:03:53
abs是错误的操作。您需要split,然后是magnitude,才能得到从dft获得的填充复数的范数。
此外,如果没有任何高阶谐波,则输入向量可能太短。
https://stackoverflow.com/questions/68956136
复制相似问题