Реклама ⓘ
Главная » Световые эффекты
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Аудио анализатор спектра в реальном времени

В этом проекте аудио анализатор спектра в реальном времени реализуется с использованием 8-битного микроконтроллера PIC18F4550. Анализ спектра частот осуществляется оптимизированным 64-битным Быстрым Преобразованием Фурье (Fast Fourier Transformation, FFT, БПФ), написанном полностью на C. Выход с FFT отображается с помощью графического ЖК-дисплея 128x64 для визуализации звукового сигнала в реальном времени.

Анализатор спектра

Для того чтобы выполнять вычисления FFT над аудио сигналом, необходимо подготовить аудио данные для PIC18F4550. МК имеет несколько аналогово-цифровых преобразователя (АЦП), которые могут быть использованы для измерения напряжения от 0В до 5В с 10-битной точностью (0-1023). Типичный сигнал линейного аудио выхода, является аналоговой волной с амплитудой 2В относительно 0В (т.е. сигнал переменного тока в диапазоне от +1В до -1В), как показано на следующей осциллограмме (с вывода W2 демо платы):

Осциллограмма

На картинке показана полноразмерная синусоидальная волна 5000 Гц, генерируемая с помощью ПК. Если бы мы подавали этот сигнал непосредственно на PIC, мы имели бы очень низкий диапазон входного напряжения (0-0.5В), и могли бы сделать выборку только верхней части сигнала, что сделало бы БПФ неверным. 
Для того чтобы правильно сделать выборку сигнала, надо сделать две вещи. Во-первых, мы должны усилить сигнал, чтобы гарантировать, что мы можем максимально использовать диапазон 0-5В. Во-вторых, мы должны сдвинуть землю сигнала (0 вольт) на "виртуальную землю" 2.5В. Это позволит PIC сделать выборки и положительного, и отрицательного сигнала. Для этого на демо плате используется простой интегральный усилитель (LM386-1). Поскольку микросхема питается от источника питания 0В и 5В, она имеет удобный побочный эффект – смещение сигнала в середину необходимого диапазона. LM386-1 была использована т.к. это дешево и просто, однако вы можете использовать операционный усилитель с полным размахом входного и выходного сигнала для достижения этого с несколькими внешними элементами.

Следующая осциллограмма показывает сигнал с LM386-1 (для сигнала показанного выше), граничный диапазон напряжений установлен на 5 вольт (с контакта W3 демо платы):

Осциллограмма

Аппаратная часть смешивает линейный стерео вход, используя два резистора 10кОм, которые действуют как простой смеситель. Затем сигнал передается на LM386-1 через потенциометр 10кОм, который позволяет скорректировать сигнал. Далее выход с усилителя LM386-1 передается через простой RC фильтр, который обрезает сигнал примерно до 10 кГц. Затем полученный сигнал подается на контакт АЦП PIC18F4550. Фильтр 10 кГц действует как "сглаживающий" фильтр для БПФ, который не может правильно определить сигнал с частотой более чем 10 кГц. RC фильтр представляет собой очень простой тип фильтра (и очень неэффективный), но он был выбран, поскольку он легко изготавливается, и требует только 2 пассивных элемента. Обычно профессиональный анализатор спектра осуществляет сглаживание фильтром на 80% частоты Найквиста для БПФ (см. ниже), но, поскольку мы ограничены скоростью PIC, в этом проекте это невозможно сделать.

Демо плата также контролирует стандартный ЖК-дисплей с точечной матрицей 128x64, а также 3 светодиода (для тестирования преобразования звук-свет). Кроме того, есть 2 переключателя, позволяющие пользователю управлять выходом ЖК-дисплея в зависимости от того, что измеряется и как оно будет отображаться. Второе гнездо позволяет напрямую подать входной сигнал на другие аудио устройства, такие как наушники или колонки.

Вот принципиальная схема демо платы:

Принципиальная схема анализатора спектра

Плата является односторонней и используются только выводные компоненты для упрощения повторяемости. Я использовал PIC18F4550 для дополнительных выводов ввода/вывода, однако он может быть заменен на меньший PIC18F2550 который совместим по цоколевке. Схема достаточно проста для постройки на макетной плате, если вы хотите экспериментировать с трассировкой. Вот рисунок платы, который можно скачать ниже.

