如何让 python 加载一个大(2 小时)wav 文件并将其内容转换为时频数组?
Posted
技术标签:
【中文标题】如何让 python 加载一个大(2 小时)wav 文件并将其内容转换为时频数组?【英文标题】:How do I make python load a big(2hours) wave-file and convert it's contents into a time-frequency array? 【发布时间】:2012-01-17 17:55:17 【问题描述】:我想用类似 array[5000][440] 的东西来访问数组,这意味着从开始的 5000 毫秒和 440 赫兹,它会给我一个在这个位置的频率幅度值。
我在这里找不到类似的东西,如果有,请指出。
【问题讨论】:
我认为这可以让你大部分时间到达那里? ***.com/questions/3694918/… 好吧,不幸的是还没有。我错过了他们提供的东西和我想要的东西的链接。第一个样本让我例如“(0.27440469538 + 0.908302073062j)* exp(2 pi it * 0.263687742847)”。这是什么意思? 完成 gravitron 发布的内容:***.com/questions/2063284/…。有了这两个资源,你应该可以为所欲为。 @LionelBarret 你的链接对我有多大帮助? 【参考方案1】:你基本上想要一个spectrogram。为了让您开始,请以小块的形式浏览您的声音文件,其中每个块为 1/10 秒,然后对每个块进行 FFT。 (然后,当然,要查找 5000ms 和 440Hz,请转到相应块的 FFT。)
【讨论】:
其实我想检测语音。但首先我需要找到一些模式。如果有一些语音检测可用,我可以跳过。 “检测语音”是什么意思?您的意思是确定何时有声音与何时有背景噪音? 是的,我就是这个意思。语音检测,而不是识别。仅检测。 这可能不是太难,但它完全取决于背景(即所有不是声音的东西)。如果背景是相对安静的,那当然很简单,只看幅度;如果是噪声,请在每个 FFT 中寻找结构,例如加宽峰或谐波结构。并非所有音素都容易识别为语音(“sh”、“t”等),但元音和其他可能不会太糟糕;当然,您的时间片通常会包含混音,但总而言之,这似乎是可能的。首先绘制频谱图以可视化信号与背景。 顺便说一句,matplotlib 有一个名为“specgram”的频谱图函数。这是一个容易开始的地方。 (顺便说一句,人们通常认为他们只会计算而无需先将事情绘制出来。这从不适用于这样的问题。从绘图开始。)【参考方案2】:您的操作存在一些误解。
您无法获取特定时间点的波频率。您需要选择一个时间窗口,包括兴趣点之前和之后的许多点。您包含的点越多,您在频率细分中的分辨率就越高。您需要在这些点上运行某种窗口函数,然后对它们进行 FFT。
获得 FFT 的结果后,数字将与频率相对应,但不是简单的关系。您无法控制与每个输出相对应的频率,这已经由信号的采样频率和样本数量决定。恐怕我手头没有转换公式。每个频率都有两个分量,一个实部和一个虚部,幅度为sqrt(r**2+i**2)
。
【讨论】:
在 python 代码中 sqrt(r2+i2) 是什么意思?你在谈论upload.wikimedia.org/wikipedia/de/math/d/f/4/… 吗?最好的,理查特。 @RichardBremer,是的,这正是我的意思——复数的绝对值。 好吧,你的回答对我帮助很大。我的下一个目标是使用我得到的结果进行语音检测。您是否知道有一种行之有效的方法? @RichardBremer,语音检测比频率检测复杂得多。恐怕我在那个方面完全超出了我的深度。【参考方案3】:您可以即时转换时间和频率。您必须使用__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
模块来存储和访问磁盘中的项目,如果需要,您可以在其上应用插值接口。
【讨论】:
以上是关于如何让 python 加载一个大(2 小时)wav 文件并将其内容转换为时频数组?的主要内容,如果未能解决你的问题,请参考以下文章