阵列功率谱的 0 次谐波问题
Problem with the 0th harmonic of the Power Spectrum of an array
这是我的第一个问题!
我要解决的问题是:我正在使用 C++ 中的 OpenCV 创建指纹模式识别程序。在我正在研究的论文之后,我被困在这一部分,上面写着:
计算 X 签名值数组 -> xSig[0, ..., w-1](我已经完成了这部分)
计算 X 签名的功率谱 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 次谐波上仍然存在我认为不应该存在的“尖峰”,但这是一种改进。
abs
是错误的操作。您需要 split
后跟 magnitude
以获得从 dft
.
获得的 压缩 复数的范数
此外,如果您没有获得任何高次谐波,您的输入向量可能太短了。
这是我的第一个问题! 我要解决的问题是:我正在使用 C++ 中的 OpenCV 创建指纹模式识别程序。在我正在研究的论文之后,我被困在这一部分,上面写着:
计算 X 签名值数组 -> xSig[0, ..., w-1](我已经完成了这部分)
计算 X 签名的功率谱 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 次谐波上仍然存在我认为不应该存在的“尖峰”,但这是一种改进。
abs
是错误的操作。您需要 split
后跟 magnitude
以获得从 dft
.
此外,如果您没有获得任何高次谐波,您的输入向量可能太短了。