Печатная плата

Прошивка

Прошивка полностью написана на C и может быть скачана ниже. Прошивка делится на 4 части:

Выборки АЦП

АЦП делает выборки уровня напряжения на RA0 каждые 50 мкс. Это дает нам частоту дискретизации 20 кГц (20.000 раз в секунду). Для БПФ важно, чтобы выборки брались равномерно и аккуратно. Для этого есть небольшая задержка в цикле выборки, который калибруется с помощью осциллографа на контакте W4 демо платы. Суммарная скважность прямоугольного сигнала должна быть ровно 50 мкс. АЦП делает выборки с полным 10-битным разрешением, а затем сдвигается в сторону младших разрядов при помощи 512, чтобы установить виртуальную землю входного сигнала обратно в ноль. Это значит, что полученные выборки находятся в диапазоне от -512 до +512 именно так, как требуется математике БПФ.

Маршрутизация АЦП занимает немногим более 64x50 Us = 32 мс (3200 мкс) во время выполнения для каждого цикла.

64-битная БПФ

Подпрограмма БПФ была взята из примера, приведенного в интернете (ссылки на исходный код можно найти в исходном коде). Математика БПФ является сложной и я не претендую на полное её понимание! Код был уменьшен до минимально необходимых команд и портирован для PIC18F. PIC18F4550 имеет аппаратную функцию умножения 8x8 в ALU процессора, поэтому я также оптимизировал расчеты, чтобы компилятор правильно использовал возможности чипа.

То, что 18F имеет аппаратный умножитель 8x8, действительно являться ключом к расчету БПФ таким маломощным чипом в реальном времени. Скорость цикла имеет преимущество даже по сравнению с 64-битными вычислениями в массиве.

Расчет абсолютной величины

Выход из БПФ 32 'сложных' числа, которые состоят из действительной и мнимой части, представленными ​​двумя массивами (вы должны прочитать о БПФ в Google, если вы хотите узнать больше). Для того, чтобы показать результат в осмысленном виде, необходимо рассчитать абсолютную величину комплексного числа, что осуществляется с помощью расчета Пифагора для вычисления расстояния до комплексного числа от начала координат 0. Это включает в себя вычисление корня  из числа, что реализуется программным обеспечением очень быстро, используя целые SQRT() эквивалентны, поскольку любые операции с плавающей точкой будут слишком медленными.

Процедура расчета БПФ и абсолютной величины занимает примерно 70 мс (7000 мкс) для каждого цикла

Обновление ЖК-дисплея

ЖК-дисплей 128x64 должен обновлятья​​ как можно быстрее. Для этого я использовал очень простой алгоритм рисования диаграммы, который требует минимально возможного количества команд дисплею.

Два переключателя на плате позволяют пользователю переключаться между увеличением выхода x1 и x8 (так как в среднем частота музыки довольно низкая), а также между линейным выходом или логарифмическим выходом (на основе дБ). Это просто разные способы показа выхода в зависимости от того, хотите те ли вы точное представление об уровне частоты, или более приятный глазу выход .

Процедура обновления ЖК-дисплея занимает около 45 мс для каждого обновления.

Общая (средняя) скорость БПФ

Примерная скорость на дисплее анализатора спектра один кадр в 150 мс, в результате чего общая частота кадров около 6.5 кадров в секунду (или 10 кадров в секунду без ЖК-дисплея). Это можно легко улучшить сокращением необходимых блоков частот (что сократило бы отбор проб и время выполнения БПФ) или с помощью устройства отображения с более быстрым обновлением. Если вы хотели бы использовать БПФ для управления светодиодами светового устройства, можно легко сделать и то и то.

Блоки частот

