|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
27.10.2014, 14:04 | #1 |
Участник клуба
Регистрация: 13.01.2009
Сообщений: 1,353
|
Обработка данных, полученных со входа звуковой карты
Здравствуйте. Думаю, что это подходящий раздел для этой темы. Язык программирования мало интересует, нужна информация другого плана. Сейчас опишу то, что имею на данный момент.
На вход звуковой карты подаются какие-то данные. Для приема и обработки этих данных я использую драйвер ASIO4ALL и, соответственно, библиотеку (NAudio), которая содержит функции для работы с этим драйвером. Сейчас пользуюсь C# + WinForms. Проблема в следующем. Не могу разобраться в каком формате приходят данные. При приеме данных в буфер типа byte[кол-во сэмплов в буфере * 4] данные выглядят так: 0, x1n, x2n, x3n, n = 0 .. размер сэмпла. Т.е. в каждой тетраде я всегда имею первый 0. Если массив представлять как int[кол-во сэмплов в буфере], то появляется другая закономерность: 223454, 344556, 445656, 344400, 223487, 143456, 89800, -20345, -123405, -234543, -345356 и снова возрастание. Тут я уже как бы вижу свою синусоиду, подаваемую на вход. Трудность в определении амплитуды в каждой точке n (0..кол-во сэмплов в буфере) по временной оси. Кроме этого интересует определение уровня звукового сигнала, его частоты и прочих основных параметров. Знаю, что при ДПФ/БПФ тактовая частота - 1/n, где n - номер гармоники с наивысшей амплитудой. Верны ли мои предположения по этому второстепенному вопросу? Если не сложно, растолкуйте подробно о приведении входных данных к виду осциллограммы или же можно ссылками на источник, где это можно узнать.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
|
28.10.2014, 18:30 | #2 |
Участник клуба
Регистрация: 13.01.2009
Сообщений: 1,353
|
Вопрос решен. Решил калибровкой, а также вспомнил о замечательной формуле: dB = 10 * log10(A / A0).
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
|
31.10.2014, 10:32 | #3 |
Участник клуба
Регистрация: 13.01.2009
Сообщений: 1,353
|
Хочу вот еще что спросить. Как реализовать механизм синхронизации? Строю я эту вольт-временную зависимость и вместо плавно идущего графика получаю в отображении два графика, смещенных по фазе относительно друг друга. Проверяю данные - четко одна синусоида, приостанавливаю программу - отображается одна синусоида, а при работе их две... Ну это и очевидно. Запись 689 буфферов по 64 фрейма каждый в 1 секунду на вход звуковухи (примерно 44100 Fд), а отрисовка этих буфферов с помощью OpenGL идет минимум в 10 раз быстрее, следовательно все равно играет роль скорость приема данных. Если ее замедлить, то данные потеряются. Вот каким образом можно отрисовать 689*64*4 байт/секунду? Как правильно синхронизироваться?
P.S. В глубине души я понимаю, что этот вопрос снова повиснет в воздухе... Но все-таки?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
|
31.10.2014, 13:11 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Тут два вопроса. Насчет "как рисовать" не скажу, ибо не совсем понятно что надо нарисовать. Насчет "как синхронизоваться" - у вас есть частота сэмплирования, у вас есть объем полученных данных, отсюда не проблем вычислить время и наоборот. Вопрос, *что* с *чем* надо синхронизовать? Картинку с данными? По индексу в данных вычисляем время по времени вычисляем позицию на экране.
|
31.10.2014, 20:28 | #5 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Ну и по поводу отрисовки:
человеческий глаз имеет весьма заметную инерционность - какой смысл рисовать то, что не может увидеть глаз? Да и экран обновляется, как правило, 60 раз в секунду, поэтому пересчитывать на нем изображение чаще явно лишено смысла. А вообще, звук принято отображать на экране результатом Фурье-преобразования в логарифмическом либо двойном логарифмическом масштабе. И еще: современные звуковые контроллеры, как правило, аппаратно выдают только 48кГц, а 44.1 получается посредством программной интерполяции. Так что лучше брать с карты прямой сигнал, а не преобразованный драйверами. На всякий случай: отсчет 4 байта - это 16-разрядный стереосигнал, т.е. два двухбайтовых отсчета для левого и правого каналов. Вдогонку: кажется, понял, что значит "синхронизироваться" - это в режиме осциллограммы (не БПФ) чтобы на экране была не мешанина сигналов, а стабильная синусоида. Если так, то не следует стремиться отобразить целое количество буферов - пусть момент синхронизации (начало развертки на экране) будет находиться внутри буфера, а не на его границе. Рассматривай последовательность буферов как один непрерывный поток, и "режь" его в нужных местах. Последний раз редактировалось s-andriano; 31.10.2014 в 20:52. |
02.11.2014, 14:17 | #6 | |||
Участник клуба
Регистрация: 13.01.2009
Сообщений: 1,353
|
Цитата:
Цитата:
Цитата:
Мне тут пришла идея, но она не нравится мне из-за постоянно растущего объема используемой памяти (примерно размер приходящих данных в секунду, счет идет на КБ данных). Записывать в память все приходящие данные, а с помощью OpenGL смещать матрицу проекции ровно на размер буфера/вида отображения со скоростью 25 кадров в секунду. Тогда при приостановке анализа, можно будет прокрутить вперед или назад отображение сигнала.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
|
|||
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Выбор звуковой карты | lil_crips | Мультимедиа в Delphi | 3 | 28.08.2012 18:07 |
определение наличия звуковой карты | ohos | Win Api | 2 | 26.03.2011 13:22 |
Выбор звуковой карты... | Kvinto | Мультимедиа в Delphi | 9 | 20.10.2009 15:03 |
OpenSuSe настройка звуковой карты? | mv28jam | Операционные системы общие вопросы | 1 | 06.10.2009 13:34 |
Обработка данных полученных из формы | Linel | PHP | 4 | 23.04.2009 14:38 |