2013-06-03 18 views
1

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

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 
+0

是你确定你的意思不是这样的:'nlargest(3,enumerate(frq),key = lambda i,_:Y [i])' – mgilson

回答

2

下面是一个方法这将使对应最高

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

你3元组也可以只是把在Y第一

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

这很好,现在我可以返回一个数组,来自我的FFt函数的FFT信息。谢谢! –

3

这样做会完全跳过heapq去somethinkg这样的numpythonic方式:如果你想获得iterables的迭代

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