首先,一些背景知识: STFT 是我所知道的用于将(音乐或其他)信号分析为其分量频率的最佳通用工具。对于许多用途,STFT 工作正常,但有两个相关问题使其不适合音乐用途 - 1)频率箱是均匀间隔的,不像人类听力系统那样以对数方式工作,以及 2)由数学由于 DFT/FFT 的性质,您需要捕获长时间的音频才能在低频下获得不错的频率分辨率。
例如,为了能够准确区分钢琴低音范围内的半音,您需要大约 1hz 的分辨率,这意味着您需要捕获 1 秒的音频。对于音乐来说,这是一个完全不能接受的时间分辨率。
有多种方法可以增强 FFT 的输出,包括 a) 零填充以创建更大的窗口,或 b) 重叠分析段,或 c) 使用相位魔术来检测频率变化。这些很有用,但仍然存在问题——更多的计算开销,虽然 (a) 可以在给定的时间分辨率下增加明显的频率分辨率,但对于两个频率碰巧落入同一个 bin 的情况没有帮助。
所以... 纯粹出于兴趣,我一直在研究其他可能性。CWT 和 DWT 起初看起来很有前途,但 CWT 的计算速度非常慢,而且 DWT 只有倍频程频率分辨率。(对吗?)我还考虑过以不同的时间/频率分辨率进行多个 FFT 以更好地覆盖空间,或者使用缩放 FFT 等解决方案。这些都有助于解决不同的具体问题,但它们都没有真正解决根本问题:我们没有一种快速 (N log N) 的方法来以良好的时间和频率分辨率分析信号中的频率。
很多人在这一点上指向海森堡不确定性原理,这意味着在数学上根本不可能真正实现这一点。我很确定这完全是错误的:当然,不确定性原理是有效的,但我们甚至还没有接近它。这里的问题是 DFT/FFT 只能分析基频整数倍的频率。但是,如果我们愿意使用(计算速度较慢的)正弦扫描或连续小波变换,其他频率肯定会以良好的时间分辨率进行分析。直到FFT 不再有用很久之后,不确定性原理才会引起问题。
所以,我的解决方案。我想让你告诉我它是否以及在哪里是错误的:让我们将输入信号与选定频率的探针相量相关联。起初,这听起来像是一个 N^2 算法(每个频率的相关性的 N 次操作,乘以频率数)。然而,关键点是,对于具有相同频率分辨率(低频)的 FFT 的等效对数频率分辨率,您只需要分析对数 N 个频率 - 因为在音乐信号中,高频分辨率对数不太重要.
所以,我们有一个这样工作的算法:
- 决定你的频率分辨率。现在让我们说八度音阶,尽管我想要在大多数应用程序中使用亚半音。
- 预加载一些带有探针相量的缓冲区,作为以该间隔间隔的频率——比如 16、32、64、128、256、512、1024hz,[...]。因为可以在更短的时间内检测到更高的频率,所以在更高的频率下需要更少的样本(= 更好的时间分辨率,以及更少的操作)。为此,让我们在每个频率上使用几个周期。
- 如果有意义的话,预先窗口化这些缓冲区。
- 将这些中的每一个与时间 t 处输入信号的足够长的段相关联(即,段和探头的分量乘法之和)。可能标准化这个值。
- 这种相关性的结果是在时间 t 处该频率的信号幅度。因此,结果与频率的表应该是您在所需对数分辨率(在这种情况下为八度音阶)的频谱。
据我所知,只要您的频率是对数间隔的,这将在您喜欢的任何频率分辨率下为您提供出色的时间分辨率(每个频率的几个周期),使用大约 N 次操作乘以 log N 频率 -正是你想要的音乐,也正是 STFT 的问题——因此,解决了 STFT(音乐信号)的问题,计算复杂度相当。
我错过了什么?这会起作用吗?有警告或陷阱吗?我的复杂性计算在数学上是否合理?
感觉有点像发明了一台永动机——它看起来应该可以工作,但我的直觉是我在掩盖一些重要的细节。