DonNews
#11
21 апреля 2000 |
|
кодинг - Алгоритм спектрального анализа звука в реальном времени.
────────────────────────────────────────── 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.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября