Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.05;
Скачать: CL | DM;

Вниз

Как проиграть звук через sound blaster   Найти похожие ветки 

 
zirus ©   (2003-04-03 06:38) [0]

Надо чтобы было 2 буффера заданной длины(пусть будет 1024 байта); 1й буффер закончился - программа получила сообщение, что его можно заполнять новыми данными(то же самое и со вторым буффером), частота дискретизации задаётся вручную - любое значение, разрядность 8/16 бит, моно. Как такое можно организовать?


 
Digitman ©   (2003-04-03 08:37) [1]

смотри спецификацию Microsoft DirectSound


 
Ruslan Solovyev ©   (2003-04-03 09:41) [2]

см MSDN:

waveOutOpen, waveOutPrepareHeader, waveOutWrite.

т.е.:

открываеш: waveOutOpen
создаеш 2 буффера: waveOutPrepareHeader
посылаеш оба буфера: waveOutWrite

когда буффер проигрался - получаеш нотификацию (CallBack параметр в waveOutOpen) -
готовиш буффер снова и waveOutWrite

etc.



 
zirus ©   (2003-04-03 11:06) [3]

Всё сделано, но есть одно "но":
Рисуем, например меандр(квадратные импульсы 1-0-1-0)
Записываем sound forge-м
Смотрим на график звука - и что же видим?
Звук сильно искажается, т.е. переход из +1 в 0 не квадратный, а такой:
Линия идёт из 100 в 0, идёт до -5, до +4, до -3... т.е. по затухающей синусоиде. Из 0 в 100 нарастает тоже не мгновенно: -1 +2, -3, +4, -5, +100.
Запись веду из stereomixer.
Искажения наблюдаются не только при меандре.
Как можно решить проблему искажений?


 
Digitman ©   (2003-04-03 11:43) [4]

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


 
zirus ©   (2003-04-03 12:00) [5]

НЕТ! фаза здесь не при чём! искажения происходят не между буфферами, а внутри них! то есть в одном буффере несколько периодов меандра, но на каждом периоде - одни и те же искажения.

Так... Обращаюсь к знающим людям:
Я рассчитал спектр меандра(на бумажке), сгенерировал его из синусоид. График сгенерированного меандра получился очень похож на тот, что записал мне sound forge! Тогда искажения происходят из-за ограничения верхней частоты 22050Гц. Правда, при суммировании гармоник до 22050Гц - график более похож на меандр, а если гармоники суммировать до 11025Гц - то как раз наблюдаемая картина... Мои рассуждения верны насчёт того, что искажения из-за ограниченной полосы пропускания бластера? Кстати: винамп при проигровании меандра даёт такие же искажения...


 
Digitman ©   (2003-04-03 12:11) [6]


> zirus


А скажи, зачем такие сложности - генератор меандр-функции, синтезирующий последнюю по спектральному методу ? Почему не реализовать простую булеву функцию от времени ? Чем обоснован выбор именно алгоритма гармонического синтеза ?


 
zirus ©   (2003-04-03 16:38) [7]

Нет, это я просто изучал спектры, то есть расчитывал, как будет выглядеть меандр, если обрезать его гармоники до 20 кГц! Почему такие искажения?


 
Digitman ©   (2003-04-04 08:53) [8]

приведи-ка здесь свои расчеты


 
MBo ©   (2003-04-04 09:05) [9]

>Почему такие искажения?
А что удивительного?
Спектр меандра - бесконечный ряд, выглядящий, ксли не ошибаюсь, так:
A1*sin(x)+A3*Sin(3x)+A5*sin(5x)....
(Ряд Фурье)
Если наложить на него окно, обрезав высшие гармоники, и сделать обратное Фурье преобразование, низшие гармоники будут нескомпенсированы, и будут биения вблизи перехода.



Страницы: 1 вся ветка

Текущий архив: 2003.06.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
1-13160
KIE
2003-05-14 15:41
2003.06.05
Delphi и и Excel


3-13072
Nikos
2003-05-17 13:05
2003.06.05
Как программным путем создать алиас?


1-13207
NAlexey
2003-05-27 10:21
2003.06.05
Чем можно заменить


8-13335
Mihan
2003-02-22 17:28
2003.06.05
как перерисовать экран


3-13025
Юрий
2003-05-15 16:36
2003.06.05
Paradox на другой машине