Частота Найквиста в БПФ (самая высокая частота, которую он может обнаружить) составляет 10 кГц. 32 блока частот равномерно распределяются во всем диапазоне, однако, из-за работы подпрограммы БПФ, нельзя использовать нижние блоки. Это значит, что отображаемая частота для каждого блока выглядит следующим образом (в Гц):

  • 1 : 312.5 - 625
  • 2 : 625 - 937.5
  • 3 : 937.5 - 1250
  • 4 : 1250 - 1562.5
  • 5 : 1562.5 - 1875
  • 6 : 1875 - 2187.5
  • 7 : 2187.5 - 2500
  • 8 : 2500 - 2812.5
  • 9 : 2812.5 - 3125
  • 10 : 3125 - 3437.5
  • 11 : 3437.5 - 3750
  • 12 : 3750 - 4062.5
  • 13 : 4062.5 - 4375
  • 14 : 4375 - 4687.5
  • 15 : 4687.5 - 5000
  • 16 : 5000 - 5312.5
  • 17 : 5312.5 - 5625
  • 18 : 5625 - 5937.5
  • 19 : 5937.5 - 6250
  • 20 : 6250 - 6562.5
  • 21 : 6562.5 - 6875
  • 22 : 6875 - 7187.5
  • 23 : 7187.5 - 7500
  • 24 : 7500 - 7812.5
  • 25 : 7812.5 - 8125
  • 26 : 8125 - 8437.5
  • 27 : 8437.5 - 8750
  • 28 : 8750 - 9062.5
  • 29 : 9062.5 - 9375
  • 30 : 9375 - 9687.5
  • 31 : 9687.5 - 10000

Заключение

Я не сомневаюсь, что программное и аппаратное обеспечение может быть улучшено. Я не эксперт в БПФ, но я хотел бы услышать любые идеи о том, как ускорить этот процесс. Кроме того, сглаживающий фильтр на демо плате не так уж эффективен и может быть легко заменен на фильтр на основе ОУ. Я просто не хочу использовать больше, чем минимально необходимое для работы аппаратное обеспечение.

Также я хотел бы сказать отдельное спасибо моему хорошему другу Richard Stagg, без его математической настойчивости этот проект, наверное, никогда не был бы завершен!

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
U1 МК PIC 8-бит
PIC18F4550
1 Поиск в магазине ОтронВ блокнот
U2 Аудио усилитель
LM386
1 Поиск в магазине ОтронВ блокнот
U3 Линейный регулятор
LM7805CT
1 Поиск в магазине ОтронВ блокнот
D1 Выпрямительный диод
1N4001
1 Поиск в магазине ОтронВ блокнот
С1 Конденсатор1 нФ1 Поиск в магазине ОтронВ блокнот
С2 Конденсатор47 нФ1 Поиск в магазине ОтронВ блокнот
С3-С5, C7 Конденсатор100 нФ3 Поиск в магазине ОтронВ блокнот
С6 Электролитический конденсатор10 мкФ1 Поиск в магазине ОтронВ блокнот
R1, R2, R5, R7, R9, R10 Резистор
10 кОм
1 Поиск в магазине ОтронВ блокнот
R3, R6 Переменный резистор10 кОм2 Поиск в магазине ОтронВ блокнот
R11-R13 Резистор
150 Ом
3 Поиск в магазине ОтронВ блокнот
LCD1 LCD-дисплейATM12864D1 Поиск в магазине ОтронВ блокнот
X1 Кварцевый резонатор20МГц1 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (7) | Я собрал (0) | Подписаться

0
hd44780 #
Личный опыт.
Я именно эту схему не делал, но я перенёс этот FFT (он на чистом Си) в ARM AT91SAM7S256.
Работает сносно, но, по-моему, в области низких частот много палок, в высоких мало.
Ответить
0
Михаил #
А потому что в НЧ сосредоточена большая часть мощности. Как-то корректировать надо.
Ответить
0
Евгений #
Это так и должно быть, горка спускается от нижних к верхним чостотам
Ответить
0
Андрей #
Вот интересно: если у тебя разрешение около 310 Гц - это значит, что у тебя примерно 64 битная БПФ для частоты дискретизации равной 20кГц, если я ошибаюсь исправь.
Ответить
0
Эдуард #
Возможно ли данную схему адаптировать под использование светодиодных матриц? Если это возможно, то как это будет выглядеть на схеме? (с ЖК дисплеем не тот зрительный эффект)
Ответить
0
O5-14 #
Эх, а "хекса" нет. В чем и как это все компилировать?
Ответить
0
Andrew007 #
Собрал данный индикатор. В папке hex? Фото девайса и плата в 6 спринте.
Прикрепленный файл: indicator.rar
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Набор для сборки - LED лампа
Набор для сборки - LED лампа
Осциллограф DSO138 Конструктор для сборки: предусилитель на лампе 6N3
вверх