Вверх ↑
Этот топик читают: Гость
Ответов: 499
Рейтинг: 1
#1: 2009-04-30 02:54:19 ЛС | профиль | цитата
озадачился я написанием программы, которая имитирует работу PPM-кодера для 8-ми канального радиопередатчика (входные данные идут с обычного джойстика) и выдает сигнал на звуковую карту. далее он снимается и передается в передающий модуль. с железом проблем нет, передатчик есть в наличии, ждет PPM-сигнал. джойстик есть, и даже есть часть программы, которая опрашивает джой и выдает цифровые значения согласно положению осей.

а вот с созданием синтезатора подобного типа в hiasm-е не сталкивался. может кто подскажет, хотя бы на примере одного канала, как сгенерировать прямоугольный звуковой сигнал с изменяемой длительностью импульса, и какое разрешение получится на обычной звукой карточке?

p.s.
немного о самом формате:
В PPM-кодере каждый канал задается импульсом, длительностью от 700 до 2200 мкс. Границы могут немного варьироваться, в зависимости от конкретной модели аппаратуры. Среднему положению рулевой машинки соответствует импульс длительностью около 1500 мкс. Все канальные импульсы объединяются в последовательность и передаются каждые 18-20 мс. Пауза между передачей служит для синхронизации.

а вот здесь более детальная картинка PPM-фрейма: http://www.aerodesign.de/peter/2000/PCM/frame_ppm.gif
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#2: 2009-04-30 09:42:42 ЛС | профиль | цитата
соединяем BASS_StreamCreate с обычной ячейкой памяти - Menory - и через нужные промежутки времени пеняем значение с 1 на 0 и наоборот.
карма: 27
0
Ответов: 8930
Рейтинг: 823
#3: 2009-04-30 10:14:15 ЛС | профиль | цитата
HikeR, небольшие задержки на пути джойстик-выход звука неизбежны, не будут-ли мешать?
карма: 19

0
Ответов: 499
Рейтинг: 1
#4: 2009-05-01 03:42:26 ЛС | профиль | цитата
Леонид писал(а):
небольшие задержки на пути джойстик-выход звука неизбежны

ну, принцип такой. один раз в 20мс (период одного фрейма) опрашивается джойстик или иное устройство, положения осей запоминаются. далее простая математика, пересчитать положения в значения от 1 до 2 мс. в этих процедурах задержки настолько малы, что в миллисекундах не измеряются. компонент TimeCounter на весь цикл опроса джоя, пересчета и вывода значений на форму дает что-то около 500-900 мкс, но выводить цифры на экран с такой частотой совершенно не нужно. при отключении вывода совсем и опроса таймера раз в секунду получается 20-30 мкс.
возможно дальше что-то и изменится (после добавления схемы синтезатора), но не думаю, что это будет больше времени реакции человека ;)

------------ Дoбавленo в 06.10:
Dilma писал(а):
через нужные промежутки времени пеняем значение с 1 на 0 и наоборот.

1 - это очень мало, как я понял из описания точки Data компонента BASS_StreamCreate. он просит 2-х байтовой число, то есть 0-65535.

однако чем генерировать управляющие переключением импульсы в одну микросекунду? то есть максимальная длительность одного импульса - одна миллисекунда, но разрешение у аппаратуры 512-1024, нужно передавать минимум 1 мкс сигнал. вот такая схема работает пару секунд и закрывается, даже если запускать в отдельном потоке, почему? Sleep дает задержку в 100 мкс (меньше просто сразу вылетает), Switch содержит 2 значения, 0 и 32767.

карма: 0

0
Ответов: 8930
Рейтинг: 823
#5: 2009-05-01 08:40:03 ЛС | профиль | цитата
[b]HikeR[/b], задержку в такой схеме надо делать

Add(Thread,2049809,406,224)
{
Delay=1
Point(doDelay)
}

, учитывая, что к выставленному времени прибавляется время выолнения ветки. Звук работает через буфер, именно поэтому может быть запаздывание между нажатием кнопки и выходом звуковой карты.
карма: 19

