![](/img/trans.png)
[英]how to estimate the (power of a signal at a given frequency) vs. time in python
[英]Python Frequency vs. Time Graph
我正在嘗試使用Python獲取.wav文件的頻率與時間的關系圖。 目前,我有一些代碼可以顯示幅度與時間以及頻率與功率(dB)的關系。 我嘗試使用頻率與功率圖的代碼來繪制頻率與時間的關系,但未成功。 我知道頻率數據是對稱的,這意味着與時間數據相比,我有1/2的數據點。 我可以通過保留重復的頻率數據來對它們進行繪制,但是我懷疑這是否真正產生了頻率與時間的精確表示。
我認為該方法將涉及對數據段使用短時傅立葉變換,然后繪制結果。 就是說,我已經找到了一些與此功能類似的代碼,但是我很難理解代碼正在發生什么,並且很難做出有意義的調整以幫助我實現目標。
總而言之,我希望有人能提供一些示例代碼或一種在Python中創建.wav文件的頻率與時間圖的方法。 萬分感謝! 請讓我知道是否可以發布到目前為止一直在使用的代碼。
#Import the required functions
from scipy.io.wavfile import read
from scipy.fftpack import fft, fftfreq, fftshift
from scipy.signal import get_window
from math import ceil
from pylab import figure, imshow, clf, gray, xlabel, ylabel
# Read in a wav file
# returns sample rate (samples / sec) and data
rate, data = read('waveTest.wav')
data = data[:,0]
# Define the sample spacing and window size.
dT = 1.0/rate
T_window = 50e-3
N_window = int(T_window * rate)
N_data = len(data)
# 1. Get the window profile
window = get_window('hamming', N_window)
# 2. Set up the FFT
result = []
start = 0
while (start < N_data - N_window):
end = start + N_window
result.append(fftshift(fft(window*data[start:end])))
start = end
result.append(fftshift(fft(window*data[-N_window:])))
result = array(result,result[0].dtype)
# Display results
freqscale = fftshift(fftfreq(N_window,dT))[150:-150]/1e3
figure(1)
clf()
s.imshow(abs(result[:,150:-150]), extent=(5,-5,(N_data*dT-T_window/2.0),T_window/2.0)) #19.04, -19.04, 6.41, 0.025
s.xlabel('Frequency (kHz)')
s.ylabel('Time (sec.)')
s.show()
根據要求,上面是我要開始工作的代碼。 我實際上似乎工作正常,但是我有兩個問題。
1)abs(result [:,150:-150])到底是什么? 我意識到他正在使用傅立葉變換的絕對值(以便刪除復雜分量?)。 這是頻率嗎?
2)我該如何交換數據,使X軸上的時間與Y軸上的頻率一致?
3)圖像如何知道哪個頻率對應哪個時間? 如果我理解正確,那么擴展區將采用最后兩個參數,即文件的時間長度和文件應執行的步驟?
4)是否可以在圖表中而不是圖像上繪制數據圖形?
我希望這些問題不是太多,也不是太具體。 再次感謝您提供的任何幫助!
1) result[:,150:-150]
給出一個numpy.array
其中包含所有行(每行對應於一個由fft計算的頻率)和從150
到number of columns - 150
150
number of columns - 150
。 每列對應於時間。 是的,對於給定的頻率, abs
取絕對值,該絕對值大致對應於信號的頻率。
2)在abs(result[:,150:-150])
,需要轉置矩陣,如下所示: abs(result[:,150:-150]).transpose()
。
3)范圍參數指定最終圖中的范圍。 由於每一列都對應於特定的時間點,因此這是一個簡單的映射。
4)您獲得的數據是給定時間給定頻率對信號的貢獻(給定一個時間窗口,因為特定點的頻率沒有意義)。 它本質上是2D數據。 您可以嘗試找到給定時間的主導頻率,然后將其繪制為簡單函數。
同樣,您的代碼不起作用。 也許您錯過了程序其余部分的一些變量定義和導入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.