Расхождение в размере канала между BASS_GetChannelLength() и BASS_GetChannelData()

Я хочу нарисовать весь спектр песни из ее полного представления FFT.

Используя аудио библиотеку BASS, я создаю поток декодера, получаю его длину и затем извлекаю все сэмплы 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(), поскольку в документации сказано: "При запросе данных FFT возвращается количество байтов, прочитанных из канала (для выполнения FFT)".

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

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

2 ответа

Решение

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

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

Ты прав! BASS_ChannelGetData действительно возвращал двойное правильное значение при запросе данных FFT из 16-битного канала. Это произошло из-за того, что он не компенсировал преобразование 16-битных данных выборки в число с плавающей точкой при обработке FFT. Вот исправление... http://www.un4seen.com/stuff/bass.dll

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

Другие вопросы по тегам