普通网友 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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