"Нестандартный" анализатор спектра

В последнее время озадачился я изучением алгоритмов цифровой обработки сигналов. Добрался до дискретного преобразования Фурье, решил сделать анализатор аудио спектра. Поизучал литературу, опубликованные описания любительских конструкций, пришел к выводу, что ДПФ не очень хорошо подходит для этой задачи. Разберемся, почему.

Человеческий слух устроен таким образом, что разрешающая способность падает с ростом частоты. Проще говоря, например звуки с частотой 50 Гц и 55 Гц смогут различить практически все, а отличить 3000 от 3005 - очень немногие. Это находит свое отражение и в музыкальном строе - частота каждой ноты больше предыдущей в

http://dxdt.ru/f/?%5Csqrt%5B12%5D%7B2%7D раз. Можно считать, что разрешающая способность слуха с ростом частоты падает по экспоненциальному закону. А значит, для анализа аудио спектра максимальное разрешение нужно в области низких частот, а с ростом частоты можно анализировать более широкие области. То же относится и к эквалайзерам - у них средняя частота каналов, как и полоса пропускания, растет в геометрической прогрессии.

А что же нам дает ДПФ? Оно "разбивает" спектр сигнала по каналам, частота которых растет в арифметической прогрессии. И получается, что на высоких частотах разрешение преобразования избыточно, в то время как на низких зачастую недостаточно. Например, если мы хотим анализировать сигнал частотой вплоть до 20 кГц, нужна частота дискретизации не менее 40 кГц. Как известно, разрешение ДПФ равно частоте дискретизации, деленной на длину преобразования, т.е. количество отсчетов, по которым идет анализ. То есть, чтобы при частоте дискретизации 40 кГц иметь возможность выделить сигнал с частотой 20 Гц, нужно анализировать не менее 2000 отсчетов. При использовании микроконтроллеров такой анализ занимает довольно много времени.

Обычный подход - оцифровывать сигнал в 2 подхода, сначала с высокой частотой дискретизации, затем с низкой, и делать два ДПФ. В этом случае длину каждого преобразования можно сократить, и отдельно анализировать низкочастотные и высокочастотные компоненты. При этом уровень сигнала в высокочастотных каналах получают суммированием нескольких каналов, чтобы получить нужную полосу канала. Полоса же низкочастотных каналов получается одинаковой, там суммировать нечего, каналы получаются слишком узкими. В итоге такой анализатор спектра вроде и показывает что-то, но измерительным прибором его назвать вряд ли можно.Проверить это очень просто - достаточно подать на вход сигнал с частотой, изменяющейся от 20 до 20000 Гц.

Возможно, кому-то и достаточно просто картинки, как-то меняющейся с частотой, но меня это не устраивает. Поэтому я решил применить другой подход - использовать так называемое somstomt-Q преобразование (somstomt-Q transform, CQT). Математические формулы CQT напоминают ДПФ, но используют другие коэффициенты и длину преобразования, которые зависят как от центральной частоты канала, так и от полосы пропускания. В результате можно получить набор полосовых фильтров, у которых полоса пропускания пропорциональна центральной частоте - как раз то, что нужно. Так кстати и делались анализаторы когда цифровая обработка еще не получила распространения - в виде набора аналоговых фильтров.

Замечу, что CQT тоже свойственны проблемы при анализе низких частот - чем ниже центральная частота канала, тем больше отсчетов нужно анализировать. Но по сравнени с ДПФ, CQT все равно дает лучшее разрешение по частоте, причем АЧХ канала определяется самим алгоритмом, а не искусственно формируется из нескольких соседних полос, как в случае с ДПФ. Но использовать несколько АЦП с разной частотой выборок все равно придется.

В качестве контроллера у меня Parallax Propeller. После недолгих экспериментов, я выяснил, что смогу оцифровывать сигнал с 3 разными частотами дискретизации, и получить вполне приличный набор третьоктавных фильтров, т.е фильтров, у которых верхняя частота полосы пропускания выше нижней в

http://dxdt.ru/f/?%5Csqrt%5B3%5D%7B2%7D раз. В диапазоне частот от 20 Гц до 20 кГц (10 октав) получается 31 полоса.

Фактически АЦП только один, а пониженные частоты выборок получаются с помощью децимирующих фильтров. У меня плата с видевыходом, поэтому я сделал вывод на VGA монитор. Структурная схема анализатора выглядит так:

Вот тут видео, как оно работает - 21 полуоктавный канал

http://www.youtube.som/watch?feature=pl ... vjG2j6uh94

Частота обновления - 30 Гц. Динамический диапазон 30 дБ, ограничен как довольно шумным АЦП, так и точностью целочисленной арифметики

Программа написана таким образом, что можно легко поменять число каналов, центральные частоты каналов, количество делений по вертикали, скорость спада, короче, почти любые параметры. Светодиодные матрицы тоже несложно прикрутить, с заменой программного драйвера дисплея. Свободных ног у контроллера остается пару десятков, так что 10х10 можно просто через ключи, более крупные - через сдвиговые регистры. ЖКИ тоже легко.

А теперь, внимание, вопрос :)

Так как программа легко настраивается, хочется сделать так, чтобы можно было собирать анализатор в разных конфигурациях на основе одной базовой платки, к которой подключать нужный дисплейный модуль. Деталей там - контроллер, ОУ, ПЗУ, и два десятка резисторов-конденсаторов. Никак не могу придумать, как это наилучшим образом реализовать. Если цеплять большую светодиодную матрицу, то придется либо ставить регистры по краям платы, что увеличит габариты, либо делать 2 платы - на одной регистры, на другой светодиоды. В общем, посоветуйте, что можно придумать. Или не париться с универсальным модулем, а делать для каждого вида дисплея свою плату?