![](/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.