Python查找随时间变化的音频和振幅

Python查找随时间变化的音频和振幅,python,frequency,audio-processing,Python,Frequency,Audio Processing,这是我想做的。我想找到音频频率和振幅的.wav文件在每说1毫秒的.wav文件,并保存到一个文件。我已经画出了频率和振幅的关系图,也画出了振幅随时间的变化图,但我无法计算出频率随时间的变化。我的最终目标是能够读取文件并使用它们来调整变量和频率,以触发正在使用的变量,这似乎是最简单的部分。我一直在使用numpy、audiolab、matplotlib等。。。使用FFT的,但我只是不能弄明白这一点,任何帮助是感激的!谢谢大家! 使用具有重叠窗口的STFT来估计光谱图。为了省去自己滚动的麻烦,可以使用M

这是我想做的。我想找到音频频率和振幅的.wav文件在每说1毫秒的.wav文件,并保存到一个文件。我已经画出了频率和振幅的关系图,也画出了振幅随时间的变化图,但我无法计算出频率随时间的变化。我的最终目标是能够读取文件并使用它们来调整变量和频率,以触发正在使用的变量,这似乎是最简单的部分。我一直在使用numpy、audiolab、matplotlib等。。。使用FFT的,但我只是不能弄明白这一点,任何帮助是感激的!谢谢大家!

使用具有重叠窗口的STFT来估计光谱图。为了省去自己滚动的麻烦,可以使用Matplotlib的mlab。重要的是要使用一个足够小的窗口,对于该窗口,音频几乎是静止的,并且缓冲区大小应该是2的幂,以便有效地使用公共基2 fft。512个样品(48 ksps时约10.67 ms;或每个料仓93.75 Hz)应足够。对于48 ksps的采样率,每1ms重叠464个样本以评估滑动窗口(即移动48个样本)

编辑:

下面是一个示例,它在8秒信号上使用
mlab.specgram
,该信号从2 kHz到16 kHz每秒有1个音调。注意瞬态时的响应。我放大了4秒,以更详细地显示响应。频率精确移动4秒,但需要缓冲区长度(512个采样;约+/-5 ms)才能通过瞬态。这说明了非平稳跃迁通过缓冲器时引起的光谱/时间涂抹。此外,您可以看到,即使在信号静止的情况下,也存在因数据窗口化而导致的频谱泄漏问题。使用了Hamming来最小化泄漏的副瓣,但这也会扩大主瓣

将numpy导入为np
从matplotlib导入mlab、pyplot
#Python2.x:
#来自未来进口部
Fs=48000
N=512
f=np.arange(1,9)*2000
t=np.arange(8*Fs)/Fs
x=np.空(t.形)
对于范围(8)中的i:
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#例如512-48000//1000==464
Pxx,freqs,bins=mlab.specgram(x,NFFT=N,Fs=Fs,window=w,
noverlap=ov)
#以分贝为单位绘制频谱图
Pxx_dB=np.log10(Pxx)
pyplot.子批次调整(hspace=0.4)
pyplot.子地块(211)
ex1=存储箱[0],存储箱[-1],频率[0],频率[-1]
pyplot.imshow(np.flipud(Pxx_dB),extent=ex1)
pyplot.axis('auto')
pyplot.axis(ex1)
pyplot.xlabel('time(s)'
pyplot.ylabel('频率(Hz)')
#在t=4s时放大以显示瞬态
pyplot.子地块(212)
n1,n2=int(3.991/8*len(箱)),int(4.009/8*len(箱))
ex2=存储箱[n1],存储箱[n2],频率[0],频率[-1]
pyplot.imshow(np.flipud(Pxx_dB[:,n1:n2]),extent=ex2)
pyplot.axis('auto')
pyplot.axis(ex2)
pyplot.xlabel('time(s)'
pyplot.ylabel('频率(Hz)')
pyplot.show()

声音文件在任何给定时间都不会只有一个“频率”,除非它只是一个纯正弦音调的记录。您可能需要做的是定期捕获功率谱并存储,或者可能对功率谱进行某种处理,例如识别最大的N个峰值并存储这些峰值。