Tworzenie spektrogramu

10

Próbowałem wypracować logikę tego zadania i planuję użyć pakietu źródłowego KissFFT, aby wykonać szybką transformację Fouriera. Daj mi znać, jeśli wygląda to dobrze:

  1. Przydziel strukturę FFT, tj. kiss_fft_alloc(N,0,NULL,NULL) Gdzie Nużywam rozmiaru okna. Bufor wejściowy będzie tablicą Nelementów typu kiss_fft_scalar. Bufor wyjściowy będzie tablicą N/2 + 1elementów typu kiss_fft_cpx.
  2. Dekoduj N(rozmiar okna) liczbę próbek PCM.
  3. Dla każdej próbki PCM uśrednij amplitudę każdego kanału (próbki bez znaku) i skaluj od 0 do 2 (podziel przez 65536,0), zapisując wynik w buforze wejściowym.
  4. Wykonaj okienkowanie (tj. Hanning) na buforze wejściowym.
  5. Wykonaj szybką transformatę Fouriera w buforze wejściowym, zapisując w buforze wyjściowym. Ponieważ używam rzeczywistych wartości jako danych wejściowych, mogę ich użyć kiss_fftr().
  6. Dla N/2wartości wyjściowych uzyskaj kwadratową wielkość przekształconych danych i przekonwertuj wartości na skalę dB za pomocą następującego wzoru: 10 * log10 (re * re + im * im)
  7. Wykreślić N/2wartości z kroku 6.
  8. Odrzuć pierwszą połowę bufora wejściowego, dekodując następne (wielkość okna / 2) próbki PCM i wykonując skalowanie i okienkowanie danych. Powinno to skutecznie przesuwać okno wprowadzania i unikać konieczności powtarzania matematyki na przetworzonych próbkach PCM.
  9. Przejdź do kroku 5, powtarzając te kroki, aż wszystkie próbki zostaną przetworzone.
  10. Zwolnij zużytą pamięć z kiss_fft_alloc().

Zasugerowano, że odejmuję wartość z okna wprowadzania przed wykonaniem FFT, aby wynikowa wartość DC miała wartość zero. Czy powinienem odejmować średnią lub średnią od danych wejściowych?

Co też muszę wziąć pod uwagę przy wyborze rozmiaru okna? Poza tym musi to być liczba parzysta zgodnie z instrukcjami KissFFT, czy istnieje korzyść z zastosowania małego rozmiaru okna, tj. czy zapewni lepszy wykres? Zakładam, że duży rozmiar okna zmniejsza liczbę FFT, które należy wykonać, czy to jedyna korzyść z używania dużego rozmiaru okna?

x

Z góry dziękuję za wszelkie wskazówki, które możesz udzielić.

raynebc
źródło

Odpowiedzi:

8

Jak dla mnie wygląda dobrze. Jednak w kroku 3 chcesz przeskalować sygnał z -1 na 1, w przeciwnym razie dodajesz DC. Wspomniałeś o odjęciu średniej - nie zaleciłbym zrobienia tego dla spektrogramu, ponieważ to skutecznie odfiltrowuje DC, które spektrogram powinien pokazać, jeśli tam jest.

Wybór rozmiaru okna polega na kompromisach. Większe okno daje ostrzejszą rozdzielczość częstotliwości, ale rozmytą rozdzielczość czasową. Krótsze okno da ci coś przeciwnego: ostrzejszą rozdzielczość czasową, ale bardziej rozmytą rozdzielczość częstotliwości. Właściwy wybór rozmiaru okna będzie zależeć od danych, które próbujesz przeanalizować. Zazwyczaj będzie to potęga 2 tylko dlatego, że FFT zazwyczaj lubią potęgi 2. Przyzwoitą zasadą jest, że twoje okno powinno być co najmniej z grubsza dwa razy dłuższe niż okres najniższej częstotliwości, który chciałbyś być w stanie dokładnie rozwiązać.

Można się zastanawiać, czy można lepiej poradzić sobie z tym kompromisem, i istnieją na to techniki: zazwyczaj obejmują one obliczenie spektrogramów o kilku różnych rozmiarach FFT jednocześnie i ich połączenie. Na stronie znajduje się kilka dobrych informacji wizualnych: http://www.izotope.com/tech/aes_adapt/

Jeśli twój rozmiar okna jest zbyt mały, dwie bardzo bliskie częstotliwości mogą być nie do odróżnienia od siebie, ponieważ oba kończą się w tym samym pojemniku FFT. Jeśli twój rozmiar okna jest zbyt duży, dwa zdarzenia zamknięcia w czasie mogą zostać połączone lub ostry stan przejściowy może przerodzić się w stopniowy atak. Sprawdź zamieszczoną przeze mnie stronę internetową, aby dowiedzieć się, jak to zrobić.

Większy rozmiar okna niekoniecznie zmniejsza liczbę FFT. Zdecydowałeś się obliczyć spektrogram za pomocą krótkotrwałej transformacji Fouriera, gdzie zachodzi na siebie połowę wielkości FFT. Jeśli chcesz, możesz zastosować wyższy współczynnik nakładania się. Wybór rozmiaru okna jest bardziej kwestią kompromisu czas / częstotliwość niż liczby FFT, które musisz obliczyć. Projektując spektrogram (lub dowolny STFT), możesz pomyśleć o wyborze rozmiaru okna i rozmiaru przeskoku , odległości między blokami, jako niezależnych parametrów.

Kiedy go narysujesz, czas jest zwykle na osi x, częstotliwość na osi y (zwykle skala logarytmiczna, skala Mel itp., A nie skala liniowa), a następnie wielkości są przedstawiane za pomocą intensywności kolorów, tj. bardzo ciemne kolory odpowiadają małym jasnościom, a bardzo jasne kolory odpowiadają dużym jasnościom.

sznurek
źródło
Twój link wydaje się być martwy. Czy możesz to zaktualizować?
Daniel Wolf