Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Звук и запись звука [D7, WinXP]


Vovan#2 ©   (2006-11-26 17:50:00) 

Изучаю эту тему. Пока стоит задача - записать звук (проиграть звук) и визуально это показать. Использую Waveform Audio. Звук, соотсветсвенно, в PCM формате. Ответьте, пожалуйства, на следующие вопросы:

1) Как последовательность семплов преобразуется в звук? Я не понимаю связи между характеристиками семпла (а это всего лишь 8-битное или 16-битное число) и звуком, который есть по сути волна. Каким будет звук, если на выход подавать постоянно один и тот же семпл?

2) (запись) Не совсем понимаю, что будет давать callback-функция (или же событие). Я так понимаю, что звук получается аудиоустройством постоянно. Но функция не может ведь вызываться 44100 или укзанную частоту раз в секунду. Поэтому аудиоустройству я даю некий буфер, куда он пишет уже дискретный сигнал. Вот как окнретно он пишет?


Jeer   (2006-11-30 09:43:00) [1]


> Но можешь и среднее значение посчитать, будет лучше.


Среднее нельзя считать - искажение формы сигнала.
Но можно скользящее среднее - тогда будет фильтрация и не будет интерференции.


Сергей М.   (2006-11-30 09:19:00) [2]


> Показать 44,1 тысячи на экране за секунду - это с какой
> скоростью надо прокручивать ленту.


А зачем показывать всю секунду ?
Покажи, например, десятую ее долю, тогда и обрабатывать нужно будет не 44 килосэмплов, а всего лишь 4


Pavia   (2006-11-29 20:19:00) [3]

Да так и делается. Хотя также часто выводят не саму волну, а ее частотную характеристику- спектр. А это уже Быстрыое Преобразование Фурье (БПФ/FFT). ;-)


Vovan#2   (2006-11-29 20:04:00) [4]

То есть, чудес тут не придумали никаких? Брать каждый n-ый или среднее из n - так и делается?


Pavia   (2006-11-29 19:54:00) [5]

Допустим будем выводить волну в прямоугольнике длиной 100 пикселей, на одном кадре 100 семплев. Тогда если мы сожмем еще в 100 раз получи 4,41 кадра в секунду. Ну что приемлемо.
Ты хочешь только отобразить, поэтому можешь взять 100-й, от этого ничего не измениться. Но можешь и среднее значение посчитать, будет лучше.


Vovan#2   (2006-11-29 19:22:00) [6]

> Бери каждый 10-й, 100-й, etc

Может лучше среднее из 10?

> Как связано число сэмплов со скоростью их "визуализации" в том или ином виде?

Напрямую. Частота дискретизации - количество семплов в секунду. По-простому каждый семпл - вертикальная линия в один пиксель в ширину. Показать 44,1 тысячи на экране за секунду - это с какой скоростью надо прокручивать ленту.


Сергей М.   (2006-11-29 11:42:00) [7]


> Но семплов много и получается слишком быстро бегущее изображение


Не понял ...

Как связано число сэмплов со скоростью их "визуализации" в том или ином виде ?


Jeer   (2006-11-29 11:39:00) [8]


> Как бы сжать эту волну?


Бери каждый 10-й, 100-й, etc


homm   (2006-11-29 11:35:00) [9]

> Т.е. 16 бит - это на самом деле 8 бит вверх и 8 вниз?

LOL


Vovan#2   (2006-11-29 11:20:00) [10]

Ладно, чёрт с ним. Разобрался я сейчас, теперь не подловите.

Расскажите, лучше, как поступать с таким. Я отображаю семплы на экране ввиде бегущей гистограммы, которая с некоторой погрешностью и задержкой отображает ситуацию в real-time. Но семплов много и получается слишком быстро бегущее изображение. Кроме того, в нём явно много лишней информации. Как бы сжать эту волну?


Сергей М.   (2006-11-29 10:39:00) [11]


> Одно дело в аналоговый звук, а другое - оцифрованный


Когда фигурируют "сэмплы", ни о каком "аналоговом звуке" не может идти и речи.


> спутал семплы с нотами


Это из-за отсутствия четкого для себя определения и понимания каждого из этих терминов.


Vovan#2   (2006-11-28 19:34:00) [12]

> Господа, сейчас, что физику в школе совсем престали преподавать?????

Ну не надо так. Одно дело в аналоговый звук, а другое - оцифрованный. Я спутал семплы с нотами - вот моя беда.


Дмитрий Белькевич   (2006-11-28 03:56:00) [13]

>За рисунки спасибо. Значит, если я буду подавать семплы одной синусоидой, то получу некий тон (п-и-и-и-п). Круто.

Господа, сейчас, что физику в школе совсем престали преподавать?????

>Нет. 16бит это обыкновенное знаковое число

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


Pavia   (2006-11-27 22:17:00) [14]

Вот табличка сравнения 8 бит и 16 бит

|Data format| Maximum value | Minimum value |Midpoint value |
|8-bit PCM  |   255 ($FF)   |     0         |  128 ($80)    |
|16-bit PCM |32,767 ($7FFF) | -32,768($8000)|     0         |

Тоесть для 8бит нужно брать тип Byte, а для 16 SmallInt.

> 16 бит - это на самом деле 8 бит вверх и 8 вниз?

Нет. 16бит это обыкновенное знаковое число. Отрицательный числа в компьюторе храняться в дополненном коде, не буду уточнять что ето такое сам найдешь в интернете.

> И ещё такой вопрос. Звук с разных каналов пишется последовательно,
>  т.е. семпл с одного канала, за ним семпл с другого?

Да именно так.


Vovan#2   (2006-11-27 20:56:00) [15]

И ещё такой вопрос. Звук с разных каналов пишется последовательно, т.е. семпл с одного канала, за ним семпл с другого?


Vovan#2   (2006-11-27 20:56:00) [16]

Теперь такой вопрос. Допустим, семпл у нас 16-битный. Если приравнять семпл типу SmallInt (знаковый), то получается, что положение равновесия у нас при 0? Т.е. 16 бит - это на самом деле 8 бит вверх и 8 вниз?


Pavia   (2006-11-26 23:48:00) [17]

Да именно так, если подать синусоиду, то будет некоторый звук.

Лучше завести несколько буферов напомню точно сколько рекомендуют но где-то так от 4 до 10. Тогда если буфер заполниться устройство будет писать в следующий а не будет простаивать(терять данные). Как только буфер заполнился вызывается Callback функция. В ней ты копируешь данные к себе обрабатываешь их. Буфер нужно освободить и создаешь заново это нужно что бы с экономить память.


Vovan#2   (2006-11-26 23:24:00) [18]

2 Pavia:

За рисунки спасибо. Значит, если я буду подавать семплы одной синусоидой, то получу некий тон (п-и-и-и-п). Круто.

Про буфер. Теперь понятно. Callback вызывается только когда буфер заполнится. Мне бы по-хорошему скопировать его себе в другой буфер и разбираться, а устройство пусть по новой пишет в первый, так?


Pavia   (2006-11-26 22:18:00) [19]

1.Сэмпл - это значение волны в данный момент времени.
Если представить волну в виде графика, то она будет выглядеть так рис1,рис2,рис3.
По оси X время. Тогда отложим значение сэмпла по оси Y. То есть каждый очередной сэмпл описывает ступеньку.
Из этих ступеник и получается волна.  Рис1 это 8бит значение сэмпла. А рис2 это таже волна но уже 16бит.
Каким будет звук, если на выход подавать постоянно один и тот же семпл?
Смотри рис3 никаких волн нет это прямая. Или это множества все возможных гармоник.
Ты ничего не услышишь. Услышишь только тишину.

рис1

Y
^
|    ----          ----          -
|  --    --      --    --      --
| -        -    -        -    -
|-          ----          ----
+--------------------------------->X

рис2

Y
^
¦    ____          ____          _
¦  _-    -_      _-    -_      _-
¦ -        _    -        _    -
¦_          ____          ____
+--------------------------------->X

рис3

Y
^
|
|---------------------------------
|
|
+--------------------------------->X


2. И в чем вопрос ты же сам на него и ответил. Есть несколько буферов.
Устройство получает звук постоянно пишет сэмплы в буфер. Как только буфер заполнился устройство начинает писать в следующий буфер и сообщает о том что предыдущий заполнился, происходит вызов callback-функция.


Наверх

Титульная страница Поиск, карта сайта Написать письмо