Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Media";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Наверх




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


2-1186471609
Сергей И
2007-08-07 11:26
2007.09.02
Создание из текстового документа электронной книги


1-1182862301
mif99
2007-06-26 16:51
2007.09.02
Ошибка в приложение клиент сервер (CANNOT ALLOCATE SOCKET)


6-1168889887
Jeeb
2007-01-15 22:38
2007.09.02
Подгрузка рисунка по значению


8-1164717121
Ангела
2006-11-28 15:32
2007.09.02
Как преобразовать файл bmp?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский