Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.1.232] |
|
Сообщ.
#1
,
|
|
|
Друзья!
Кто выводил семплы (WAV'ки) через спикер ШИМом (под DOS)? Делитесь опытом! Причём, нужен опыт тех, кто копал глубоко. Итак, стандартный код инициализации таймера: 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, не все, конечно, но прилично). И везде вот такая таблица: ; 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 Но почему же она используется в плеерах ДЛЯ ЛЮБЫХ частот дискретизации? И для 11 кГц, и для 22 кГц. Неужели все авторы так жёстко тупят? 2. Почему используется такая синусоидальная таблица, а не линейное значение? Типа: ; 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. Пишешь меньше (даже при более высокой частоте дискретизации) – звук становится тише, пишешь больше (даже при низкой частоте дискретизации) – начинает хрипеть |
Сообщ.
#2
,
|
|
|
Цитата Ведь как это работает? Когда мы пишем в этот порт, на спикер подаётся 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 Кбайт, скачиваний: 1384) |
Сообщ.
#3
,
|
|
|
Цитата Prince @ Ух ты, ёжкин кот, наконец-то нормальный ответ по этой теме! Спасибо! А есть какая-то формула этого безобразия? Это не синус оказывается, а ломаная.Таблица для компандирования/компрессирования 8 битного аудио. И всё же получается, что эту таблицу нужно масштабировать под делитель частоты дискретизации (под тот самый IRQ0_CNT, что я писал выше), т.к. эта сделана под 16 кГц. Т.е. если будет 22 кГц, то верхним значением будет не 75, а 54. И т.д. Правильно я понимаю? Цитата Prince @ А смысл? Это ж мне надо IRQ0 дёргать с частотой 1 МГц, что скорее всего медлительность обращения к ISA-портам мне не даст (там задержка порядка 1 мкс или даже ближе к 1.5 мкс). Когда это можно программно всё сделать.Можешь попробовать сделать программный шим, все задержки формировать программно(или как вариант, только интервалы ШИМ, а частоту дискретизации оставить на таймере) и дергать динамик через 61 порт. Про вопросы 3, 4 чего-нибудь знаешь? Ну и правильно ли я понимаю, что масштабировать можно не от 1, а он 0, а... Цитата Jin X @ при нуле, как я понимаю, можно просто ничего не писать в 42-й порт, там как была 1, так и останется... И такой ещё вопрос: избавиться от писка на малых частотах (8-11 кГц) можно только повышением частоты? |
Сообщ.
#4
,
|
|
|
Цитата Правильно я понимаю? В общем, да. Только таблица - график зависимости уровня выходного сигнала от уровня входного. Масштабируется под максимальное значение семпла, а не под частоту дискретизации. То что в данном случае, максимальное значение зависит от частоты дискретизации - досадный технический ньюанс. Переведи значения в dB и кажущаяся зависимость пропадёт. Цитата А есть какая-то формула этого безобразия? ...я не знаю, что за формула. Может быть логарифмирующий усилитель ... На первый взгляд, на графике вырисовываются две прямые с разными углами наклона. Сначала идёт усиление где-то на 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? |
Сообщ.
#5
,
|
|
|
Цитата Prince @ Это понятно, но в данном случае у нас значение семпла как раз регулируется делителем счётчика Только таблица - график зависимости уровня выходного сигнала от уровня входного. Масштабируется под максимальное значение семпла, а не под частоту дискретизации. То что в данном случае, максимальное значение зависит от частоты дискретизации - досадный технический ньюанс. Цитата Prince @ Я решил использовать A-law, u-law. Сделал пока u-law, но с u=15....я не знаю, что за формула. Может быть логарифмирующий усилитель Цитата Prince @ Тогда при малых амплитудах IRQ будет выполняться относительно быстро, а при больших – почти всё время между двумя IRQ. Ну или половину, если менять местами. Короче, это будет создавать тормоза, а профита мало, ИМХО.Я имел в виду, что irq0 будет отвечать за частоту дискретизации как и сейчас, а задержку ШИМ формировать циклами, при участии счётчика TSC. Программно. Какую частоту обновления допускает 61 порт, не в курсе. Цитата Prince @ Мы при каждом вызове IRQ меняем полярность на спикере, вот и получается писк с частотой дискретизации. Ты про эту частоту?Если на динамик подать частоту слышимого диапазона, то её будет слышно. Цитата Prince @ Стандартный код: записать младший байт (1) и старший (0), затем подготовить счётчик к периодической записи младших байтов. Вопрос в том, что первую часть можно не делать. Я спроисл одно чела, мол, по сути этот блок не нужен, а он говорит, что типа нужно же в старший байт положить ноль. А я говорю, что про записи только младшего байта старший начинает тоже декрементироваться почти синхронно с младшим. Хочу уточнить, не будет ли эта технология косячить на каких-нибудь экзотических системах.Таймер сначала настраивается, один раз: установить режим 0 для 2 канала, использовать в работе только младший байт... Цитата Prince @ Мне такие частоты не нужны, но я либо выводил с такой частотой, либо делал частоту в 2 раза меньше и брал среднее значение 2-х семплов Как ты выводишь wav с частотами 44100/48000? |
Сообщ.
#6
,
|
|
|
Цитата Я решил использовать A-law, u-law. Сделал пока u-law, но с u=15. Цитата Тогда при малых амплитудах IRQ будет выполняться относительно быстро, а при больших – почти всё время между двумя IRQ. Ну или половину, если менять местами. Короче, это будет создавать тормоза, а профита мало, ИМХО. Не. прерывание пусть устанавливает триггер - значение в переменной. А программа проверяет это значение. Цитата Мы при каждом вызове IRQ меняем полярность на спикере, вот и получается писк с частотой дискретизации. Ты про эту частоту? Ну да. Цитата Хочу уточнить, не будет ли эта технология косячить на каких-нибудь экзотических системах. |
Сообщ.
#7
,
|
|
|
Тут вон люди говорят, что мембрана динамика движется от одного края к другому примерно 60 мкс, т.е. меняя счётчик в пределах именно 75 (а это примерно 60 мкс и есть) мы можем управлять амплитудой динамика.
https://wiki.osdev.org/PC_Speaker https://bumbershootsoft.wordpress.com/2016/...the-pc-speaker/ Добавлено Цитата Prince @ Не совсем я понимаю эту технологию Не. прерывание пусть устанавливает триггер - значение в переменной. А программа проверяет это значение. Каждый раз менять частоту срабатывания IRQ0, и там менять с 0 на 1 и наоборот? Т.е. в среднем частота вызова IRQ будет в 2 раза больше. Я правильно понял? |
Сообщ.
#8
,
|
|
|
irq устанавливает значение в памяти ли регистре. Это триггер, сигнал для основного цикла программы. Триггер сбрасывается программой, на динамик подается 1, формируется программная задержка, динамик сбрасывается, снова ожидание триггера.
Добавлено Цитата Тут вон люди говорят, что мембрана динамика движется от одного края к другому примерно 60 мкс, т.е. меняя счётчик в пределах именно 75 (а это примерно 60 мкс и есть) мы можем управлять амплитудой динамика. Как по мне, чепуха какая-то. |
Сообщ.
#9
,
|
|
|
Цитата Prince @ Ясно. Но в этом случае фоновое воспроизведение невозможно, процессор будет постоянно занят циклами ожидания.irq устанавливает значение в памяти ли регистре. Это триггер, сигнал для основного цикла программы. Триггер сбрасывается программой, на динамик подается 1, формируется программная задержка, динамик сбрасывается, снова ожидание триггера. Цитата Prince @ Не знаю, не знаю.Как по мне, чепуха какая-то. Но то, что диффузор двигается не мгновенно – это факт. |
Сообщ.
#10
,
|
|
|
Да факт-то факт. Только причем тут 60 мкс и всё остальное.
И инерционность подвижной части у разных динамиков и пищалок пьезо различается. И максимальный ход мембраны/катушки, и многое другое. Благодаря инерционности подвижной части излучателя частота шим отчасти фильтруется, и это хорошо. Поэтому нужно повышать частоту шим, выводить её в диапазон, который динамик уже "не осилит". Попросту будет не успевать реагировать. На динамике при шим присутствует постоянная составляющая(зависящая от скважности), отклоняющая мембрану в некоторое положение, и переменная с частотой шим, заставляющая мембрану "дрожать" около этого положения, заданного скважностью. Мембрана совершает "медленное" колебание в соответствии с изменением скважности импульсов, повторяя огибающую звука. На эти перемещения мембраны накладывается "дрожание" мембраны на частоте шим, с постоянной амплитудой, зависящей от параметров динамика и частоты шим. На частоте 1 кГц для перекладки мембраны из одного крайнего положения в другое при воспроизведении синусоиды есть целая 500 мкс. На частоте 10 кГц - 50 мкс. В результате, за счёт инерционности подвижной системы, на разных частотах может быть разная фазовая задержка. Но, нужно ещё учитывать, что в реальных сигналах НЧ сигналы имеют большую амплитуду нежели ВЧ, поэтому мелкие перемещения на ВЧ занимают меньше времени. Но это такие дебри, зачем они нужны. Допустим, время перекладки мембраны 60 мкс. Это означает, что частоту шим нужно выбирать нааамного выше 16 кГц или фильтровать на выходе с помощью фнч. По хорошему. Вот и всё. Так я думаю. Добавлено Цитата Но в этом случае фоновое воспроизведение невозможно, процессор будет постоянно занят циклами ожидания. Есть шанс поднять разрядность звука и частоту шим, посмотреть что будет. Вдруг комп "запоёт". Или хотя бы "заговорит". |
Сообщ.
#11
,
|
|
|
Пожалуй, амплитуда переменной составляющей тоже зависит от скважности.
И помимо частоты шим будут присутствовать ещё кучу лишних частот. |
Сообщ.
#12
,
|
|
|
Цитата Prince @ Согласен. Но видимо, в расчёт берётся некое среднее значение для динамика, наиболее распространённого на тот момент. Тенхология же придумана в конце 80-х. И судя по всему, тупо копировалась на протяжении долгого времени.И инерционность подвижной части у разных динамиков и пищалок пьезо различается. И максимальный ход мембраны/катушки, и многое другое. Кстати говоря, одинакова ли скорость хода мембраны в бе стороны? Тоже вопрос. А что будет, если мы дадим запишем в порт 42 значение делители IRQ0 или близкое к нему? Тогда мембрана дойдёт до конца а обратно не успеет. Цитата Prince @ Как-то слишком сложно. В том плане, что нам нужно точно знать время перемещения мембраны + уметь точно управлять её ходом.На динамике при шим присутствует постоянная составляющая(зависящая от скважности), отклоняющая мембрану в некоторое положение, и переменная с частотой шим, заставляющая мембрану "дрожать" около этого положения, заданного скважностью. Мембрана совершает "медленное" колебание в соответствии с изменением скважности импульсов, повторяя огибающую звука. На эти перемещения мембраны накладывается "дрожание" мембраны на частоте шим, с постоянной амплитудой, зависящей от параметров динамика и частоты шим. Цитата Prince @ Так, у нас в распоряжении 1.19 МГц. Мы начинаем перемещать мембрану в одно место, одновременно давая команду через X тиков начать возвращать её обратно. Но мне эта технология тоже кажется чересчур сомнительной из-за идеализации физических характеристик динамика.Допустим, время перекладки мембраны 60 мкс. Это означает, что частоту шим нужно выбирать нааамного выше 16 кГц или фильтровать на выходе с помощью фнч. По хорошему. Вот и всё. Так я думаю. Цитата Prince @ Скорость записи в ISA-порты довольно низкая (1-1.5 мкс), так что мы будем терять лишнее время ещё и на это, удлинняя каждый раз цикл на константное время. Есть шанс поднять разрядность звука и частоту шим, посмотреть что будет. Вдруг комп "запоёт". Или хотя бы "заговорит". |
Сообщ.
#13
,
|
|
|
Цитата Как-то слишком сложно. В том плане, что нам нужно точно знать время перемещения мембраны + уметь точно управлять её ходом. На самом деле не сложно. Время перемещения слишком специфическая характеристика. Достаточно знать рабочий частотный диапазон излучателя(с ним связано время перемещения/инерционность), максимально допустимое напряжение(для компьютерной пищалки не особо акутально, но вообще важно, чтобы не повредить излучатель и избежать больших нелинейных искажений) и выбирать частоту ШИМ намного выше частотного диапазона излучателя. Вот и все. А ходом мембраны точно управляет ширина импульса ШИМ. Ширина импульса однозначно задает отклонение мембраны. Т.е., вот эти 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-класса. в смысле, ШИМ импользуют. |
Сообщ.
#14
,
|
|
|
Хотя зачем каждый 4 импульс. Это будет дополнительная проверка в программе. Не могу проверить идею, не на чем и нечем.
|
Сообщ.
#15
,
|
|
|
Цитата Prince @ Не понимаю, как это работает в отрыве от скорости перемещения мембраны. Ширина импульса за период соотвествует некоему среднему напряжению. Если такое напряжение(постоянное) подать на динамик - мембрана отклонится в определенное положение. Меняя ширину импульса - меняем положение мембраны. Поскольку ширина импульса соответствует значению семпла, меняя значение ширины импульса в соответствии со значениями семплов - заставляем мембрану повторять огибающую звука. Частота ШИМ фильтруется либо внешним ФНЧ(обычно и по хорошему) или инерционностью динамика. Поэтому частоту ШИМ нужно выбирать большую. |
Сообщ.
#16
,
|
|
|
Это работает, потому что на практике используют ФНЧ на выходе, а после него обычный аудио сигнал получается.
В данном конкретном случае, мысленно представить перемещения мембраны проблематично из-за низкой частоты ШИМ и отсутствия фильтрации. Мембрану колбасит жутко, в этом конкретном случае. Спектр сигнала, подаваемый на излучатель, очень грязный. Но практически ШИМ используют с большой передискретизацией и с ФНЧ на выходе. И после ФНЧ на излучателе обычный аудио сигнал, низкочастотный. И потому это работает. По ссылке, что ты приводил, человек рассказывает о своём опыте применения широтно-импульсной модуляции. У него отправная точка в рассуждениях - это инерционность мембраны. Время перекладки 60 мкс я не знаю откуда он взял. Да и не суть это конкретное значение. Он пришёл к заключению: для того, чтобы мембрана не упиралась в крайние положения за время импульса ШИМ, а могла занимать промежуточные положения, заданные шириной импульса, частота ШИМ, подаваемая на пищалку, должна быть выше 16 кГц(период 60 мкс). 16 кГц(60 мкс) - частный и очень условный пограничный случай. Ну как бы меньше уже просто ну вообще никак нельзя. На 16 КГц при полной ширине импульса мембрану будет "мотылять" до упора. Но её всё равно "мотыляет", больше, меньше, как получится. Скорости в расчётах у него нет. Обычный ШИМ. Алгоритм тот же что у тебя. А вывод(мой) - нужно повышать частоту ШИМ. Вот картинка. Зеленая линия - оригинальная синусоида. Красным - сигнал ШИМ, частично "сглаженный" конденсатором(емкостью пьезоизлучателя). Угадывается некая средняя линия, повторяющая синус, на неё накладывается высокочастотная "борода". Дополнительно "борода" сгладится ещё немного механической инерционностью излучателя. Просто для наглядности, чтобы приблизительно представить, какой сигнал на пищалку поступает. Если бы использовался ФНЧ, на излучателе была бы синусоида. Прикреплённый файлPWM.jpg (194,94 Кбайт, скачиваний: 1065) |