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:
- Przydziel strukturę FFT, tj.
kiss_fft_alloc(N,0,NULL,NULL)
GdzieN
używam rozmiaru okna. Bufor wejściowy będzie tablicąN
elementów typukiss_fft_scalar
. Bufor wyjściowy będzie tablicąN/2 + 1
elementów typukiss_fft_cpx
. - Dekoduj
N
(rozmiar okna) liczbę próbek PCM. - 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.
- Wykonaj okienkowanie (tj. Hanning) na buforze wejściowym.
- 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()
. - Dla
N/2
wartoś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)
- Wykreślić
N/2
wartości z kroku 6. - 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.
- Przejdź do kroku 5, powtarzając te kroki, aż wszystkie próbki zostaną przetworzone.
- 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?
Z góry dziękuję za wszelkie wskazówki, które możesz udzielić.