Расхождение в размере канала между 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
Просто угадайте здесь, но, возможно, ваша песня в стерео, и вы читаете вдвое больше общей длины, потому что есть два аудиоканала?