완전한 FFT 표현에서 전체 스펙트럼의 음악을 페인트하고 싶습니다.BASS_GetChannelLength()와 BASS_GetChannelData() 사이의 채널 크기 불일치
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()
에 의해 반환에서 축적 된 두 배 SongLen (나는, 다른 FFT 크기로 시도 모든 테스트 노래에) 체계적 것을 깨달았다를 실행 한 후 BASS_ChannelGetLength()
에 의해 반환됩니다.
이 결과는 내가 예상하지 못한 것입니다. "FFT 데이터를 요청할 때 FFT를 수행하기 위해 채널에서 읽은 바이트 수가 반환됩니다. ("FFT 수행 ") BASS_ChannelGetLength()
에서 반환 된 동일한 값이 BASS_ChannelGetData()
에서 반환 된 모든 값보다 큽니다. "
여기서 무슨 일이 일어나는지 이해해야합니다. 제가 부탁 한 이유는 완전한 전체 스펙트럼을 저장하기 위해서 노래 길이에서 할당해야 할 샘플 수를 얻어야 만한다는 것입니다.
이 불일치를 설명해 주시겠습니까? 감사.
음을합니다. 노래는 사실 스테레오입니다. 그러나 내 이해에 방해해서는 안됩니다. 문서에 따르면 (1) ChannelGetLength는 두 채널의 길이를 바이트 단위로 반환하므로 (2) ChannelGetData는 FFT 샘플 계산을 위해 읽은 총 바이트 수를 반환합니다. 아니면 틀릴 수도 있습니다. –