![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Звук и запись звука [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-функция.