使用heapq函数'nlargest'在python中查找FFT的峰值及其相应的频率

时间:2013-06-03 17:36:37

标签: python python-2.7 numpy scipy fft

我正在使用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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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))