Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2016, 14:11   #1
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию Построить огибающую wav файла

Доброго времени суток! Подскажите, каким образом можно реализовать такую задачу:

Необходимо построить график зависимости амплитуды сигнала от времени (амплитудно-временная характеристика сигнала) или проще говоря - огибающую.

spektr.jpg
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 04.05.2016, 14:57   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Единого рецепта нету.
1)Возведи значения в квадрат и сгладь результат. И симметрично выведи.
2) На определенных участках ищем: минимум и максимум и их выводим.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 04.05.2016, 15:04   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

А в чем, собственно, проблема? Читаем из секции fmt формат, а из data данные и рисуем где надо.
p51x на форуме Ответить с цитированием
Старый 04.05.2016, 15:16   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

p51x, проблем много:
- нет готового компонента. Несколько лет назад не было. Если найдёте скажите.
- нет точного алгоритма, только отдалённое описание.
- Проблема вывести красиво. Одно дело когда у тебя при выводе в 1 экранной точке 1 точка сигнала. И совсем другое когда масштаб 1:20. И третья ветка когда 20:1.
И кому-то надо линейно интерполировать кому-то по Ланцошу, что-бы получить синусойда.
- Проблема вывести точно. К примеру с правильным отображением нулевой составляющей.
- Проблема больших данных. Выводить быстро и быстро масштабировать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 04.05.2016, 15:28   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Что-то вы за ТС задачу додумали и усложнили.

Цитата:
- нет готового компонента. Несколько лет назад не было. Если найдёте скажите.
Вот это программирование в стиле делфи. Есть кучка компонентов для постройки графиков, у нас есть серия отсчетов... да даже самому можно нарисовать.

Цитата:
- нет точного алгоритма, только отдалённое описание.
Вы о чем? У нас в файле лежат фактически отсчеты амплитуды, надо построить график амплитуда на время...

Цитата:
- Проблема вывести красиво. Одно дело когда у тебя при выводе в 1 экранной точке 1 точка сигнала. И совсем другое когда масштаб 1:20. И третья ветка когда 20:1.
И кому-то надо линейно интерполировать кому-то по Ланцошу, что-бы получить синусойда.
На вкус и цвет фломастеры есть. ТС это не озвучивал, а если хочется красивостей можно прикрутить опенгл и самому воплотить свои фантазии.

Цитата:
- Проблема больших данных. Выводить быстро и быстро масштабировать.
У ТС этого в задаче нет
p51x на форуме Ответить с цитированием
Старый 04.05.2016, 17:12   #6
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

p51x все верно. Задача не так сложна, как кажется. Размер аудио файлов будет не большой, в основном это будут фразы или слова. Рисовать огибающую достаточно 1 раз, после загрузки аудио файла.

У меня есть уже наброски, завтра скину то, что есть и более конкретно напишу, что не получается. Использую BASS.dll

Хотел просто услышать, для начала, советы или предложения от других людей ))
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 05.05.2016, 12:07   #7
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

Доброго времени! Как обещал, делюсь набросками:

Таким образом формирую 2 массива для Левого и Правого канала:
Код:
var

 WaveOscil: array[0..512, 0..1] of DWORD;
  j: Integer;
  L, R : SmallInt;
  ArrWaveL, ArrWaveR: array of Integer;

begin

  if BASS_ChannelIsActive(strs) = BASS_ACTIVE_PLAYING then
  begin
    BASS_ChannelGetData(strs, @WaveOscil, BASS_DATA_FFT512 or BASS_DATA_FFT_INDIVIDUAL);
  end;

  SetLength(ArrWaveL,512);
  SetLength(ArrWaveR,512);

  for j := 0 to Length(ArrWaveL)-1 do
  begin
      L := SmallInt(LOword(WaveOscil[j][0]));
      R := SmallInt(HIword(WaveOscil[j][1]));

        wavebufL[j] := abs(L);
        wavebufR[j] := abs(R);
  end;

Тут пытаюсь отрисовать (пока, только левый канал):

Код:
var
kX : double; // задаю через TEdit
//................................................................

  ht := Image1.Height div 2;
  for i:=0 to length(wavebufL)-1 do
  begin
    fBufferBitmap.Canvas.Pen.Color := clLime;
    fBufferBitmap.Canvas.MoveTo(i,ht-trunc(((wavebufL[i])/65535)*ht));
    fBufferBitmap.Canvas.LineTo(round(i*kX),ht-trunc(((wavebufL[i+1])/65535)*ht));
  end;
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 05.05.2016, 12:09   #8
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

Вот такой результат получается:

111.jpg
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 05.05.2016, 13:16   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Вот такой результат получается:
И что, вам не нравится?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 05.05.2016, 13:28   #10
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

Не нравится то, что если добавить коэффициент для развертки по оси Х (т.е. растянуть на все поле), то получается такая ерунда:

222.jpg

Делаю так:

Код:
  kX := Image1.Width / length(wavebufL);

  ht := Image1.Height div 2;
  for i:=0 to length(wavebufL)-1 do
  begin
    fBufferBitmap.Canvas.Pen.Color := clLime;
    fBufferBitmap.Canvas.MoveTo(i,ht-trunc(((wavebufL[i])/(65535))*ht));
    fBufferBitmap.Canvas.LineTo(round(i*kX),ht-trunc(((wavebufL[i+1])/(65535))*ht));
 end;
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка WAV файла Karateka Общие вопросы Delphi 11 12.07.2014 22:03
Создание Wav-файла DelhiProgramer Мультимедиа в Delphi 1 13.08.2012 14:14
декомпиляция Wav файла DzetaHunter Общие вопросы Delphi 3 14.01.2011 13:17
Анализ Wav файла lacost Общие вопросы по Java, Java SE, Kotlin 4 17.12.2010 12:09
Воспроизведение WAV файла komp324 Общие вопросы Delphi 1 24.06.2008 12:43