в статье человек говорит "40-80, 80-120, 120-180, 180-300", откуда он знает, какие диапазоны?
Он не знал их - он придумал их.
Эти диапазоны имеют очень низкую частоту. Низкочастотные звуки, как правило, имеют самый длинный сустейн / затухание, поэтому у вас меньше шансов иметь проблемы с временным алиасингом при использовании более низких частот. Это важно в приложении, которое вы хотите реализовать. Звуки меняются со временем, и входные сэмплы могут быть с любым заданным смещением песни / звуков, и, скорее всего, не будут точно соответствовать смещениям вашего окна. Низкочастотные части звука все еще восприимчивы к этому, но гораздо меньше, чем высокочастотные части.
После того, как я получу БПФ (используя OouraFFT), у меня есть частотный спектр, тогда, как я понял, нужно взять контрольные точки, так как их взять?
OouraFFT написано на C, а не Objective-C. Можете ли вы дать ссылку на упаковку, которую вы используете?
Если вы используете эту обертку , мне кажется, что вам придется фильтровать данные на низких частотах заранее, и, возможно, изменить / дополнительно обработать результаты библиотеки, чтобы сделать именно то, что вы пытаетесь достичь. Или найдите другую библиотеку iPhone FFT, которая оборачивает более высокоуровневые концепции поверх FFT.
Эта библиотека вызывает OouraFFT rdst
и делает это таким образом, чтобы все сегменты распределялись равномерно (в значительной степени просто необработанные данные FFT, без болтовых понятий более высокого уровня). Если вы не выберете меньшие сегменты и не агрегируете их, вы не получите те конкретные сегменты, описанные в прочитанной статье.
Вместо этого вы можете попробовать просто использовать другой равномерно распределенный интервал выделения и получить что-то вроде 40-80, 80-120, 120-160, 160-200, 200-240, 240-280, 280-320
. Или вы можете использовать 40-60, 60-80
и т. Д. И комбинировать / усреднять ведра, когда закончите.
Чтобы получить нужные вам размеры ведра, вам нужно будет кое-что посчитать. Из readme этой библиотеки:
Допустим, ваш сигнал имеет частоту дискретизации 48 000 Гц, и вы вычисляете БПФ для фрагментов вашего сигнала длиной 1024 выборки. Затем OouraFFT.spectrumData имеет 1024/2 = 512 частот в нем, равномерно распределенных между 0 и 48 000/2 = 24 000.
Чем длиннее окно, тем больше ведер, но с большей вероятностью у вас будут временные проблемы. Таким образом, выберите размер окна, затем выполните низкочастотную фильтрацию входных данных и уменьшите частоту выборки, чтобы вы могли получить размеры сегментов (диапазоны частот), которые соответствуют вашим потребностям, и пропустить отфильтрованные данные.
Кстати, я не уверен насчет этой реализации, но Я читал здесь, что вы должны выбросить ведро с самой низкой частотой при использовании FFT . В этой статье есть аналогичное уведомление о том, что самое низкое ведро имеет только половину ширины .
Если вы действительно хотите получить точные результаты этого проекта, я предлагаю вам сгенерировать тестовые данные с этими конкретными частотами и периодами окна, чтобы вы могли убедиться, что данные вашего массива заполняются правильно, а ваши данные - нет. случайное перекос (ошибочные ошибки, неправильные расчеты окон и фильтров и т. д.). Иначе ваш успех будет зависеть от случайности, потому что вы не сможете диагностировать, где лежат какие-либо проблемы в вашем коде.