峰值频率python的时间戳

Posted

技术标签:

【中文标题】峰值频率python的时间戳【英文标题】:timestamp of peak frequency python 【发布时间】:2018-10-10 14:38:33 【问题描述】:

我已使用此代码how to extract frequency associated with fft values in python 并添加了一个 firwin 滤波器来检测短高频信号。该信号长 1 秒,随机出现在 x 秒的 wav 音频文件中。我的代码如下所示:

from scipy import signal
from scipy.io import wavfile
from scipy.fftpack import fft, ifft,fftfreq
import matplotlib.pyplot as plt
import wave 
import numpy as np
import sys
import struct

frate,data = wavfile.read('SoundPeep.wav')
#print(frate)
b = signal.firwin(101, cutoff=900, fs= frate, pass_zero=False)
data = signal.lfilter(b, [1.0], data)

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

# Find the peak in the coefficients
idx = np.argmax(np.abs(w))
winner = np.argwhere(np.abs(w) == np.amax(np.abs(w)))

freq = freqs[idx]
freq_in_hertz = abs(freq * frate)
print("HZ")
print(freq_in_hertz)
occurence = idx/frate
print(occurence)

该代码在检测 HZ 峰值频率方面效果很好。我的问题是我想计算音频文件中高频信号的开始位置。我认为可以简单地通过将索引(idx)除以录制的帧速率来完成,但这似乎不起作用。

【问题讨论】:

如你所见,idx 对应啁啾的频率,与它发生的时间无关(即,在音频文件中的位置)。找到时间的一种可能方法是使用相同频率的啁啾进行自相关,或者使用 FFT 使用更高级的数学方法。 但是idx是FFT最大值的索引,但这与原始数据没有相关性还是? len(w) 等于 len(data) 【参考方案1】:

您可以使用短时傅立叶变换制作声波图,以查看频率如何随时间变化。 stft 返回 3 个值:时间戳、幅度和频率。如果幅度不相关,您可以从那里使用峰值检测。

【讨论】:

我试过了,但是频率数组和时间数组的大小不相等,并且无论声音文件输入如何,频率数组都包含相同的值 我找到了另一种方法,但谢谢你的回答:)

以上是关于峰值频率python的时间戳的主要内容,如果未能解决你的问题,请参考以下文章

Mongo时间戳转日期以及日期分组

python如何表示0~10秒的时间戳,频率为10Hz?

熊猫桶时间戳到 TimeGrouper 频率组

Python工具箱系列(三十三)

Python 之 Pandas 生成时间戳范围Pandas 的时期函数 Period() 和时间序列 - 重采样 resample

Graphite 组时间戳事件(按周)