2009-12-17 2 views
0

완전한 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()에서 반환 된 모든 값보다 큽니다. "

여기서 무슨 일이 일어나는지 이해해야합니다. 제가 부탁 한 이유는 완전한 전체 스펙트럼을 저장하기 위해서 노래 길이에서 할당해야 할 샘플 수를 얻어야 만한다는 것입니다.

이 불일치를 설명해 주시겠습니까? 감사.

답변

2

BASS.DLL에서 버그가 발견되었습니다.

다음은 un4seen 개발 포럼에서 BASS 개발자로부터받은 답변입니다.

네가 맞아! BASS_ChannelGetData는 16 비트 채널에서 FFT 데이터를 요청할 때 실제로 값의 두 배를 반환하는 입니다. 이는 이 FFT 처리에서 부동 소수점으로 변환되는 데이터 인 을 16 비트 샘플로 보정하지 않기 때문입니다. 여기 너무 내 첫번째 생각이었다 보정 ... www.un4seen.com/stuff/bass.dll

0

그냥 여기에 맞춰보세요.하지만 노래가 스테레오로되어 있고 오디오 채널이 2 개 있기 때문에 총 길이가 두 배가됩니다.

+0

음을합니다. 노래는 사실 스테레오입니다. 그러나 내 이해에 방해해서는 안됩니다. 문서에 따르면 (1) ChannelGetLength는 두 채널의 길이를 바이트 단위로 반환하므로 (2) ChannelGetData는 FFT 샘플 계산을 위해 읽은 총 바이트 수를 반환합니다. 아니면 틀릴 수도 있습니다. –