普通网友 2015-04-27 03:25 采纳率: 66.7%
浏览 18923
已采纳

python:对一个波形做傅里叶变换,能得到整个频谱,怎么提取其中的频率分量呢?

import wave
import struct
import numpy as np

if name == '__main__':
data_size = 40000
fname = "test.wav"
frate = 11025.0
wav_file = wave.open(fname, 'r')
data = wav_file.readframes(data_size)
wav_file.close()
data = struct.unpack('{n}h'.format(n=data_size), data)
data = np.array(data)

w = np.fft.fft(data)
freqs = np.fft.fftfreq(len(w))
print(freqs.min(), freqs.max())
# (-0.5, 0.499975)

# Find the peak in the coefficients
idx = np.argmax(np.abs(w))
freq = freqs[idx]
freq_in_hertz = abs(freq * frate)
print(freq_in_hertz)
# 439.8975

这个是对于单个data_size,frate已知的情况,真实情况是未知,且有多个频率的信号。求解。。。

  • 写回答

5条回答 默认 最新

  • 普通网友 2015-04-29 02:06
    关注

    对于单个频率的波形,取频谱的峰值,np.argmax()可以取到下标值,根据freq=下标*N/fs,获得频率值, 对于含有多个频率的波形,我是做一个区分,判断频谱中
    振幅大于某个数,就为信号,小于某个数就为噪声。这样不准确,最好用信噪比判断,然后同样获取下标,获得频率值,相应还能得到幅度。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 跑hls xfopencv的例程standalone_hls_axi_example出的错误,csim没问题,c synthesis出的错误
  • ¥15 sqlserver update语句逐行生效
  • ¥15 mssql2000游标循环次数对不上
  • ¥20 Windows10系统命令行调用
  • ¥15 php环境如何实现国密SM2相关功能
  • ¥15 关于#单片机#的问题:K210 例程里面提示我iomem.h: No such file or directory
  • ¥15 LSPI算法的大问题
  • ¥15 java导出word 动态填充数据
  • ¥20 扑克的算牌公式及软件制作
  • ¥20 如何通过云图中RPG去计算云图上不同位置的值?