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

Posted

技术标签:

【中文标题】阵列功率谱的 0 次谐波问题【英文标题】:Problem with the 0th harmonic of the Power Spectrum of an array 【发布时间】:2021-08-27 15:41:26 【问题描述】:

这是我的第一个问题! 我要解决的问题是:我正在使用 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 如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 次谐波上仍然存在我认为不应该存在的“尖峰”,但这是一种改进。

【问题讨论】:

傅立叶级数中的第一个数字将等于所有输入的平均值。所以可能就是这样。 可能是平均值,或者它们的总和。取决于如何应用标准化。 40 个样本,平均 0.6(头重脚轻),我希望频率 0 在 24 左右,并且情节一致 【参考方案1】:

abs 是错误的操作。您需要 split 后跟 magnitude 来获得从 dft 获得的压缩复数的范数。

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

【讨论】:

其实我在here看到了这个,但是他们是用一张图片来获取功率谱的,所以我没有用它。

以上是关于阵列功率谱的 0 次谐波问题的主要内容,如果未能解决你的问题,请参考以下文章

V7000存储7块硬盘离线数据恢复成功率分析

低副瓣阵列天线综合2 matlab HFSS

谐波乘积谱的 MATLAB 代码

使用 vDSP 复制阵列内容

UG NX二次开发(C#)-装配-删除阵列矩阵

超声波定向传送:驱动功率电路制作