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

У цьому проекті аудіо аналізатор спектра в реальному часі реалізується за допомогою 8-бітного мікроконтролера PIC18F4550. Аналіз спектру частот здійснюється оптимізованим 64-бітовим Швидким Перетворенням Фур'є (Fast, 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, без його математичної наполегливості цей проект, напевно, ніколи не було б завершено!