На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> PC Speaker , ШИМ aka RealSound
    Друзья!
    Кто выводил семплы (WAV'ки) через спикер ШИМом (под DOS)? Делитесь опытом! :D
    Причём, нужен опыт тех, кто копал глубоко.

    Итак, стандартный код инициализации таймера:
    ExpandedWrap disabled
          mov al,0B0h
          out 43h,al  ; set mode 0 for counter 2
          mov al,1
          out 42h,al  ; write low byte (1)
          dec ax
          out 42h,al  ; write high byte (0)
          in al,61h
          or al,3
          out 61h,al  ; enable speaker
          mov al,90h
          out 43h,al  ; prepare to write low bytes to counter 2
    Тут всё понятно, вопросов нет.

    Далее настраиваем таймер 0 (который генерит IRQ0) на нужную частоту дискретизации и в обработчике шпарим out 42h,al (пишем младшие байты в счётчик 2).

    А теперь самое интересное!


    1. По логике, отправляемое в порт 42h значение не должно быть больше счётчика, на которое настроен таймер 0 (т.е. если мы выводим звук с частотой 22050 Гц, значит 1193182/22050 = 54), назовём это значение PIT0_CNT.
    Ведь как это работает? Когда мы пишем в этот порт, на спикер подаётся 0, а по истечении тиков счётчика – 1. Вот и весь ШИМ. Т.е. если семпл (мы берём беззнаковые, разумеется) имеет значение 85 (33%), значит при PIT0_CNT = 54 мы подаём 18, и треть промежутка времени между двумя соседними семплами на спикере будет 0, 2/3 времени – 1.

    Я пересмотрел кучу исходников (в частности, отсюда: https://pascal.sources.ru/sound/index.htm, не все, конечно, но прилично).
    И везде вот такая таблица:
    ExpandedWrap disabled
          ; al = sample
          mov bx,sine_table
          xlatb       ; al = sample translated to range 1..75
       
      sine_table:
          db  1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2
          db  2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,4
          db  4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5
          db  5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6
          db  6,6,6,7,7,7,7,7,7,7,7,7,7,7,8,8
          db  8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9
          db  9,9,10,10,10,10,11,11,12,12,13,14,14,15,16,17
          db  17,18,19,20,21,22,23,24,26,27,28,29,30,31,33,34
          db  35,36,38,39,40,41,43,44,45,46,48,49,50,51,52,53
          db  54,55,57,58,58,59,60,61,62,63,64,64,65,66,66,67
          db  67,67,67,67,67,68,68,68,68,68,68,68,68,68,68,68
          db  68,68,69,69,69,69,69,69,69,69,69,69,69,70,70,70
          db  70,70,70,70,70,70,70,70,70,70,71,71,71,71,71,71
          db  71,71,71,71,71,72,72,72,72,72,72,72,72,72,72,72
          db  72,72,73,73,73,73,73,73,73,73,73,73,73,74,74,74
          db  74,74,74,74,74,74,74,74,74,74,75,75,75,75,75,75
    Очевидно, что она настроена на частоту ≈ 16 кГц (1193182/75 ≈ 15909).
    Но почему же она используется в плеерах ДЛЯ ЛЮБЫХ частот дискретизации? И для 11 кГц, и для 22 кГц.
    Неужели все авторы так жёстко тупят?


    2. Почему используется такая синусоидальная таблица, а не линейное значение? Типа:
    ExpandedWrap disabled
          ; al = sample
          mov ah,75
          mul ah
          mov al,ah   ; al = sample translated to range 1..75
    Здесь меня интересует теоретическая база.
    И каким образом такая таблица получена? Я хочу генерить такую таблицу в зависимости от частоты дискретизации.
    Я забил в Excel'е такую формулу: =ЦЕЛОЕ((-COS(A1/256*ПИ())+1)/2*256). Она выдаёт значения от 0 до 255 (да, от 0, т.к. при нуле, как я понимаю, можно просто ничего не писать в 42-й порт, там как была 1, так и останется... верно?)
    Но! В этом случае мы получаем много 0-й в начале, затем чуть меньше единиц... в конце много 254 и чуть больше 255. Здесь же значений 1 и 75 меньше, чем 2 и 74. Какая-то странная таблица, по мне.

    А может, эта таблица должна вообще состоять из логарифмических значений (снизу значения растут быстро, сверху – медленно) или...?
    Есть ли у кого-то подробное описание технологии RealSound ?


    3. По идее, при настройке таймера, первые 5 строк (до in al,61h) можно убрать, т.к. когда мы пишем младший байт, таймер начинает работать любопытным образом: младший и старший байты уменьшаются почти синхронно, т.е. результирующий эффект такой же, как и при обнулении старшего байта (я пробовал это в реальном DOS, в VMware, в DOSBox, в QEMU, в Bochs – везде это так). Это безопасно или всё же с этим могут возникнуть проблемы?


    4. Как я понимаю, оптимальная частота дискретизации ≈ 16 кГц. Сильно ниже – появляется писк, сильно выше – "разрядность" ШИМа становится недостаточной для более или менее точной его настройки, появляется излишне много помех. Тем не менее, может быть кто-то экспериментировал и может подсказать, где та граница качества/шума, на которую лучше не заступать? Т.е. оптимальный диапазон частот дискретизации (может быть, от 16 до 24 или до 32 кГц?)
    В DOSBox ещё, зараза, спикер работает не так, как в реальной системе. В нём писка вообще нет! И нормально работают как раз значения от 1 до 75. Пишешь меньше (даже при более высокой частоте дискретизации) – звук становится тише, пишешь больше (даже при низкой частоте дискретизации) – начинает хрипеть :facepalm:
      Цитата
      Ведь как это работает? Когда мы пишем в этот порт, на спикер подаётся 0, а по истечении тиков счётчика – 1. Вот и весь ШИМ. Т.е. если семпл (мы берём беззнаковые, разумеется) имеет значение 85 (33%), значит при PIT0_CNT = 54 мы подаём 18, и треть промежутка времени между двумя соседними семплами на спикере будет 0, 2/3 времени – 1.

      Вроде всё правильно.
      Цитата
      И каким образом такая таблица получена? Я хочу генерить такую таблицу в зависимости от частоты дискретизации.

      См. картинку. Таблица для компандирования/компрессирования 8 битного аудио. Значение 128 - это виртуальный 0. Всё, что в районе этого значения будет усилено сильнее всего, а в районе 0 и 255 менее всего, в результате тихие звуки будут звучать громче, а громкие более "ровно". Можно и линейными значениями пользоваться(в смысле, линейные значения - это оригинальный звук как он есть). Просто тихие звуки при такой разрядности пропадут, будут меньше шага квантования, их просто не будет в выходном сигнале. А так можно что-то услышать. Таблица не связана с частотой дискретизации.
      Цитата
      сильно выше – "разрядность" ШИМа становится недостаточной для более или менее точной его настройки, появляется излишне много помех.

      75 - это где-то 6 бит с хвостиком. А 54 - 5 бит с хвостиком. Это шумы квантования и всего чего угодно. Смотри про дизеринг и нойз шейпинг, как их уменьшить.
      Можешь попробовать сделать программный шим, все задержки формировать программно(или как вариант, только интервалы ШИМ, а частоту дискретизации оставить на таймере) и дергать динамик через 61 порт. Если до 8 бит доведёшь, думаю, будет звук получше.
      Прикреплённый файлПрикреплённый файл______________.jpg (31,74 Кбайт, скачиваний: 1381)
      Сообщение отредактировано: Prince -
        Цитата Prince @
        Таблица для компандирования/компрессирования 8 битного аудио.
        Ух ты, ёжкин кот, наконец-то нормальный ответ по этой теме! Спасибо! А есть какая-то формула этого безобразия? Это не синус оказывается, а ломаная.
        И всё же получается, что эту таблицу нужно масштабировать под делитель частоты дискретизации (под тот самый IRQ0_CNT, что я писал выше), т.к. эта сделана под 16 кГц. Т.е. если будет 22 кГц, то верхним значением будет не 75, а 54. И т.д. Правильно я понимаю?

        Цитата Prince @
        Можешь попробовать сделать программный шим, все задержки формировать программно(или как вариант, только интервалы ШИМ, а частоту дискретизации оставить на таймере) и дергать динамик через 61 порт.
        А смысл? Это ж мне надо IRQ0 дёргать с частотой 1 МГц, что скорее всего медлительность обращения к ISA-портам мне не даст (там задержка порядка 1 мкс или даже ближе к 1.5 мкс). Когда это можно программно всё сделать.

        Про вопросы 3, 4 чего-нибудь знаешь? :blush:

        Ну и правильно ли я понимаю, что масштабировать можно не от 1, а он 0, а...
        Цитата Jin X @
        при нуле, как я понимаю, можно просто ничего не писать в 42-й порт, там как была 1, так и останется...


        И такой ещё вопрос: избавиться от писка на малых частотах (8-11 кГц) можно только повышением частоты?
        Сообщение отредактировано: Jin X -
          Цитата
          Правильно я понимаю?

          В общем, да. Только таблица - график зависимости уровня выходного сигнала от уровня входного. Масштабируется под максимальное значение семпла, а не под частоту дискретизации. То что в данном случае, максимальное значение зависит от частоты дискретизации - досадный технический ньюанс. Переведи значения в dB и кажущаяся зависимость пропадёт.
          Цитата
          А есть какая-то формула этого безобразия?

          ...я не знаю, что за формула. Может быть логарифмирующий усилитель :scratch: ... На первый взгляд, на графике вырисовываются две прямые с разными углами наклона. Сначала идёт усиление где-то на 2 dB, и так до входного уровня -4 dB. А дальше компрессия 4:1. И немного переход сглажен. Если здесь имеет место компрессия, то можешь играться с
          графиком как угодно, оценивая результат на слух. Так обычно и делают.
          Цитата
          А смысл? Это ж мне надо IRQ0 дёргать с частотой 1 МГц, что скорее всего медлительность обращения к ISA-портам мне не даст (там задержка порядка 1 мкс или даже ближе к 1.5 мкс). Когда это можно программно всё сделать.

          Я имел в виду, что irq0 будет отвечать за частоту дискретизации как и сейчас, а задержку ШИМ формировать циклами, при участии счётчика TSC. Программно. Какую частоту обновления допускает 61 порт, не в курсе.
          Цитата

          И такой ещё вопрос: избавиться от писка на малых частотах (8-11 кГц) можно только повышением частоты?

          Если на динамик подать частоту слышимого диапазона, то её будет слышно. Разве что фнч на сам динамик влепить, но кто этим будет заниматься.

          Цитата
          Ну и правильно ли я понимаю, что масштабировать можно не от 1, а он 0, а...

          Не понимаю, о чем речь, плохо соображаю.

          Цитата
          Про вопросы 3, 4 чего-нибудь знаешь?

          3. Тоже не понимаю о чем речь. Таймер сначала настраивается, один раз: установить режим 0 для 2 канала, использовать в работе только младший байт...
          Потом загружаешь туда по байту, в нужное время...
          4. :-? При разрядности в 4/5/6 бит, при таких частотах дискретизации, при таких характеристиках динамика, добиться качественного звука всё равно не получится.

          Встречный вопрос. Как ты выводишь wav с частотами 44100/48000?
            Цитата Prince @
            Только таблица - график зависимости уровня выходного сигнала от уровня входного. Масштабируется под максимальное значение семпла, а не под частоту дискретизации. То что в данном случае, максимальное значение зависит от частоты дискретизации - досадный технический ньюанс.
            Это понятно, но в данном случае у нас значение семпла как раз регулируется делителем счётчика :)

            Цитата Prince @
            ...я не знаю, что за формула. Может быть логарифмирующий усилитель
            Я решил использовать A-law, u-law. Сделал пока u-law, но с u=15.

            Цитата Prince @
            Я имел в виду, что irq0 будет отвечать за частоту дискретизации как и сейчас, а задержку ШИМ формировать циклами, при участии счётчика TSC. Программно. Какую частоту обновления допускает 61 порт, не в курсе.
            Тогда при малых амплитудах IRQ будет выполняться относительно быстро, а при больших – почти всё время между двумя IRQ. Ну или половину, если менять местами. Короче, это будет создавать тормоза, а профита мало, ИМХО.

            Цитата Prince @
            Если на динамик подать частоту слышимого диапазона, то её будет слышно.
            Мы при каждом вызове IRQ меняем полярность на спикере, вот и получается писк с частотой дискретизации. Ты про эту частоту?

            Цитата Prince @
            Таймер сначала настраивается, один раз: установить режим 0 для 2 канала, использовать в работе только младший байт...
            Стандартный код: записать младший байт (1) и старший (0), затем подготовить счётчик к периодической записи младших байтов. Вопрос в том, что первую часть можно не делать. Я спроисл одно чела, мол, по сути этот блок не нужен, а он говорит, что типа нужно же в старший байт положить ноль. А я говорю, что про записи только младшего байта старший начинает тоже декрементироваться почти синхронно с младшим. Хочу уточнить, не будет ли эта технология косячить на каких-нибудь экзотических системах.

            Цитата Prince @
            Как ты выводишь wav с частотами 44100/48000?
            Мне такие частоты не нужны, но я либо выводил с такой частотой, либо делал частоту в 2 раза меньше и брал среднее значение 2-х семплов :-?
              Цитата
              Я решил использовать A-law, u-law. Сделал пока u-law, но с u=15.

              :good:
              Цитата
              Тогда при малых амплитудах IRQ будет выполняться относительно быстро, а при больших – почти всё время между двумя IRQ. Ну или половину, если менять местами. Короче, это будет создавать тормоза, а профита мало, ИМХО.

              Не. прерывание пусть устанавливает триггер - значение в переменной. А программа проверяет это значение.
              Цитата
              Мы при каждом вызове IRQ меняем полярность на спикере, вот и получается писк с частотой дискретизации. Ты про эту частоту?

              Ну да.
              Цитата
              Хочу уточнить, не будет ли эта технология косячить на каких-нибудь экзотических системах.

              :-?
                Тут вон люди говорят, что мембрана динамика движется от одного края к другому примерно 60 мкс, т.е. меняя счётчик в пределах именно 75 (а это примерно 60 мкс и есть) мы можем управлять амплитудой динамика.
                https://wiki.osdev.org/PC_Speaker
                https://bumbershootsoft.wordpress.com/2016/...the-pc-speaker/

                Добавлено
                Цитата Prince @
                Не. прерывание пусть устанавливает триггер - значение в переменной. А программа проверяет это значение.
                Не совсем я понимаю эту технологию :)
                Каждый раз менять частоту срабатывания IRQ0, и там менять с 0 на 1 и наоборот? Т.е. в среднем частота вызова IRQ будет в 2 раза больше.
                Я правильно понял?
                  irq устанавливает значение в памяти ли регистре. Это триггер, сигнал для основного цикла программы. Триггер сбрасывается программой, на динамик подается 1, формируется программная задержка, динамик сбрасывается, снова ожидание триггера.

                  Добавлено
                  Цитата
                  Тут вон люди говорят, что мембрана динамика движется от одного края к другому примерно 60 мкс, т.е. меняя счётчик в пределах именно 75 (а это примерно 60 мкс и есть) мы можем управлять амплитудой динамика.

                  Как по мне, чепуха какая-то.
                    Цитата Prince @
                    irq устанавливает значение в памяти ли регистре. Это триггер, сигнал для основного цикла программы. Триггер сбрасывается программой, на динамик подается 1, формируется программная задержка, динамик сбрасывается, снова ожидание триггера.
                    Ясно. Но в этом случае фоновое воспроизведение невозможно, процессор будет постоянно занят циклами ожидания.

                    Цитата Prince @
                    Как по мне, чепуха какая-то.
                    Не знаю, не знаю.
                    Но то, что диффузор двигается не мгновенно – это факт.
                      Да факт-то факт. Только причем тут 60 мкс и всё остальное.
                      И инерционность подвижной части у разных динамиков и пищалок пьезо различается. И максимальный ход мембраны/катушки, и многое другое.
                      Благодаря инерционности подвижной части излучателя частота шим отчасти фильтруется, и это хорошо. Поэтому нужно повышать частоту шим, выводить её в диапазон, который динамик уже "не осилит". Попросту будет не успевать реагировать.
                      На динамике при шим присутствует постоянная составляющая(зависящая от скважности), отклоняющая мембрану в некоторое положение, и переменная с частотой шим, заставляющая мембрану "дрожать" около этого положения, заданного скважностью. Мембрана совершает "медленное" колебание в соответствии с изменением скважности импульсов, повторяя огибающую звука. На эти перемещения мембраны накладывается "дрожание" мембраны на частоте шим, с постоянной амплитудой, зависящей от параметров динамика и частоты шим.
                      На частоте 1 кГц для перекладки мембраны из одного крайнего положения в другое при воспроизведении синусоиды есть целая 500 мкс. На частоте 10 кГц - 50 мкс. В результате, за счёт инерционности подвижной системы, на разных частотах может быть разная фазовая задержка. Но, нужно ещё учитывать, что в реальных сигналах НЧ сигналы имеют большую амплитуду нежели ВЧ, поэтому мелкие перемещения на ВЧ занимают меньше времени. Но это такие дебри, зачем они нужны.
                      Допустим, время перекладки мембраны 60 мкс. Это означает, что частоту шим нужно выбирать нааамного выше 16 кГц или фильтровать на выходе с помощью фнч. По хорошему. Вот и всё. Так я думаю.

                      Добавлено
                      Цитата
                      Но в этом случае фоновое воспроизведение невозможно, процессор будет постоянно занят циклами ожидания.

                      Есть шанс поднять разрядность звука и частоту шим, посмотреть что будет. Вдруг комп "запоёт". Или хотя бы "заговорит". :scratch:
                      Сообщение отредактировано: Prince -
                        Пожалуй, амплитуда переменной составляющей тоже зависит от скважности.
                        И помимо частоты шим будут присутствовать ещё кучу лишних частот. :scratch:
                          Цитата Prince @
                          И инерционность подвижной части у разных динамиков и пищалок пьезо различается. И максимальный ход мембраны/катушки, и многое другое.
                          Согласен. Но видимо, в расчёт берётся некое среднее значение для динамика, наиболее распространённого на тот момент. Тенхология же придумана в конце 80-х. И судя по всему, тупо копировалась на протяжении долгого времени.
                          Кстати говоря, одинакова ли скорость хода мембраны в бе стороны? Тоже вопрос.
                          А что будет, если мы дадим запишем в порт 42 значение делители IRQ0 или близкое к нему? Тогда мембрана дойдёт до конца а обратно не успеет.

                          Цитата Prince @
                          На динамике при шим присутствует постоянная составляющая(зависящая от скважности), отклоняющая мембрану в некоторое положение, и переменная с частотой шим, заставляющая мембрану "дрожать" около этого положения, заданного скважностью. Мембрана совершает "медленное" колебание в соответствии с изменением скважности импульсов, повторяя огибающую звука. На эти перемещения мембраны накладывается "дрожание" мембраны на частоте шим, с постоянной амплитудой, зависящей от параметров динамика и частоты шим.
                          Как-то слишком сложно. В том плане, что нам нужно точно знать время перемещения мембраны + уметь точно управлять её ходом.

                          Цитата Prince @
                          Допустим, время перекладки мембраны 60 мкс. Это означает, что частоту шим нужно выбирать нааамного выше 16 кГц или фильтровать на выходе с помощью фнч. По хорошему. Вот и всё. Так я думаю.
                          Так, у нас в распоряжении 1.19 МГц. Мы начинаем перемещать мембрану в одно место, одновременно давая команду через X тиков начать возвращать её обратно. Но мне эта технология тоже кажется чересчур сомнительной из-за идеализации физических характеристик динамика.

                          Цитата Prince @
                          Есть шанс поднять разрядность звука и частоту шим, посмотреть что будет. Вдруг комп "запоёт". Или хотя бы "заговорит".
                          Скорость записи в ISA-порты довольно низкая (1-1.5 мкс), так что мы будем терять лишнее время ещё и на это, удлинняя каждый раз цикл на константное время.
                            Цитата
                            Как-то слишком сложно. В том плане, что нам нужно точно знать время перемещения мембраны + уметь точно управлять её ходом.

                            На самом деле не сложно.
                            Время перемещения слишком специфическая характеристика. Достаточно знать рабочий частотный диапазон излучателя(с ним связано время перемещения/инерционность), максимально допустимое напряжение(для компьютерной пищалки не особо акутально, но вообще важно, чтобы не повредить излучатель и избежать больших нелинейных искажений) и выбирать частоту ШИМ намного выше частотного диапазона излучателя. Вот и все. А ходом мембраны точно управляет ширина импульса ШИМ. Ширина импульса однозначно задает отклонение мембраны.
                            Т.е., вот эти 60 мкс или там 80, не нужны они, вообще, для каких-то расчётов.
                            Цитата
                            Так, у нас в распоряжении 1.19 МГц. Мы начинаем перемещать мембрану в одно место, одновременно давая команду через X тиков начать возвращать её обратно. Но мне эта технология тоже кажется чересчур сомнительной из-за идеализации физических характеристик динамика.

                            Мембрана переместится в положение, соответствующее среднему значению напряжения за период импульса ШИМ. А среднее напряжение за период прямо-пропорционально ширине импульса. А ширина импульса прямо-пропорциональна значению семпла. Получаем однозначную зависимость "значение семпла -> положение(величина отклонения) мембраны". В этом заключается принцип работы такого способа воспроизведения.
                            Повтор:
                            Ширина импульса за период соотвествует некоему среднему напряжению. Если такое напряжение(постоянное) подать на динамик - мембрана отклонится в определенное положение. Меняя ширину импульса - меняем положение мембраны. Поскольку ширина импульса соответствует значению семпла, меняя значение ширины импульса в соответствии со значениями семплов - заставляем мембрану повторять огибающую звука. Частота ШИМ фильтруется либо внешним ФНЧ(обычно и по хорошему) или инерционностью динамика. Поэтому частоту ШИМ нужно выбирать большую. Проще отфильтровать, меньше искажений звука.

                            Частота ШИМ в случае с таймером и пищалкой не 1.19 МГц. Это частота тактового генератора. А частота импульсов ШИМ формируется 0 каналом таймера и равна 1.19 / 75(54 и так далее). Частота ШИМ оказывается в рабочем диапазоне и воспроизводится динамиком. В этом и проблема. В том что частота ШИМ у нас всего лишь 16 кГц, а разрядность где-то 5-6 бит.
                            А, да. Тут могут и всплыть те 60 мкс, в смысле что такая низкая частота ШИМ может "телипать" мембрану от края до края, вызывая большие искажения. Но такую ситуацию и так можно предположить, без 60 мкс, поскольку частота в пределах рабочего диапазона излучателя. Куда ещё притулить эти мкс не знаю.
                            Почему я и подумал о программном способе формирования задержек. Если частоту ШИМ поднять, к примеру, с 16 до хотя бы 32 кГц, а разрядность до 8 бит, частота задающего генератора должна быть 32*256=8192 кГц. Программно нужно уметь формировать задержку, кратную 122 нс.
                            Семпл менять не на каждый импульс ШИМ, а на каждый 4. Частота дискретизации будет 8 кГц, стандартная для передачи голоса и можно будет попробовать гонять wav-ки с такой частотой. Вопрос упрётся в быстродействие системы и допустимую частоту вывода в 61 порт.

                            Добавлено
                            По такой технологии работают усилители D-класса. в смысле, ШИМ импользуют.
                            Сообщение отредактировано: Prince -
                              Хотя зачем каждый 4 импульс. Это будет дополнительная проверка в программе. Не могу проверить идею, не на чем и нечем.
                                Цитата Prince @
                                Ширина импульса за период соотвествует некоему среднему напряжению. Если такое напряжение(постоянное) подать на динамик - мембрана отклонится в определенное положение. Меняя ширину импульса - меняем положение мембраны. Поскольку ширина импульса соответствует значению семпла, меняя значение ширины импульса в соответствии со значениями семплов - заставляем мембрану повторять огибающую звука. Частота ШИМ фильтруется либо внешним ФНЧ(обычно и по хорошему) или инерционностью динамика. Поэтому частоту ШИМ нужно выбирать большую.
                                Не понимаю, как это работает в отрыве от скорости перемещения мембраны.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0686 ]   [ 17 queries used ]   [ Generated: 29.03.24, 04:51 GMT ]