|
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.
Другие статьи номера:
Похожие статьи:
В этот день... 1 января
SibNews #08,
Woot! #01,
Spectrum Magazine #01,
ACNews #25,
Psychoz #14,
ACNews #14,
Last 128 #08,
Last 128 #06,
Last 128 #05,
Last 128 #04,
Last 128 #03,
Last 128 #02,
Last 128 #09,
Last 128 #3.5,
Last 128 #8.025,
Sinclair Club #05,
Last 128 #M!R 01,
Fantadrom #01,
Buzz #20,
Last 128 #01,
DonNews #13,
Nicron #120,
Promised Land #01,
Inferno #01,
Marazm #25,
Ultimathum #01,
Marazm #21,
Hooy Mag #02,
KrNews #11,
Marazm #22,
Marazm #23,
ZX Football 2000 #01,
Codemania #01,
Always #03,
Bugs #02,
IzhNews #08,
Virtual Worlds #01,
Listok #04,
Scenergy #02,
Flash Info #18,
Marazm #16,
Marazm #17,
Zed #01,
Balagan #02,
ZX Format #08,
ZX Power #03,
Shock #01,
Impulse #02,
Deja Vu #03,
ZX Club #08,
ZX Club #06,
Numberology #01,
Marazm #13,
Marazm #12,
Marazm #14,
Gorodok #02,
Zodiac #01,
Marazm #15,
Deja Vu #07,
Marazm #11,
Deja Vu #07,
Playboy #03,
Crazy News #2,
Crazy News #4,
ZX Light #01,
Crazy News #5,
Playboy #02,
ZX News #03,
ZX Review #1-2,
Read Me #02,
Crazy News #3,
Nicron #13,
Read Me #01,
Public Spirit #01,
Faultless #06,
Faultless #05,
ZX Software #01,
Stump #04,
Speccy #07,
Возраждение #0,
Speccy #03,
On-Line #17,
Scene+ #01,
Welcome Press #01,
ZX Konig #04,
Adventurer #01,
Faultless #05,
Faultless #04,
Di Halt #01,
Faultless #01,
Playboy #01,
Crazy News #1,
Faultless #03,
Pioneer #03,
Sinclair Town #02,
ZX Magazine #01,
Eldorado #01,
ZX Magazine #02,
Spectron #01,
ZX News #01,
ZX Konig #02,
200 #W,
Welcome Press #00,
Dune #07,
Subliminal Extacy #01,
Subliminal Extacy #02,
ZX Konig #01,
Subliminal Extacy #00,
Muchomor #01,
Spectrofon #01,
ZX Revija #02,
Outlet #01,
Outlet #1-3