1

我想用类似 array[5000][440] 的东西来访问数组,这意味着从开始的 5000 毫秒和 440 赫兹,它会给我一个在这个位置的频率幅度值。

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

4

3 回答 3

2

你基本上想要一个频谱图。为了让您开始,请以小块的形式浏览您的声音文件,其中每个块为 1/10 秒,然后对每个块进行 FFT。(然后,当然,要查找 5000ms 和 440Hz,请转到相应块的 FFT。)

于 2012-01-17T22:51:53.123 回答
0

你在几个误解下运作。

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

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

于 2012-01-17T23:20:50.550 回答
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标准库中的模块来存储和访问磁盘中的项目,如果需要,您可以在其上应用接口插值。

于 2012-01-19T07:38:21.137 回答