BASS - szczegoly FFT

0

Witam!

Chcialbym Was poprosic o wyjasnienie mi paru rzeczy odnosnie sygnalow audio. Nie bardzo mam kogo zapytac, a nie wszystko jest jeszcze dla mnie jasne. Bede wdzieczny za odpowiedz.

Problem 1.

Funkcja BASS_ChanellGetData ma taki opis:

BASS_DATA_FFT512 512 sample FFT (returns 256 floating-point values) BASS_DATA_FFT1024 1024 sample FFT (returns 512 floating-point values)
BASS_DATA_FFT2048 2048 sample FFT (returns 1024 floating-point values)
BASS_DATA_FFT4096 4096 sample FFT (returns 2048 floating-point values)

Rozumiem to tak, ze maksymalna liczba par: czestotliwosc-amplituda, jaka sie da wycisnac z BASSa to 2048. Ale jak to sie ma do rodzaju sygnalu (mono/stereo) - czy jest to jakos od tego zalezne? Przykladowo dla BASS_DATA_FFT4096 otrzymam 2048 liczb - czy to znaczy, ze pierwsze 1024 jest dla kanalu Lewego, a drugie 1024 dla Prawego (albo raz lewy a raz prawy)? A moze FFT w BASSie nie rozroznia kanalow? Jak to jest?

Albo inaczej - co tak wlasciwie otrzymuje sie uzywajac BASS_DATA_FFT4096 i czy zalezy to od rodzaju sygnalu (mono/stereo) albo od sposobu inicjacji biblioteki BASS, albo też od parametrow nagranego dzwieku (w przypadku pliku)?

Problem 2.

Czy dobrze rozumiem: jezeli czestotliwosc probkowania dzwieku wynosi 44100 Hz i uzywam funkcji BASS_DATA_FFT4096 to interwal czestotliwosciowy wynosi:

dF = 44100/(2*2048) czyli 10,7 Hz

czy moze inaczej?

I jak sie to ma do problemu 1. - bo jezeli jako zwrot z BASS_DATA_FFT4096 otrzymam kanal L i R to interwal bedzie dwa razy dluzszy (21,4 Hz)?

*Problem 3. *

Rozumiem, ze interwal czestotliwosciowy zalezy od czestotliwosci probkowania sygnalu, a maksymalny rozmiar tablicy FFT jest staly (2048). Czyli, ze jak mam nagranie w czestotliwosci np 96 kHz to interwal bedzie duzo wiekszy (23,44 albo 46,88) niz w przypadku probkowania 44100 (10,7 albo 21,4 - zaleznie od problemu 2)?

Problem 4.

Jaka jest rozdzielczosc czasowa dla poszczegolnych ustawien BASS_DATA_FFT(IlesTam) - obliczenie wiekszej liczby punktow musi przeciez dluzej trwac. Slyszalem gdzies, ze dla BASS_DATA_FFT2048 czas obliczen wynosi 43 ms - czy tak jest w BASSie?

Problem 5.

Dlaczego funkcja BASS_DATA_FFT4096 daje dwa razy mniejsza liczbe punktow (2048)? W helpie BASSa cos jest o tym, ale nie jestem mocny z angielskiego.

Problem 6.

Powiedzmy, ze w wyniku dzialania BASS_DATA_FFT(IlesTam) otrzymam tablice wartosci.
Jakiej czestotliwosci dotyczy pierwszy punkt tablicy (ewentualnie jak to sie oblicza), a jakiej ostatni? I czy kazdy punkt dotyczy jednej konkretnej czestotliwosci, czy tez okreslonego przedzialu? Jezeli przedzialu, to jakiego i jak jest przyjmowana srednia wartosc tego przedzialu?

Problem 7.

Jak wyskalowac tablice otrzymana z BASS_DATA_FFT(IlesTam), aby pokazywane wartosci (na osi Y) byly w dB?

Problem 8.

Jedna z funkcji jakie chce, aby moj program posiadal jest okreslenie czestotliwosci sygnalu otrzymywanego z mikrofonu (a wlasciwie pewnego maksimum tego sygnalu). Czy robil ktos kiedys cos takiego i czy sensowne byloby zastosowanie interpolacji albo aproksymacji do zwiekszenia dokladnosci metody? Bo jezeli interwal czestotliwosciowy jest rzedu kilkudziesieciu Hz, to dla niskich czestotliwosci bedzie to obarczone sporym bledem.

Problem 9.

Czy mozna jakosc zwiekszyc dokladnosc FFT w BASSie (chodzi o poprawienie dokladnosci z problemu 8)?

Problem 10

W BASSie sa dwa rodzaje wizualizacji: spektrum i oscyloskop. Co wlasciwie przedstawia wykres na oscyloskopie?


Mam nadzieje, ze nie zameczylem Was na moimi pytaniami, ale znajomosc tych spraw bardzo by mi pomogla w moich poczynanich. Bede bardzo wdzieczny za wszelkie informacje.

Pozdrawiam,

Wojtek.

1

Problem 1
FFT jest łączone dla obu kanałów, chyba że użyjesz flagi BASS_DATA_FFT_INDIVIDUAL wtedy masz przeplecione lewy,prawy,lewy,prawy,... Idąc dalej, masz tak (nie będę Ci tłumaczył):

When requesting FFT data, floating-point values ranging from 0 to 1 are returned. Only the first half of the FFT is useful, so that's what BASS returns. For example with a 2048 sample FFT, it'll return 1024 values - the 1st value being the DC component, the 2nd the amplitude at 1/2048 of the channel's sample rate, then the amplitude at 2/2048, 3/2048, etc..
Channels that have 2 or more sample channels (ie. stereo or above) may have FFT performed on each individual channel, using the BASS_DATA_FFT_INDIVIDUAL flag. Without this flag, all the channels are combined, and a single mono FFT is performed. Performing the extra individual FFTs of course increases the amount of processing required. The return values are interleaved in the same order as the channel's sample data, eg. stereo = left,right,left,etc...

Problem 2
Tak, co do (1) to sprawdź, mi się wydaje że otrzymasz wtedy 4096 danych po 2048 na kanał, ale nie jestem pewny (nie sprawdzałem).

Problem 3
Eee.. sprawdź? :P

Problem 4
Jest kilka okien czasowych na FFT. BASS uzywa Hanning'a. Co do czasu nie wiem - też możesz to sprawdzić wystarczy wkombinować GetTickCount przed i po BASS_ChannelGetData, obliczyć różnicę Ticków po i przed i masz czas w ms.

Problem 5
Ponieważ BASS_DATA_FFT4096 to próbkowanie 4096 puntkowe, ale tylko połowa z nich to uzyteczne informacje, dlatego bufor jest o połowę mniejszy. Stąd też dla BASS_DATA_FFT_INDIVIDUAL powinienieś otrzymać jednak 4096 danych przeplatanych lewy,prawy,.. etc.

Problem 6

For example with a 2048 sample FFT, it'll return 1024 values - the 1st value being the DC component, the 2nd the amplitude at 1/2048 of the channel's sample rate, then the amplitude at 2/2048, 3/2048, etc...

DC - napięcie stałe, które ni jak się raczej ma do sygnału audio, no ale...

Problem 7

floating-point values ranging from 0 to 1 are returned.

Hmm to już będzie trochę problem, porponuję zajrzeć na forum BASSa, albo przyjąć, że 1 to 0dB. Gdyby tak zrobić podziałkę na np. 400px i dane z tablicy pomożyć przez 400 to by było OK, tylko problem z dobraniem skali 0 zwracane to -96dB? czy może nie? nie wiem...

Problem 8
Nie wiem :]

Problem 9
Nie, ale możesz samemu przeprowadzić FFT, w RecordProc otrzymujesz bufor z wavedata.

Problem 10
Oscyloskop od zarania dziejów to wykres U(t), czyli napięcia w czasie. Do dźwięku ma się to tak że im głośniej tym większe napięcie, więc gdybyś miał jednolity dźwięk ściszający się do 0 to otrzymałbyś na oscyloskopie linię ukośną w dół z lewej do prawej (mowa o oscyloskopie skalibrowanym :P, bo te tu troszkę inaczej pokazują, ale zasada działania jest podobna).

Trochę poczytania helpa i własnych eksperymentów i byś w 2 dni doszedł do wszystkiego :P

0

Witam!

Wielkie dzieki za szybka odpowiedz - duzo mi sie wyjasnilo. Pewnie masz racje, ze troche eksperymentow i bym do tego wszystkiego doszedl, ale dobrze miec jakies wsparcie, a nie chcialbym wylozyc sie na podstawach. Idę wcielac nowa wiedze w zycie (a raczej w kod).

Pozdrawiam,

Wojtek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1