Я пытаюсь выяснить, как (если это возможно) извлечь частотные компоненты произвольного аудиосэмпла (обычно музыки), как FFT, но в моем исследовании алгоритма FFT я узнаю, что он страдает некоторыми жесткие ограничения для этой цели.
Есть 3 проблемы, которые представляет БПФ:
Поскольку разрешение бункера FFT эквивалентно размеру вашего окна, для достижения довольно разумной точности (скажем, 1 Гц) вам необходимо неоправданно длинное окно (скажем, 1 секунда). Это означает, что вы не можете быстро обнаружить переходные процессы или новые частоты. Это также означает, что проблема не может быть решена с более быстрым ЦП и более высокой частотой дискретизации - ограничение неразрывно связано со временем.
Люди воспринимают частоту логарифмически, но ячейки БПФ расположены линейно. Например, разница в 20 Гц на низком уровне нашего слуха огромна , тогда как разница в 20 Гц на верхнем уровне незаметна. Таким образом, чтобы получить точность, которая нам нужна на низких частотах, мы должны вычислить гораздо больше, чем нам требуется на высоких частотах.
Некоторые из этих проблем могут быть решены путем интерполяции между бинами FFT. Это может работать для большого количества музыкального звука, потому что частоты часто будут располагаться довольно далеко друг от друга, и поэтому не более 1 частоты попадет в пару бинов. Но это не всегда так, особенно для негармоничных звуков, таких как ударные инструменты. Так что интерполяция - это просто догадки.
Из того, что я понимаю в алгоритме DFT / FFT, выходные данные (амплитуды бина) фактически являются корреляцией синуса / косинуса на частоте каждого бина. Меня поражает, что если бы алгоритм мог быть перепроектирован так, чтобы частоты бина располагались нелинейно (т.е. мы коррелировали другой набор синусов / косинусов), то мы могли бы достичь психоакустически равного разрешения на всех частотах. Возможно ли это, или это несбыточная мечта, основанная на моем неполном понимании математики?
Я думаю, что я мог бы также решить проблему с помощью грубой силы, сопоставляя синусы / косинусы на каждой частоте, которая меня интересует. Я не слишком разбираюсь в математике здесь. Это возможно? Какого рода эффективность? Решит ли это мою проблему?
Есть ли другой способ добиться более точного частотного разложения сигнала в реальном времени? Эффективность процессора - это проблема, но не главная проблема - меня частично интересует, можно ли вообще это сделать теоретически. Однако то, что возможно в реальном времени на современном настольном компьютере, было бы идеальным.