──────────────────────────────────────────
2000 TheRom/OHG
Привет кодерам, людям и Snake^у.
Алгоритм спектрального анализа звука в
реальном времени.
Будем делать анализатор звукового спек-
тра (это такие бегающие полоски на муз.
центрах которые прыгают под музыку и не-
грамотные люди называют их эквалайзером).
Алгоритм прост.
С точки зрения ничего не понимающего в
кодах математика:
1. Задем функцию y=f(x), интервал дельта х
тоже задаем.
2. вычисляем среднее арифметическое от
множества дифференциалов дельта у / дельта
х. Получаем результат Y^ - это координата
Y, по ней мы строим точку в нашем спек-
тральном графике (х берем=0, а в другие
разы будем прибавлять к нему приращение).
3. производим антиинтерполяцию функции
y=f (x) (не знаю как это называется. Ну в
общем сглаживаем ее).В результате получаем
новую функцию f(x).
4. повторяем множество раз все с пункта 2,
но с каждым разом увеличивая интервал х
между дифференциалами.
С точки зрения незнающего математику ко-
дера:
1. загоняем кусок звука с АЦП или на худой
конец из файла в буфер (512 байт) с задан-
ной частотой (например с задержкой 5).
2.1 устанавливаем HL на первый байт бу-
фера, в регистр х ляпаем 0, берем число
#80.
2.2 вычитаем (HL).
2.3 если флаг переноса=1 то NEG^аем ре-
зультат, иначе переходим к п. 2.4
2.4 вычисляем среднее арифметическое между
результатом и регистром х, результат кид-
аем в регистр х. Прибавляем к HL единицу.
2.5 повторяем п.2.2-2.4 пока не закончится
буфер.
3. результат рисуем для первой полоски.
4.1 HL устанавливаем опять на буфер и DE
тоже.
4.2 Берем число из (HL).
4.3 прибавляем к HL единицу.
4.4 вычисляем среднее арифметическое между
числом и (HL).
4.5 зашвыриваем результат в (DE) и прибав-
ляем к (DE) единичку.
4.6 прибавляем к HL опять единицу и к DE
тоже.
4.7 повтаряем п.4.2-4.6 пока не закончится
буфер. Обратите внимание на то что новый
буфер будет на том же адресе, но длина его
в 2 раза меньше предыдущего. Это надо учи-
тывать в п. 2 и 4
5. повторяем п.2.1-4.7 для остальных семи
полосок.
6. стираем или переключаем экран и делаем
все сначала п.1.
С точки зрения меня (круто сказано).
Мы имеем полосопропускающий фильтр,верх-
няя частота которого теоретически опреде-
ляется тем, сколько раз сглаживался рас-
сматриваемый кусок звука перед этим анали-
зом. Нижняя частота определяется величиной
отношения разности адресов при дифференци-
ровании к количеству раз сглаживания куска
перед этим анализом (пункт 2 в описании
для кодеров).
Таким образом если сглаживать кусок пос-
ле каждого анализа то полоса фильтра сдви-
гается вниз и мы строим полоски для каждо-
го частотного куска в буфере.
Для продвинутых кодеров (привет Disabler-
у):
Из-за того, что в то время когда камень
высчитывает замудренные формулы много мно-
го раз из буфера, кусок звука проходит ми-
мо полоски дергаются довольно коряво, при-
меняем хитрость.
Запоминаем в массиве текущее значение
высоты полоски для каждой частоты, а затем
перед рисованием полоски если полученное
значение высоты больше запомненного для
этой полоски, то берем запомненное, при-
бавляем 1, кидаем в массив результат и по
нему же рисуем полоску. Если меньше, то
отнимаем и так далее для всех полосок.
Эффект потрясный.
P.S. Я полный ноль в математике, так что
может чего и напутал в математическом
описании, но программа работает прелестно.
Кому надо, привожу зазипованный пример в
формате xas^а.
P. P. S. Народ спекртума - объединяйтесь
Народ из РАДАРа-звоните по тел. 71-33-08.
... в продолжение темы
Алгоритм сдвига спектра звука в реальном
времени (изменения тембра, мужского голоса
на женский,наоборот и т.п.).
Привет всем у кого есть АЦП и всем кому
это интересно.
Для того, чтобы сдвинуть спектр звука
нужно проиграть его с большей или меньшей
частотой дискретизации,чем он был записан.
Но вместе с этим изменится и скорость
звучания (скорость ритма, речи и т. д.), а
так же и время звучания, а в реальном
времени такой способ вообще не возможен.
Для реализации этого эффекта я придумал
такой алгоритм (хотя он уже наверное был
придуман до меня):
Звук проигрывается с большей или меньшей
частотой дискретизации но не весь, а ма-
ленький его кусочек (512...1024 байта).
Если кусок играется быстрее, то после
проигрывания он играется еше какое-то
время снова и снова пока не наступит время
следующего кусочка.
Если медленнее, то он не доигрывается до
конца.
Такое изврашение на слух почти не замет-
но.
Алгоритм состоит из двух программ, рабо-
тающих одновременно и независимо дриг от
друга. Это программа оцифровки в буфер с
постоянной частотой дискретизации и прог-
рамма воспроизведения с переменной часто-
той проигрывания.
Программа оцифровки цифрует звук в бу-
фер и по достижению конца буфера перехо-
дит на его начало и так до бесконечности.
Программа проигрывания проигрывает из
того же буфера тоже циклически,но с другой
скоростью.
Техническое описание программы.
Программа работает только с АЦП и ЦАПом
(s.drive, covox) и не затрагивает экран;
занимает 118 байт в нижней памяти и 768
байт под буфер в верхней; частота дискре-
тизации мне неизвестна; в исходнике АЦП
порт #F7, ЦАП порты #0F, #1F, #4F, #5F (s.
drive).
Клавишами "6", "7" осуществляется
сдвиг спектра плавно, "8", "9"-грубо, "0"
выход.
Интересная особенность.
1. Если сдвинуть спектр песни Киркорова,то
получится вылитая Пугачева.
2. Включите песню, где есть пианино. Под-
берите тон по слуху почти как в оригинале.
Выровняйте звук с магнитафона и компьютера
так чтобы в месте где вы сидите было слыш-
но и то и другое одинаково громко. Еще не
одному человеку не удалось не упасть со
смеху после такого.
P.S. Привет Disabler^у,его жене, Snake^у и
всем остальным из OHG и DHG, а также
РАДАРавцем от TheRom^а (он же Роман 71)!!!
P.P.S. Люди добрые продайте модем.
тел. 71 33 08.