Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2009, 20:01   #1
Elem
 
Регистрация: 02.01.2009
Сообщений: 7
По умолчанию bass.dll

Здравствуйте, понимаю, что похожие темы уже есть, но... Каким образом с помощью библотеки bass.dll можно вычислить частоту и амплитуду для каждой секунды в потоке?Какими функциями это можна реализовать? Пробовал разбираться в хелпе для bass.dll, но на английском это не очень удобно. Если кого то не затруднит, попросил бы помочь
Elem вне форума Ответить с цитированием
Старый 08.01.2009, 01:09   #2
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию

Ох тебе повезло, что у меня дипломная связанная с разработкой программного обеспечения для сбора информации и диагностики машин.
Вряд ли кто-то еще тебе даст ответ на поставленный вопрос.
PHP код:
var
fftdata: array [0..2048of single;

BASS_RecordInit(-1);
channel1 := BASS_RecordStart(11025,2,0,nil,0);
BASS_ChannelGetData(channel1, @fftdataBASS_DATA_FFT4096);

for 
i:=0 to 149  do begin
  amplitude 
fftdata[i];
end
149 - это 401 Гц
шаг = 11025/4096 = 2,691650390625 Гц

А вообще я уже через другие компоненты дипломку переделываю, через этот bass слишком напряжно.
iankov вне форума Ответить с цитированием
Старый 08.01.2009, 01:11   #3
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию

А, совсем забыл, чтобы получать данные каждую секунду, соответственно необходимо данный код забросить в таймер и выставить интервал в 1 сек.
iankov вне форума Ответить с цитированием
Старый 08.01.2009, 03:15   #4
Elem
 
Регистрация: 02.01.2009
Сообщений: 7
По умолчанию

Спасибо, что откликнулся. Но у меня теперь вопросы:
1)Почему именно 401Гц? И почему амплитуды только до 149?
2)К примеру я получу 2048 значений амплитуд при определённых значениях частот, как мне это связать со временем? Если поместить этот код в таймер, то каждую секунду я буду получать опять же 2048 значений амплитуд.
Прошу извинить, я не очень компетентен в этом вопросе, но я думал, что, к примеру, для каждой секунды можно найти 1 значение частоты и одно значение амплитуды.
3)
Код:
Amplit:=log10(fft[i])*20;
Как я понял это будут амплитуды в Дб, это нормально, что они все отрицательные?
Вроде, пока всё)
Elem вне форума Ответить с цитированием
Старый 08.01.2009, 07:59   #5
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию

Нет, это не в Дб, это просто набор каких то данных соответствующих амплитуде, может в микровольтах - точно не знаю, чтобы перегнать в Дб нужно калибровать прогу, т.е. брать значение амплитуды из проги и при помощи формул подгонять эти значения до ожидаемых амплитуд в Дб. В массиве выводятся амплитуды как линейные зависимости, Дб - это логарифмическая зависимость, так что трансформация нужна в любом случае.

149 это в моем случае было, но на данном примере можно брать любые значения до 2048 из массива.
BASS_RecordStart(11025,2,0,nil,0); 11025 это частота дискритизации сигнала.
BASS_ChannelGetData(channel1, @fftdata, BASS_DATA_FFT4096); BASS_DATA_FFT4096 - это константа соответствующая частоте дискритизации 4096Гц и при заданном параметре функция возвращает 2048 значений.
Точно не помню как там взаимосвязаны эти 4096 и 11025.
Каждую секунду можно получать данные амплитуд на определенных частотах. fftdata[i] эквивалентно значении амплитуды на частоте эквивалентной переменной i. Т.е. для каждой частоты своя амплитуда. Чтобы получить суммарную амплитуду, нужно просто просуммировать все значения массива по модулю.
iankov вне форума Ответить с цитированием
Старый 08.01.2009, 13:29   #6
Elem
 
Регистрация: 02.01.2009
Сообщений: 7
По умолчанию

А нет случайно каких то ссылок? Было бы неплохо.

Цитата:
Каждую секунду можно получать данные амплитуд на определенных частотах. fftdata[i] эквивалентно значении амплитуды на частоте эквивалентной переменной i. Т.е. для каждой частоты своя амплитуда. Чтобы получить суммарную амплитуду, нужно просто просуммировать все значения массива по модулю.
А как тогда вычислить общую частоту?
А амплитуды получаются небольшие где то 0 до 2, может их надо умножить на что то?
Elem вне форума Ответить с цитированием
Старый 08.01.2009, 17:43   #7
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию

Какую общую частоту? Вы же понимаете что колебания проходят на спектре частот. Все что мы слышим - это спектр частот с 20 до 20000 Гц. Звуковая карта также имеет границы от 20 до 20000Гц, хотя есть различные модификации. Знаешь хоть что такое спектр? Какой физический смысл задачи, что нужно сделать?
iankov вне форума Ответить с цитированием
Старый 08.01.2009, 17:59   #8
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию

http://www.un4seen.com/
Официальный сайт по bass.dll
Там по идее и мануал должен быть где-то, если не найдешь - у меня есть.
iankov вне форума Ответить с цитированием
Старый 08.01.2009, 18:23   #9
Elem
 
Регистрация: 02.01.2009
Сообщений: 7
По умолчанию

Мне нужно найти 1 значение амплитуды и 1 частоты для каждой секунды из файла
Спектр, как я понимаю, это график зависимости амплитуды от времени?
Код:
BASS_ChannelGetData(stream,@fft,BASS_DATA_FFT1024);
  for i:=1 to 512 do
   begin
    if peak<abs(fft[i]) then
     begin
       peak:=abs(fft[i]);
       frequency:=i*CHANINFO.freq/1024;
      end;
    end;
Вот этим кодом я хочу найти амплитуду и соответствующую ей частоту в определённой позиции потока.
То есть как я себе думаю, длину потока в байтах поделить на длину в секундах, и с этим шагом находить нужные мне значения. Этот код я взял с http://www.un4seen.com/
Elem вне форума Ответить с цитированием
Старый 09.01.2009, 12:11   #10
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию

спектр это график зависимости амплитуды от частоты!
вот образец
1.PNG
Как мы видим на частотах примерно 25, 50 и 180 Гц идет резкий всплеск амплитуд.

В том примере что ты указал - он тебе выдаст 512 частот и соответствующие этим частотам амплитуды. Насчет того чтобы получить частоту соответствующую амплитуде - это по моему практически нереально. Амплитуды сам видел как прыгают 0.0023 0.1256 итд, т.е. сложновато будет наткнутся на заданную амплитуду. Вот наоборот, получить амплитуду, зная частоту - это попроще, просто вытянуть необходимый элемент массива который соответствует требуемой частоте.

Последний раз редактировалось iankov; 09.01.2009 в 12:16.
iankov вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
библиотека bass.dll, что это такое? дайте ссылку на хелп. vitalik007 Общие вопросы Delphi 2 29.02.2012 18:03
bass.dll и mms потоки vismut Мультимедиа в Delphi 8 07.10.2011 19:01
Помогите с параметрическим эквалайзером в BASS.DLL! N-DOGG Компоненты Delphi 2 04.01.2009 16:05
как соеденить dll bass blackstersl Общие вопросы Delphi 4 25.09.2008 17:52
bass.dll - ошибка - Use the step or run to continue. vitalik007 Общие вопросы Delphi 1 20.08.2007 19:59