如何让python加载一个大的(2小时)wav文件并将其内容转换为时频数组?

时间:2012-01-17 17:55:17

标签: python audio fft amplitude

我想用数组[5000] [440]访问数组,这意味着从开始和440hz开始5000毫秒,它会给我一个频率在这个位置的振幅值。

我在这里找不到类似的东西,如果有,请指出我。

3 个答案:

答案 0 :(得分:2)

你基本上想要spectrogram。为了帮助您入门,请以小块的形式浏览您的声音文件,其中每个块是1/10秒,并对每个块进行FFT。 (然后,当然,要查找5000ms和440Hz,请转到相应块的FFT。)

答案 1 :(得分:0)

你在一些误解下运作。

您无法在特定时间点获得wave的频率。您需要选择一个时间窗口,包括感兴趣点之前和之后的许多点。您包含的点越多,您在频率分解中的分辨率就越高。您需要在这些点上运行某种窗口函数,然后对它们进行FFT。

一旦得到FFT的结果,数字将对应于频率,但它不会是一个简单的关系。您无法控制与每个输出相对应的频率,这已经取决于信号的采样频率和样本数量。我担心我手头没有转换公式。每个频率都有两个分量,一个是实数和一个虚数,幅度为sqrt(r**2+i**2)

答案 2 :(得分:0)

您可以在飞行中转换时间和频率。您必须使用__getitem__lru_cache来存储一些值以供进一步使用。

假设傅立叶就是这样的

class Fourier():
   def __init__(self,a=10):
      self.a=a
   def __getitem__(self, index): 
      #this is function that calculates and returns value of my_furier
      return self.a+index

t=Fourier()
print(t[12.4])

您可以使用同样的方法来访问傅立叶的时间。因此,您可以创建新的时间对象,使您可以选择任何有效时间并返回该时间或使用某种插值来返回不在表中的值。

如果您无法将所有值存储在ram中,则可以使用标准库中的shelve模块来存储和访问磁盘中的项目,如果需要,可以在其上应用接口whit插值。