Краткий экскурс в теорию приближения спектра на водопаде.
В случае отображения водопада большой ширины, например 48, 96кГц и даже больше, различить на экране узкополосные сигналы вроде телеграфа становится почти невозможным, и теряется весь смысл и удобство использования панорамы спектра.
Для этого необходимо реализовать приближение, чтобы отображать только часть спектра, но в большем разрешении. Обычно увеличение делают кратным двум (х2 х4 х8 х16 х32). Какие же варианты решения задачи у нас есть?
Допустим что для обзора полосы в 96кГц мы делаем 256 выборок и по ним считаем FFT. Следовательно, каждый пиксель будет отражать 375Гц сигнала, что совершенно неприемлемо.
Решение в лоб — делать большее количество выборок, например 2048, но тут нас ждёт разочарование:
1. накапливать семплы придётся дольше, или накапливать их с наложением.
2. размер оперативной памяти, требуемой для хранения и расчёта FFT сильно возрастает
3. процессору требуется сильно больше времени для расчёта FFT
4. в итоге часть расчётов будет проведена зря — мы будем отображать только небольшую часть интересующего нас спектра.
Чтобы избавиться от этих проблем, поступим следующим образом:
Первым делом удалим из спектра не интересующие нас частоты используя ФНЧ/LPF фильтр. Например, при полосе в 96кГц, и увеличении х8, мы должны увидеть полосу в 12кГц (-6;+6), значит применим фильтр, срезающий всё выше 6 кгц. Для этого лучше всего использовать Biquad фильтр, т.к. он не требует больших вычислительных мощностей.
Далее, проведём децимацию во столько раз, во сколько мы приближаем спектр.
Теперь в наших выборках содержится только информация о интересующей нас части спектра, и мы готовы проводить FFT. Но, после проведения децимации, количество выборок кратно сократилось, и теперь у нас недостаточно семплов для проведения FFT. Для решения реализуем буфер, в котором будем накапливать несколько партий выборок, удаляя самые старые и добавляя свежие в очередь.
После этого мы можем проводить вычисления с нужным нам приближением, на прежней скорости и с минимумом процессорных затрат.
Исходные коды тут.