Python频率与时间图

时间:2014-09-11 19:12:44

标签: python time graph wav frequency

我正在尝试使用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(结果[:,150:-150])?我意识到他正在采用傅立叶变换的绝对值(为了去除复杂的分量?)。这是频率吗?

2)如何交换数据以使X轴上的时间在Y轴上具有频率?

3)图像如何知道哪个频率对应于哪个时间?如果我理解正确,扩展区采用最后两个参数,即文件的长度和文件应该生成的步骤?

4)是否可以在图中绘制数据而不是图像?

我希望这些不是太多,也不是问题的具体内容。再次感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

1)result[:,150:-150]提供包含所有行的numpy.array(每行对应于fft计算的频率)和150number of columns - 150的列。每列对应时间。是的,abs取给定频率的绝对值,该频率大致对应于信号的频率。

2)在abs(result[:,150:-150])中,您需要转置矩阵,如下所示:abs(result[:,150:-150]).transpose()

3)范围参数指定最终图中的范围。由于每列对应于特定的时间点,因此它是一个简单的映射。

4)你得到的数据是给定时间给定频率对信号的贡献程度(给定一个时间窗口,因为特定点的频率没有意义)。它本质上是一个2D数据。您可以尝试在给定时间找到支配频率,然后将其绘制为一个简单的函数。

此外,您的代码不起作用。也许你已经错过了一些变量定义和从你们其他人的程序中导入。