首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阵列功率谱的第0次谐波问题

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

Stack Overflow用户
提问于 2021-08-27 15:41:26
回答 1查看 108关注 0票数 1

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

  1. 计算值-> xSig0,.,w-1的x-签名数组。
  2. 计算X-签名的功率谱Pk,其中k=0是0次谐波等.

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

代码语言:javascript
复制
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的回复,我成功地做到了这一点:

代码语言:javascript
复制
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次谐波的“尖峰”,我认为不应该在那里,但这是一个改进。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-27 16:03:53

abs是错误的操作。您需要split,然后是magnitude,才能得到从dft获得的填充复数的范数。

此外,如果没有任何高阶谐波,则输入向量可能太短。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68956136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档