Deja Vu
#05
31 мая 1998 |
|
Тема - DIGITAL звук, как он есть (проигрыватель .wav файлов).
SoundTrack: SUNNY BY SECTOR/SERIOUS'97 (!) __________________________________________ (C) M.M.A aka UnBELIEVER/SPEED CO./XTM'98 __________________________________________ ДИСКРЕТИЗАЦИЯ НЕПРЕРЫВНОГО ВО ВРЕМЕНИ ГАРМОНИЧЕСКОГО КОЛЕБАНИЯ или DIGITAL ЗВУК, КАК ОН ЕСТЬ ------------------------- Это не лекция и даже не практика Это студенты пьют пиво "БАЛТИКА" ------------------------- Вместо эпиграфа.... * * * За последнее время на наши головы сва- лилось огромное количество игр, demo, жур- налов и даже системных программ, в которых активно используется графика конвертиро- ванная с других платформ (AMMY/PC). Ни кто уже не удивляется,увидев на экране "скани- рованные" 100 рублей, рожу автора програм- мы или даже голую задницу (если бы только задницу!). Однако, слышимая изредка из ди- намиков вашего звукового девайса челове- ческая речь, фрагменты известных песен или (опять же) просто похотливые женские вздо- хи вызывают интерес и иногда даже удивле- ние. Как это они звук в компутер засунули? А вот как... Для начала немного теории. Не буду пре- тендовать на правду в последней инстанции, но изложеное ниже действительно имеет мес- то. Данным вещам вас вполне могут обучить в ВУЗ'е, на предметах ТЕОРИЯ ПЕРЕДАЧИ СИГ- НАЛОВ,ЦИФРОВАЯ ОБРАБОТКА СИГНАЛОВ и им по- добным. Я же хочу изложить основныю суть, причем, кратко и доступно. Надеюсь умудре- ные высшим образованием товарищи не сочтут этот упрощенный вариант за ламерство... Итак, у нас есть сигнал. Что это такое- дикий вой Кинг-Конга или пламенная речь В.В.Жириновского - абсолютно не важно. Это могут быть даже 220 вольт из разетки при определенном подходе. Чтобы не быть голос- ловным, я нарисовал кусок неопознанного сигнала на рисунке под номером один. Оси координат-это время (по горизонтали) и ам- плитуда (по вертикали). Тем, кто не понял, разъясняю;если это голос, то он изменяется во времени и в каждый из моментов имеет некоторую мгновенную амплитуду (проще го- воря громкость). Процесс перевода этого звука на "язык цифр" понятный машине зак- лючается в проведении двух операций - дис- кретизация и квантование. └√ л ┴√ л @┬√ л `├√ л А─√ л а┼√ л └╞√ л р╟√ л ╔√ л ╩√ л @╦√ л `╠√ л Для дискретизации нам нужно разбить ось времени на равные участки с определенным шагом. Шаг дискретизации выбираеться про- извольно и, как вы понимаете, чем он боль- ше, тем качественнее будет звук. Почему? Потому, что после разбиения оси времени мы начинаем считать, что между двумя соседни- ми штрихами(рис.2) наш сигнал имеет посто- янное значение, то есть на графике он дол- жен быть горизонтальной линией. Как многие наверное уже поняли, шаг дискретизации это и есть в некотором смысле те самые 4,8,16, 22,44 КГц. Теперь, из каждой точки (взятой с выб- ранным шагом) на оси времени,мы можем про- вести прямую и, опустив перпендикуляр на ось амплитуд из точки пересечения прямой и графика,получить некоторое значение ампли- туды сигнала в данный момент времени. Однако, чтобы узнать значение амплитуды в данный момент времени,нужно ось этой са- мой амплитуды разметить - разбить с неко- торым шагом, как и в случае со временем. Этот процесс по научному называется кван- тованием. Не надо быть RST#7, чтобы понять всю важность того, чтобы шаг квантования был как можно меньшим и следовательно уровней было как можно больше. Сравните рисунки 3 и 4. На третьем все- го семь уровней квантования и график (под графиком сигнала) состоит из крупных сту- пенек. На четвертом уровней уже 16 и сту- пеньки (если их провести) стали меньше, более приближаясь к оригиналу. А═√ л а╬√ л └╧√ л р╨√ л ╥√ л ╙√ л @╘√ л `╒√ л А╓√ л а╫√ л └╪√ л р┘√ л Кстати,расстояние от "ступеньки" до ре- альной точки на графике,т.е. разница "нас- тоящего" значения сигнала в этой точке, и его квантованного значения называется шу- мом квантования. В большинстве своем, все то шипение, которое слышно из динамиков во время воспроизведения оцифровки и есть шум квантования, образовавшийся на этапе полу- чения оцифровки. Логично предположить, что при стремлении шага дискретизации к нулю, а числа уровней квантования к бескоечнос- ти, шум исчезает полностью. Вот в принципе и вся теория.Таким обра- зом, после преобразований у нас получается массив мгновенных значений амплитуды(гром- кости) сигнала в определенные моменты вре- мени. Как же подобрать параметры дискрети- зации и квантования, так, чтобы звук был более реальным и максимально соответство- вал оригиналу? Оптимальным является дискретизация сиг- нала с частотой 44КГц. Откуда берется это число? Есть такая теорема Котельникова, которая сложна и одновременно проста. Так вот, она (если немного подумать) говорит нам, что для полного восстановления сигна- ла нужно дискретизировать его с частотой в два раза большей, чем та,в которой спек- тральная плотность сигнала отлична от ну- ля. Человеческое ухо воспринимает как звук колебания от 2Гц до 20КГц, то есть диапа- зон в 20КГц. Вот его то мы и умножаем на 2 получая где-то 40-44KГц. Достижима ли такая скорость воспроизве- дения на SPECCY? Конечно нет! Все то, что мы слышим (DIGITAL SOUND) в многочисленных демках и специализированных музыкальных редакторах, в основном, имеет частоту 4-8КГц. В редких случаях 15-16КГц (одна из мелодий на E'97 MUSIC COMPO) и даже 22КГц (ZY-ZY и ACTION by VAV). В качестве экспе- ремента самарскому программисту MONSTR'у из SAGE GROUP удавалось достичь таких ско- ростей проигрывания звука, когда частота оцифровки может достигать 30КГц и это практически предел возможностей стан- дартного Z80A 3.5МГц. Однако, при всех этих достижениях, народ продолжает перего- нять звук преимущественно с частотой 8КГц. В чем же порылась собака? А дело в том,что как было описано выше, кроме частоты дискретизации есть еще один параметр - число уровней квантования. Без- мерно увеличивая один из этих параметров и не изменяя другой,координального улучшения качества мы не получим! Число уровней квантования принято изме- рять в битах на отсчет, например, фраза "у этой карточки пятибитовый звук" означает, что данное устройство может воспроизвести звук квантованный на 32 уровня(%11111 = 31 + 1). A что же SPECTRUM? 1bit - 2 уровня - beeper 4bit - 16 уровней - AY-CHIP 7bit - 128 уровней - ряд COVOX'ов 8bit - 256 уровней - SOUNDRIVE Таким образом,если шаг дискретизации мы можем выбрать в широком пределе (прог- раммно), то число уровней в нашей оцифров- ке неизменно (аппаратно) и изменять его можно только вниз (на COVOX'е слушать 1bit sound). Теперь, я думаю, самые сообрази- тельные поняли, что звук для SOUNDRIVE'а занимающий 10 секунд на часах, в памяти компьютера съест ни много ни мало - 10*X КГц, где X частота. Конечно же, хочется зацифровать такой звучек на 22KHZ (тем более, что никто не мешает!), но в памяти это скушает 220KБ!!! Да и сами устройства играющие больше 4bit есть далеко не у всех - стандарт все же сопроцессор! Изложенные ниже конвертор и проигрыватель ориентированны именно на не- го. Как же получить оцифрованный вариант желаемого звука? Для этого вам понадобится устройство называемое АЦП - аналогово циф- ровой преобразователь. Существует ряд схем данного устройства для SPECCY, но на мой взгляд получать оцифровку на нашем родном компьютере не имеет смысла. Для этого мож- но использовать большой,"профессиональный" АЦП имеющийся буквально повсюду - IBM PC. Весь софт существующий на PC и предна- значенный для оцифровки/обработки звука можно заставить выгружать данные в формате .WAV. Более того, т.к. .WAV является стан- дартным форматом звука для wINDOWS, без проблем можно найти большое количество уже готовых звуков в каталогах любой "виндоз- ной" программы (целое их лежбище можно найти на диске с Office'97). Найдя или получив на pc файл в формате .wav, следует убедиться, что этот звук яв- ляется "восьмибитным" и "моно". Чаще вст- речаются звуки 16bit и stereo. Их,конечно, тоже можно конвертировать на SPECCY,но для этого нужен другой (чем приведенный ниже) конвертор, плюс к этому подобные файлы бу- дет очень трудно переводить из-за большого количества избыточной информации. .WAV может иметь любую частоту дискре- тизации,т.к. лишние отсчеты можно откинуть уже на SPECCY, путем "выбрасывания" каждо- го второго байта данных. Частота при этом уменьшиться в два раза. ------------------------------------------ Маленькая рекомендация по переводу из MS-DOS в TR-DOS. Обычно это делается посредством IS-DOS, но, если файл большой, то его трудно будет потом конвертировать - придется разрезать. Более того, если файл окажется больше 255 секторов, то даже IS-DOS не поможет. Я ре- комендую пользовать программу MSDOS-RD. Данная штука хоть и написанна достаточ- но глючно, но позволяет копировать файлы любой длины, разрезая при этом на равные куски по 16384 байта. Помните только, что имя файла и расширение нужно вводить стро- го большими буквами. ------------------------------------------ Вспоминая тот факт, что нам из "писиш- ных" 8bit нужно всего 4bit, встает задача по переводу данных. Одновременно можно по- радоваться за то, что в одном байте после перевода уместится два отсчета: весь байт 1010 0101 └────┴────┘ первый отсчет второй отсчет Ясный пень, что в этом случае в памяти уместится в два раза больше данных. Сей факт не может не радовать, но за него при- дется заплатить уменьшением быстродейст- вия. Так как же перевести 8bit в 4bit'а? Са- мым простым и радикальным методом является деление на 16. Берем из каждого "восьми- битного" отсчета только старшие 4 бита. Но есть способ лучше... - "РОНДО" (C) Реклама Будем выделять наши биты с помощью не- которой аппроксимирующей функции. Зачем? Чтобы получить более качественный звук! Предлагаемая ниже аппроксимирующая кри- вая была взята ALK'ом из каких-то одному ему известных соображений. Вы можете поп- робовать создать на BASIC'е свой массив и посмотреть как измениться звук. Ниже пока- зан рисунок, на котором одновременно изоб- ражены наша функция (наверху) и линия, от- ражающая вариант, когда берутся первые 4 бита (внизу). █√ л ▄√ л @▌√ л `▐√ л А▀√ л ар√ л └с√ л Начало и конец обоих графиков совпада- ет, но в середине есть отличие. Это, каза- лось бы несущественное отличие, играет су- щественную роль в качестве. ------------------------------------------ Для получения своей аппроксимирующей кривой, набейте на BASIC'е программу,кото- рая будет строить непрерывную функцию от 0 до 255 по X и высотой не более 16 точек(по оси Y). Затем вместо команды PLOT поставь- те POKE и, немного подождав, вы получите массив цифр в памяти. Да что я объясняю!?? Сейчас же юзер продвинутый пошел! Понимает с двух слов ): ------------------------------------------ Итак,первым делом запускаем конвертор - процедура под меткой KONVERT. Табличка ап- проксимации перебросится в экран (можно в любое другое место, лишь бы адрес был ров- ный - младший байт #00) и процесс пошел! Через несколько секунд, мы уже имеем в памяти с того же адреса куда был загружен .wav, готовую к употреблению оцифровку. Ее длина ровно в два раза меньше, чем размер исходного .wav'a. Теперь смело запускаем проигрыватель, задав в нужных регистрах адрес расположения и длину звука умножен- ную на два (длину оригинального .wav'а). ВОТ ОН И _З_В_У_К_, СТРУИТСЯ ИЗ ВАШИХ ДИНАМИКОВ! Регулировку скорости проигрывания можно произвести с помощью метки TORMOZ. Однако, даже, если минимальное значение TORMOZ=1 является для вашего .wav'а медленным,можно убить саму процедуру торможения, выиграв при этом еще несколько килогерц. Волновать вас должна сейчас не ско- рость, а подозрительный щелчек в начале оцифровки. Это есть не что иное, как заго- ловок .wav'а, где хранились некоторые его параметры. Мы с вами случайно их перевели и теперь играем, как начало звука. Чтобы избавиться от этого противного щелчка, запустите процедурку CORRECT, ко- торая скопирует в начало звука массив чи- сел, являющихся нарастающей от #00 до #0A амплитудой. Этот массив полностью затрет сконвертированный описатель .wav'а,а вмес- те с ним и противный щелчек. Вот, в принципе и все, что нужно знать для начала эксперементов с цифровым зву- ком. Может быть отдельным товарищам пока- жется, что я изложил все это по-ламерски и наивно считаю себя гением в конверсии зву- ка. Вовсе нет! Я просто стремился донести истину до большинства пользователей самым простым и доступным языком. Всем тем, кого заинтересовал данный ма- териал, хочу дать маленький совет: исполь- зуйте "мощь" калькулятора IBM PC во благо SPECCY и помните,что кроме оцифровки звука его еще можно и обработать (удаление шума/ фильтры/эффекты) в ряде редакторов типа COOL'95, SOUND FORGE и т.п. Качество улуч- шится! Тут,как с конверсией графики - можно от балды, а можно посидев в PhotoShop'е! ;------------------------------------- ; ПРОИГРЫВАТЕЛЬ .WAV ФАЙЛОВ ! ; ; WRITTEN BY ALK/STARS OF KELADAN'97 ; CORRECTED BY M.M.A/SPEED CO.'97 ; LAST EDITION ON 10.04.98 ;------------------------------------- ; ПРИМЕР ИСПОЛЬЗОВАНИЯ ПРОИГРЫВАТЕЛЯ ; ; LD HL,#C000 ;АДРЕС НАЧАЛА ДАННЫХ ; LD DE,#3800*2 ;(ДЛИНА ЗВУКА) * 2 ; CALL PLAY ; EI ; RET ;------------------------------------- TORMOZ EQU 2 ;ЗАДЕРЖКА ПРИ ПРОИГРЫВАНИИ ;ПОДБИРАЕТСЯ В ЗАВИСИМОСТИ ;ОТ ЧАСТОТЫ ОЦИФРОВКИ. DATA EQU #8000 ;АДРЕС РАСПОЛОЖЕНИЯ ;ИСХОДНОГО .WAV ФАЙЛА ;ДЛЯ ПЕРЕВОДА SAMP EQU #4000 ;АДРЕС АППРОКСИМИРУЮЩЕЙ ;ТАБЛИЦЫ ДЛЯ ПЕРЕВОДА ;8bit > 4bit LENGHT EQU #8000 ;ДЛИНА ПЕРЕВОДИМОГО .WAV ;ФАЙЛА ;ПРОИГРЫВАТЕЛЬ ;--------------------------------------- PLAY1 PUSH HL ;ДЛЯ ПЕРВОГО ВЫЗОВА PUSH DE CALL INIAY POP DE POP HL ;--------------------------------------- PLAY DI ;ПОСЛЕДУЮЩИЕ ВЫЗОВЫ PR2 CALL PLAYAY CALL INIAY RET PLAYAY EXX LD DE,#FFBF LD C,#FD LD L,8 EXX LD B,0 LPLAY LD A,(HL) MAS1 AND #F0 CT1 RRCA RRCA RRCA RRCA EX AF,AF EXX LD A,L LD B,D OUT (C),A EX AF,AF LD B,E OUT (C),A EX AF,AF INC A LD B,D OUT (C),A EX AF,AF LD B,E OUT (C),A EX AF,AF INC A LD B,D OUT (C),A EX AF,AF LD B,E OUT (C),A EXX LD A,(CT1) XOR #0F LD (CT1),A LD (CT1+1),A LD (CT1+2),A LD (CT1+3),A LD A,(MAS1+1) CPL LD (MAS1+1),A RLCA AND 1 LD C,A ADD HL,BC DELAYAY LD A,TORMOZ ;СОТРИТЕ ЭТИ СТРОКИ LPB DEC A ;ДЛЯ ДОСТИЖЕНИЯ JR NZ,LPB ;МАКСИМАЛЬНОЙ СКОРОСТИ DEC DE LD A,D OR E JR NZ,LPLAY RET INIAY LD HL,BUFAY XOR A LD DE,#FFBF LD C,#FD LIA LD B,D OUT (C),A LD B,E OUTI INC A CP 14 JR NZ,LIA RET BUFAY DW 1,1,1 DB 0,#3F,0,0,0 ;МОЖНО ПОСТАВИТЬ DB 0,0,0 ;#38 - Ч И Щ Е, ;НО ТИШЕ! ;--------------------------------- ; КОНВЕРТОР ;--------------------------------- KONVERT LD HL,SAMPTAB LD DE,#4000 LD BC,#0100 LDIR LD HL,DATA LD DE,DATA LD BC,LENGHT LPRE LD A,(DE) CALL PREOSA RLCA RLCA RLCA RLCA LD (HL),A INC DE LD A,(DE) CALL PREOSA OR (HL) LD (HL),A INC DE INC HL DEC BC LD A,C OR B JR NZ,LPRE RET PREOSA PUSH HL LD HL,SAMP LD L,A LD A,(HL) POP HL RET ;--------------------------------------- ; ТАБЛИЦА ДЛЯ ПЕРЕВОДА 8bit > 4bit ;--------------------------------------- ;АССЕМБЛИРОВАТЬ СТРОГО С РОВНОГО АДРЕСА ;ТИПА #5B00,#C000,4000 И Т.Д. ;РАЗМЕР ТАБЛИЦЫ - #100 БАЙТОВ. ;--------------------------------------- SAMPTABLE DEFB #00,#00,#00,#00,#00,#00,#01,#01 DEFB #01,#01,#01,#01,#01,#01,#01,#01 DEFB #01,#02,#02,#02,#02,#02,#02,#02 DEFB #02,#02,#02,#02,#03,#03,#03,#03 DEFB #03,#03,#03,#03,#03,#03,#03,#04 DEFB #04,#04,#04,#04,#04,#04,#04,#04 DEFB #04,#04,#05,#05,#05,#05,#05,#05 DEFB #05,#05,#05,#05,#05,#06,#06,#06 DEFB #06,#06,#06,#06,#06,#06,#06,#06 DEFB #06,#07,#07,#07,#07,#07,#07,#07 DEFB #07,#07,#07,#07,#07,#07,#08,#08 DEFB #08,#08,#08,#08,#08,#08,#08,#08 DEFB #08,#08,#09,#09,#09,#09,#09,#09 DEFB #09,#09,#09,#09,#09,#09,#09,#09 DEFB #0A,#0A,#0A,#0A,#0A,#0A,#0A,#0A DEFB #0A,#0A,#0A,#0A,#0A,#0A,#0B,#0B DEFB #0B,#0B,#0B,#0B,#0B,#0B,#0B,#0B DEFB #0B,#0B,#0B,#0B,#0B,#0B,#0C,#0C DEFB #0C,#0C,#0C,#0C,#0C,#0C,#0C,#0C DEFB #0C,#0C,#0C,#0C,#0C,#0C,#0C,#0C DEFB #0D,#0D,#0D,#0D,#0D,#0D,#0D,#0D DEFB #0D,#0D,#0D,#0D,#0D,#0D,#0D,#0D DEFB #0D,#0D,#0D,#0D,#0D,#0D,#0E,#0E DEFB #0E,#0E,#0E,#0E,#0E,#0E,#0E,#0E DEFB #0E,#0E,#0E,#0E,#0E,#0E,#0E,#0E DEFB #0E,#0E,#0E,#0E,#0E,#0E,#0E,#0E DEFB #0E,#0E,#0E,#0E,#0E,#0F,#0F,#0F DEFB #0F,#0F,#0F,#0F,#0F,#0F,#0F,#0F DEFB #0F,#0F,#0F,#0F,#0F,#0F,#0F,#0F DEFB #0F,#0F,#0F,#0F,#0F,#0F,#0F,#0F DEFB #0F,#0F,#0F,#0F,#0F,#0F,#0F,#0F DEFB #0F,#0F,#0F,#0F,#0F,#0F,#0F,#0F ;-------------------------------------- ; БЛОК ДЛЯ СГЛАЖИВАНИЯ НАЧАЛЬНЫХ ЩЕЛЧКОВ ; ДЛИНА - 22 БАЙТА. (C) МОЙ! ;-------------------------------------- CORRECT LD HL,RISING LD DE,DATA LD BC,22 LDIR RET RISING DB #00,#01,#11,#12,#22,#23,#33 DB #34,#44,#45,#55,#56,#66,#67 DB #77,#78,#88,#89,#99,#9A,#AA DB #AA
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября