2009-12-17 4 views
0

Я хочу нарисовать весь спектр песни из ее полного представления БПФ.Несоответствие размера канала между BASS_GetChannelLength() и BASS_GetChannelData()

Используя BASS Audio Library, я создаю поток декодера, получаю его длину и затем извлекаю все образцы FFT. Мой первый прототип работал отлично:

Decoder := BASS_StreamCreateFile(FALSE, pchar(fn), 0, 0, BASS_STREAM_DECODE); 
    SongLen := BASS_ChannelGetLength(Decoder, BASS_POS_BYTE); 
    repeat 
    NRead := BASS_ChannelGetData(Decoder, @FftBuf, BASS_DATA_FFT1024); 
    TotRead := TotRead + NRead; 
    until (NRead<=0); 

Но после запуска его я понял, что TotRead накоплено от NRead возвращаемого BASS_ChannelGetData() систематически (во всех тестовых песнях, которые я пробовал, и с различными FFT размерами) два раза SongLen возвращается BASS_ChannelGetLength().

Этот результат - то, чего я не ожидал. Я ожидал получить то же значение, которое было возвращено с BASS_ChannelGetLength(), чем значение, накопленное из всех возвращенных из BASS_ChannelGetData(), поскольку в документации указано «При запросе данных БПФ возвращается количество байтов, считанных с канала (для выполнения БПФ). "

Мне нужно понять, что здесь происходит. Причина, по которой я спрашиваю, состоит в том, что для хранения полного полного спектра я должен вывести из длины песни количество выборок, которые мне нужно будет выделить.

Не могли бы вы объяснить это несоответствие? Благодарю.

ответ

2

Оказалось, что это ошибка в BASS.DLL.

Вот ответ, который я получил от разработчиков BASS в форуме un4seen development.

Вы правы! BASS_ChannelGetData был действительно возвращал двоякое значение при запросе данных FFT с 16-битного канала . Это было связано с этим не , компенсирующим 16-разрядный образец данных, преобразованных в плавающую точку при обработке БПФ. Вот ... поправочный www.un4seen.com/stuff/bass.dll

0

Просто угадайте здесь, но, может быть, ваша песня в стерео, и вы читаете в два раза большую длину, потому что есть два аудиоканала?

+0

Ну, это была моя первая мысль тоже. Песня действительно стерео. Но в моем понимании это не должно мешать. Поскольку, согласно документации, (1) ChannelGetLength возвращает длину в байтах обоих каналов и (2) ChannelGetData возвращает общее количество байтов, считанных для вычисления выборки FFT. Или я могу ошибаться. –