0
Ответов: 2125
Рейтинг: 159
#6: 2009-05-01 15:43:14 ЛС | профиль | цитата
HikeR писал(а):
однако чем генерировать управляющие переключением импульсы в одну микросекунду?

Ни одна программа, выводящая звук, не генерирует его синхронно. Сначала генерируется буфер, а потом он передаётся посредством используемого API звуковой карте. Главное - вовремя передавать подготовленные данные, т.е. когда используемое API (например BASS в нашем случае) проинформирует о том, что данные кончаются.

Одна микросекунда - слишком малое время. Если каждую микросекунду менять сигнал с 1 на 0 и наоборот, то получишь частоту 500КГц. Вывод сигнала такой частоты через звуковую карту не имеет смысла (да и невозможно). Если тебе нужно вывести импульс длинной 700 мкс, то при частоте дискретизации 44100Гц это будет соответствовать приблизительно 30 сэмплам в буфере (30/44100Гц ~ 680мкс). Данные нужно готовить для всех импульсов в одном буфере. Т.е. твоя задача каждые 20мс передавать на воспроизведение буфер с подготовленными таким образом данными.
карма: 1

0
Гость
Ответов: 17029
Рейтинг: 0
#7: 2009-05-01 17:44:50 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2025-01-10 04:30:04
карма: 0

0
Ответов: 2125
Рейтинг: 159
#8: 2009-05-01 18:01:08 ЛС | профиль | цитата
HikeR писал(а):
библиотека bass справится с таким?

Это надо у пользователей этой библиотеки спросить

HikeR писал(а):
каждые 2 байта описывают уровень сигнала (то есть высокий или низкий уровень). это так?

Да, 2 байта это моно 16 бит или стерео 8 бит.
Если у тебя есть синхропауза, то наверное можно и более короткий пакет передавать.

А девайс не может цифровые данные принимать?
карма: 1

0
Гость
Ответов: 17029
Рейтинг: 0
#9: 2009-05-01 19:34:05 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2025-01-10 04:30:04
карма: 0

0
Ответов: 8930
Рейтинг: 823
#10: 2009-05-01 19:44:51 ЛС | профиль | цитата
HikeR, я так и не смог в HiAsm-е получить 24-битный звук, хотя карта и BASS версии 2.4 его потдерживает. Ткое управление, как Вам надо, через звук, легче нарисовать в IC. Но мне кажется (тьфу, тьфу ) проще через LPT, в простых схемах он может работать с частотой обращения аж 1 МГц и свои миллисекунды там сделаете просто (если перед включением компьютера по совету Galkov-а заземлите Error )
карма: 19

0
Гость
Ответов: 17029
Рейтинг: 0
#11: 2009-05-01 20:24:28 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2025-01-10 04:30:05
карма: 0

0
Ответов: 8930
Рейтинг: 823
#12: 2009-05-01 21:44:45 ЛС | профиль | цитата
HikeR, 0 и 5 вольт при не очень больших нагрузках, до 5-10 мА.
карма: 19

0
Ответов: 499
Рейтинг: 1
#13: 2009-05-01 22:02:20 ЛС | профиль | цитата
привести напряжение к требуемому конечно не проблема, но вот к удивлению своему не обнаружил дома ни одного компа с LPT-портом
а учитывая то, что юзать собирался с ноутом, в которых lpt довольно давно нет совсем, остается только usb-lpt переходники. а как у них со скростью передачи?
карма: 0

0
Ответов: 8930
Рейтинг: 823
#14: 2009-05-02 08:49:18 ЛС | профиль | цитата
HikeR, никогда не пользовал
карма: 19

0
Ответов: 3851
Рейтинг: 159
#15: 2009-05-02 13:46:42 ЛС | профиль | цитата
складывается примерно такая картинка:
1. по таймеру 20 мс опрашивается джой и формируемая по его состоянию байтовая последовательность (без синхропаузы) посылается в FTCG-контейнер для модуляции..
2. FTCG побайтно подставляет принятую последовательность до её окончания, а затем подставляет "1" (это и есть синхропауза) до получения новой последовательности..

карма: 0
начавший
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)