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

如何让python加载一个大的(2小时)wave文件,并将其内容转换为一个时频数组?,python,audio,fft,amplitude,Python,Audio,Fft,Amplitude,我想用数组[5000][440]之类的东西来访问数组,意思是距离起始点5000ms和440hz,它会给我这个位置的频率振幅值 我在这里找不到这样的东西,如果有的话,请给我指一下。你基本上想要一个。为了让你开始,把你的声音文件分成小块,每一块都是,比如说,十分之一秒,然后对每一块进行FFT。然后,当然,要查找5000ms和440Hz,请转到相应块的FFT。您在一些误解下操作 你无法得到特定时间点的波的频率。您需要选择一个时间窗口,包括兴趣点前后的许多点。包含的点数越多,频率分解的分辨率就越高。您需

我想用数组[5000][440]之类的东西来访问数组,意思是距离起始点5000ms和440hz,它会给我这个位置的频率振幅值


我在这里找不到这样的东西,如果有的话,请给我指一下。

你基本上想要一个。为了让你开始,把你的声音文件分成小块,每一块都是,比如说,十分之一秒,然后对每一块进行FFT。然后,当然,要查找5000ms和440Hz,请转到相应块的FFT。

您在一些误解下操作

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


一旦得到FFT的结果,数字将对应于频率,但这不是一个简单的关系。您无法控制与每个输出对应的频率,该频率已由信号的采样频率与采样数组合确定。恐怕我手头没有换算公式。每个频率将有两个分量,一个实部和一个虚部,振幅将为sqrtr**2+i**2。

您可以动态转换时间和频率。您必须使用uuu getitem_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

比方说傅立叶是这样的

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中,您可以使用标准库中的搁置模块来存储和访问磁盘中的项目,如果需要,您可以在其上应用带有插值的接口。

我认为这可以让您实现大部分功能?嗯,不幸的是还没有。我错过了他们提供的东西和我想要的东西的链接。例如,第一个示例获得0.2744069538+0.90830207362j*exp2 pi it*0.263687742847。这是什么意思?要完成gravitron发布的内容:。有了这两种资源,您应该能够做您想做的事情。@LionelBarret您的链接对我有多大帮助?sqrtr2+i2在python代码中是什么意思?你在谈论什么?最好的,richart。@RichartBremer,是的,这正是我的意思——复数的绝对值。好吧,那么,你的回答对我帮助很大。我的下一个目标是使用我得到的结果进行语音检测。你知道有没有一种行之有效的方法可以解决这个问题?@RichartBremer,语音检测比频率检测复杂得多。恐怕我对这件事完全不了解。实际上我想探测声音。但首先我需要找到一些模式。如果有语音检测,我可以跳过。你说的语音检测是什么意思?你的意思是识别什么时候有声音,什么时候有背景噪音?是的,这就是我的意思。语音检测,而不是识别。仅检测。这可能不太难,但完全取决于背景,即所有非声音的东西。如果背景是相对安静的,那么很容易,当然,只要看看振幅;如果是噪声,在每个FFT中寻找像加宽峰或谐波结构这样的结构。并不是所有的音素都很容易识别为语音sh、t等,但元音和其他可能不会太糟糕;当然,你的时间片通常会包括混音,但总的来说这似乎是可能的。首先绘制光谱图,以可视化信号与背景。顺便说一句,matplotlib有一个称为specgram的光谱图函数。这是一个容易开始的地方。顺便说一句,人们通常认为他们只需要计算,而不用费心先把事情规划出来。这对这样的问题根本不起作用。从情节开始。