繁体   English   中英

Python随时间查找音频和振幅

[英]Python find audio frequency and amplitude over time

这是我想做的。 我想在.wav文件的每个1ms处找到.wav文件的音频和幅度,并将其保存到文件中。 我已经绘制了频率与幅度的图表,并且随着时间的推移绘制了幅度,但我无法计算频率超时。 我的最终目标是能够读取文件并使用它们调整变量和频率以触发正在使用的变量,这似乎是最简单的部分。 我一直在使用numpy,audiolab,matplotlib等...使用FFT,但我只是想不出这个,任何帮助表示赞赏! 谢谢!

使用具有重叠窗口的STFT来估计频谱图。 为了省去自己滚动的麻烦,可以使用Matplotlib的mlab的specgram 方法 使用一个足够小的窗口是很重要的,音频大约是静止的,缓冲区大小应该是2的幂,以有效地使用常见的基数-2 fft。 512个样本(48 ksps时约10.67 ms;或每个bin 93.75 Hz)就足够了。 对于48 ksps的采样率,重叠464个样本以评估每1 ms的滑动窗口(即,移位48个样本)。

编辑:

这是一个在8秒信号上使用mlab.specgram的示例,该信号从2 kHz到16 kHz每秒有1个音调。 注意瞬态响应。 我在4秒内放大了以更详细地显示响应。 频率精确地移动4秒,但是瞬态通过需要缓冲长度(512个样本;大约+/- 5 ms)。 这说明了当非平稳过渡通过缓冲区时由非平稳过渡引起的光谱/时间模糊。 此外,您可以看到,即使信号静止,也会出现因数据加窗而导致频谱泄漏的问题。 汉明窗函数用于最小化泄漏的旁瓣,但这也扩大了主瓣。

频谱

import numpy as np
from matplotlib import mlab, pyplot

#Python 2.x:
#from __future__ import division

Fs = 48000
N = 512
f = np.arange(1, 9) * 2000
t = np.arange(8 * Fs) / Fs 
x = np.empty(t.shape)
for i in range(8):
    x[i*Fs:(i+1)*Fs] = np.cos(2*np.pi * f[i] * t[i*Fs:(i+1)*Fs])

w = np.hamming(N)
ov = N - Fs // 1000 # e.g. 512 - 48000 // 1000 == 464
Pxx, freqs, bins = mlab.specgram(x, NFFT=N, Fs=Fs, window=w, 
                                 noverlap=ov)

#plot the spectrogram in dB

Pxx_dB = np.log10(Pxx)
pyplot.subplots_adjust(hspace=0.4)

pyplot.subplot(211)
ex1 = bins[0], bins[-1], freqs[0], freqs[-1]
pyplot.imshow(np.flipud(Pxx_dB), extent=ex1)
pyplot.axis('auto')
pyplot.axis(ex1)
pyplot.xlabel('time (s)')
pyplot.ylabel('freq (Hz)')

#zoom in at t=4s to show transient

pyplot.subplot(212)
n1, n2 = int(3.991/8*len(bins)), int(4.009/8*len(bins))
ex2 = bins[n1], bins[n2], freqs[0], freqs[-1]
pyplot.imshow(np.flipud(Pxx_dB[:,n1:n2]), extent=ex2)
pyplot.axis('auto')
pyplot.axis(ex2)
pyplot.xlabel('time (s)')
pyplot.ylabel('freq (Hz)')

pyplot.show()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM