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

Вниз

Звук и запись звука   Найти похожие ветки 

 
Vovan#2   (2006-11-26 17:50) [0]

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

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

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


 
Pavia ©   (2006-11-26 22:18) [1]

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

рис1

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

рис2

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

рис3

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


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


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

2 Pavia:

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

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


 
Pavia ©   (2006-11-26 23:48) [3]

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

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


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

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


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

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


 
Pavia ©   (2006-11-27 22:17) [6]

Вот табличка сравнения 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бит это обыкновенное знаковое число. Отрицательный числа в компьюторе храняться в дополненном коде, не буду уточнять что ето такое сам найдешь в интернете.

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

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


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

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

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

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

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


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

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

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


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


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


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


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


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


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

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

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


 
homm ©   (2006-11-29 11:35) [11]

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

LOL


 
Jeer ©   (2006-11-29 11:39) [12]


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


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


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


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


Не понял ...

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


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

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

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

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

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


 
Pavia ©   (2006-11-29 19:54) [15]

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


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

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


 
Pavia ©   (2006-11-29 20:19) [17]

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


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


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


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


 
Jeer ©   (2006-11-30 09:43) [19]


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


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



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

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

Наверх




Память: 0.52 MB
Время: 0.021 c
15-1186368312
Slider007
2007-08-06 06:45
2007.09.02
С днем рождения ! 6 августа 2007 понедельник


2-1186557316
dest81
2007-08-08 11:15
2007.09.02
ehlib


4-1173526703
BOGa
2007-03-10 14:38
2007.09.02
Обмен данными между процессами ( WM_COPYDATA)


15-1185530247
Dib@zol
2007-07-27 13:57
2007.09.02
Точка входа


15-1185883532
AntifreezeeR
2007-07-31 16:05
2007.09.02
Ищу помощи, как новичок.