首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中使用heapq函数‘heapq’查找FFT的峰值及其对应的频率

在python中使用heapq函数‘heapq’查找FFT的峰值及其对应的频率
EN

Stack Overflow用户
提问于 2013-06-04 01:36:37
回答 2查看 271关注 0票数 1

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

代码语言:javascript
运行
复制
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])

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

代码语言:javascript
运行
复制
print heapq.nlargest(2, frq, key=lambda i: Y[i])
IndexError: index 500 is out of bounds for axis 0 with size 50
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-04 01:51:31

下面是一种方法,它将给出3个对应于最高元组的元组

代码语言:javascript
运行
复制
from itertools import izip
print heapq.nlargest(3, izip(frq, 20*np.log10(abs(Y))), key=lambda x: x[1])

您也可以将Y放在第一位

代码语言:javascript
运行
复制
print heapq.nlargest(3, izip(20*np.log10(abs(Y)), frq))
票数 2
EN

Stack Overflow用户

发布于 2013-06-04 03:44:23

numpythonic这样做的方法是完全跳过heapq,像这样:

代码语言:javascript
运行
复制
idx = np.argsort(Y)[::-1][:3]
y_top_3 = 20*np.log10(Y[idx])
f_top_3 = frq[idx]

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

代码语言:javascript
运行
复制
top_3 = np.vstack(f_top_3, y_top_3).T
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16902557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档