簡體   English   中英

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計算的頻率)和從150number 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM