【问题标题】:Using the heapq function 'nlargest' to find the peaks of an FFT and their corresponding frequencies in python使用 heapq 函数“nlargest”在 python 中查找 FFT 的峰值及其对应的频率
【发布时间】:2013-05-29 22:44:09
【问题描述】:

我正在使用 FFT 来查看我正在设计的 IC 测试仪的输出信号上的失真。我有两个数组,一个包含采样频率,另一个包含相应的 FFT 值。我已经能够使用 heapq 库中的 nlargest 函数打印三个最高的 FFT 值,但还想从 x 轴数组中打印相应的频率值。我的部分代码如下。频率值存储在数组“frq”中,FFT 值存储在数组“Y”中

Y = sci.fft(y)/n # fft computing and normalization
Y = Y[range(n/2)]
Y = abs(Y)
print heapq.nlargest(3, 20*np.log10(abs(Y)))
print heapq.nlargest(3, frq, key=lambda i: Y[i])

我从最后一行代码收到以下错误:

print heapq.nlargest(2, frq, key=lambda i: Y[i])
IndexError: index 500 is out of bounds for axis 0 with size 50

【问题讨论】:

  • 你确定你的意思不是类似:nlargest(3,enumerate(frq),key=lambda i,_:Y[i])

标签: python python-2.7 numpy scipy fft


【解决方案1】:

numpythonic 这样做的方式会完全跳过 heapq 并像这样进行一些思考:

idx = np.argsort(Y)[::-1][:3]
y_top_3 = 20*np.log10(Y[idx])
f_top_3 = frq[idx]

如果你想获得一个可迭代的迭代,你可以这样做:

top_3 = np.vstack(f_top_3, y_top_3).T

【讨论】:

    【解决方案2】:

    这是一种方法,将给出对应于最高值的 3 个元组

    from itertools import izip
    print heapq.nlargest(3, izip(frq, 20*np.log10(abs(Y))), key=lambda x: x[1])
    

    你也可以把Y放在前面

    print heapq.nlargest(3, izip(20*np.log10(abs(Y)), frq))
    

    【讨论】:

    • 效果很好,现在我可以从我的 FFt 函数返回一个包含频率和 FFT 信息的数组。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-03-20
    • 2014-06-01
    • 2021-06-24
    • 1970-01-01
    • 2015-08-24
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多