Форум: "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