我想用类似 array[5000][440] 的东西来访问数组,这意味着从开始的 5000 毫秒和 440 赫兹,它会给我一个在这个位置的频率幅度值。
我在这里找不到类似的东西,如果有,请指出它。
你基本上想要一个频谱图。为了让您开始,请以小块的形式浏览您的声音文件,其中每个块为 1/10 秒,然后对每个块进行 FFT。(然后,当然,要查找 5000ms 和 440Hz,请转到相应块的 FFT。)
你在几个误解下运作。
您无法在特定时间点获得波的频率。您需要选择一个时间窗口,包括兴趣点前后的许多点。您包含的点越多,您在频率细分中的分辨率就越高。您需要在这些点上运行某种窗口函数,然后对它们进行 FFT。
获得 FFT 的结果后,数字将对应于频率,但不是简单的关系。您无法控制与每个输出相对应的频率,这已经由信号的采样频率和样本数量决定。恐怕我手头没有转换公式。每个频率都有两个分量,一个实部和一个虚部,幅度为sqrt(r**2+i**2)
。
您可以即时转换时间和频率。您必须使用 __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
标准库中的模块来存储和访问磁盘中的项目,如果需要,您可以在其上应用接口插值。