繁体   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