c++ - 阵列功率谱的 0 次谐波问题
问题描述
这是我的第一个问题!我要解决的问题是:我正在使用 C++ 中的 OpenCV 创建指纹模式识别程序。在我正在研究的论文之后,我被困在它所说的这部分:
计算值的 X-Signature 数组 -> xSig[0, ..., w-1] (我已经完成了这部分)
计算 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 次谐波上仍然存在我认为不应该存在的“尖峰”,但这是一种改进。
解决方案
abs
是错误的操作。你需要split
跟着得到你从中得到的压缩复数magnitude
的范数。dft
如果您没有得到任何高次谐波,您的输入向量也可能太短。
推荐阅读
- ios - 如何安装 ipa 文件(无需越狱)
- javascript - TypeScript 错误:“类型 'number' 不可分配给类型 '0 | 1 | 2'”。为什么我会收到此错误?
- r - 在 github 上的包 README.md 中允许徽章但在 CRAN 版本中不允许徽章的解决方法
- typescript - 结合 import,在 typescript 声明文件中声明关键字
- python - 在熊猫数据框中按组分组数据
- swift - 表格单元格中的活动指示器视图
- c# - SignalR 核心 - 状态代码:404,ReasonPhrase:“未找到”,版本:1.1
- jquery - jQuery 调用不工作与 ajax 调用工作的奇怪问题
- android-studio - 如何阻止 Android Studio 尝试安装 Android SDK 更新?
- c# - 有没有办法强制 Intellisense 重新评估可用的过载?