Я хочу нарисовать весь спектр песни из ее полного представления БПФ.Несоответствие размера канала между 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()
, поскольку в документации указано «При запросе данных БПФ возвращается количество байтов, считанных с канала (для выполнения БПФ). "
Мне нужно понять, что здесь происходит. Причина, по которой я спрашиваю, состоит в том, что для хранения полного полного спектра я должен вывести из длины песни количество выборок, которые мне нужно будет выделить.
Не могли бы вы объяснить это несоответствие? Благодарю.
Ну, это была моя первая мысль тоже. Песня действительно стерео. Но в моем понимании это не должно мешать. Поскольку, согласно документации, (1) ChannelGetLength возвращает длину в байтах обоих каналов и (2) ChannelGetData возвращает общее количество байтов, считанных для вычисления выборки FFT. Или я могу ошибаться. –