簡體   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