Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python频率与时间图_Python_Time_Graph_Wav_Frequency - Fatal编程技术网

Python频率与时间图

Python频率与时间图,python,time,graph,wav,frequency,Python,Time,Graph,Wav,Frequency,我正在尝试使用Python获取.wav文件的频率与时间关系图。目前,我有一个代码,可以绘制振幅与时间以及频率与功率(dB)的关系图。我尝试使用频率与功率图的代码来绘制频率与时间,但没有成功。我知道频率数据是对称的,这意味着与时间数据相比,我有1/2的数据点。我可以通过保留重复的频率数据来绘制它们,但我怀疑这是否真的能准确地表示频率与时间的关系 我感觉这种方法将涉及对数据段使用短时傅里叶变换,然后绘制结果。这就是说,我发现一些代码做了类似的事情,但我很难理解代码发生了什么,并做出任何有意义的调整来

我正在尝试使用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()
#导入所需的函数
从scipy.io.wavfile导入读取
从scipy.fftpack导入fft、fftfreq、fftshift
从scipy.signal导入获取窗口
从数学导入单元
来自pylab导入图、imshow、clf、灰色、xlabel、ylabel
#读取wav文件
#返回采样率(采样/秒)和数据
速率,数据=读取('waveTest.wav')
数据=数据[:,0]
#定义采样间距和窗口大小。
dT=1.0/费率
T_窗口=50e-3
N_window=int(T_window*rate)
N_data=len(数据)
# 1. 获取窗口配置文件
窗口=获取窗口('hamming',N\u窗口)
# 2. 设置FFT
结果=[]
开始=0
同时(启动
根据要求,以上是我正在努力工作的代码。事实上,我似乎工作得很好,但我有几个问题

1) 什么是abs(结果[:,150:-150])?我意识到他是在取傅里叶变换的绝对值(为了去除复分量?)。这就是频率吗

2) 如何交换数据,使时间在X轴上,频率在Y轴上

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

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

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

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

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

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

4) 您得到的数据是给定频率在给定时间(给定时间窗,因为特定点的频率没有意义)对信号的贡献。它本质上是一个二维数据。你可以试着找出给定时间的主导频率,然后把它画成一个简单的函数


另外,您的代码本身也不起作用。可能您错过了一些变量定义和从其他程序导入的内容。

请提供您希望修复的代码。请在上面发布,谢谢!