Logarytmiczna transformata Fouriera (LFT) na sygnale audio

9

Staram się jak najdokładniej analizować muzykę. Oczywiście próbowałem FFT, ale miałem pewne problemy.

Odkryłem, że niskie częstotliwości mają bardzo niską rozdzielczość niż słuch ludzki. Bardzo długo próbowałem FFT, aby rozwiązać ten problem, ale nawet analizując przy 8192 próbkach / s przy częstotliwości próbkowania 44100Hz (Oznacza to brak rozdzielczości czasowej), nie dostałem wystarczającej rozdzielczości na niskich częstotliwościach.

Znalazłem kilka rozwiązań.

Po pierwsze, kwadratowa interpolacja na pojemnikach FFT.
Ale nie wydaje się to idealnym sposobem. Problemami tej metody są:

1. „Jeśli chcę określić częstości między przedziałami częstotliwości, które trzy przedziały mam wybrać, aby wykonać interpolację?”
2. „Nawet ja to robię, nie ma żadnych faktycznych dodatkowych informacji o wyniku. Wiem, że interpolacje są dość trudną metodą.

Po drugie, wyodrębniam każdy przedział częstotliwości z pożądaną częstotliwością, dzięki czemu mogę wyodrębniać przedziały logarytmicznie.
Ale mają krytyczny problem z kosztami obliczeniowymi: (może ponad) N ^ 2.

Po trzecie, LFT (logarytmiczna transformata Fouriera).
Wymaga to logarytmicznie rozmieszczonych próbek i daje mi dokładnie to, czego szukam, z niewiarygodnie dużą prędkością; /programming/1120422/is-there-an-fft-that-uses-a-logarithmic-division-of-frequency

Ale nie mam pojęcia z tym algorytmem. Próbowałem zrozumieć artykuł i go wdrożyć, ale było to niemożliwe z powodu braku mojej znajomości języka angielskiego i matematyki.

Potrzebuję pomocy przy implementacji LFT.

Laie
źródło

Odpowiedzi:

8

Najprostszym i najbardziej pragmatycznym rozwiązaniem jest użycie normalnej FFT o wystarczająco dużych rozmiarach, aby uzyskać wymaganą rozdzielczość przy najniższej częstotliwości zainteresowania. Np. Jeśli chcesz rozdzielczości 1 Hz przy najniższej częstotliwości zainteresowania, będziesz potrzebował 1-sekundowego okna FFT, tzn. Rozmiar FFT musiałby być równy częstotliwości próbkowania, np. 44100.

Zauważ, że nawet gdybyś mógł zaimplementować logarytmiczną FFT, nadal byłby związany prawami fizyki (teoria informacji) i nadal potrzebowałbyś okna próbki o podobnej długości - wszystko, co zyskałbyś, to wygoda (bez konieczności agregowania pojemników wyjściowych ) kosztem wydajności.

Paul R.
źródło
To dziwne. Wiem, że teoretycznie nie ma już danych. Jeśli użyję FFT dużego rozmiaru, to prawda, że ​​nie jest on w stanie analizować bardzo szybkich początków instrumentów muzycznych. I prawdą jest również to, że nie jestem w stanie uzyskać wyższej rozdzielczości na niskiej częstotliwości. A co z ludzkim aparatem słuchowym? Jak ten system ma wyższą rozdzielczość zarówno w czasie, jak i częstotliwości?
3
Być może powinieneś rozważyć podejście hierachiczne, w którym każdą kolejną oktawę dziesiątkujesz 2 razy, abyś mógł używać krótszych okien czasowych na wyższych częstotliwościach i dłuższych okien czasowych na niższych częstotliwościach? Byłoby to nieco analogiczne do banku filtrów słuchowych, w którym przepustowość rośnie wraz z częstotliwością.
Paul R
Świetne podejście. Długi czas goertzel na niskich częstotliwościach, krótki czas goertzel na wysokich częstotliwościach? Ma sens. Będzie to jednak wymagało wielkich kosztów obliczeniowych.
Prawdopodobnie jest to bardziej wydajne niż wykonywanie jednego dużego FFT, mimo że jest bardziej złożone. Np. W przypadku hierarchii 4 oktaw mogą być potrzebne 4 x 2048 punktowe FFT i 3 filtry dolnoprzepustowe do próbkowania w dół x2. Rozdzielczość najniższego FFT będzie tak dobra jak pojedynczy 16384 punktowy FFT przy pełnej częstotliwości próbkowania, ale ponieważ FFT wynosi O (n log n), całkowity koszt obliczeniowy będzie znacznie niższy.
Paul R
aha, FFT 2048, próbka w dół x2, FFT 2048, próbka w dół x2 .... niż mam rozdzielczość czasu i częstotliwości, przy znacznie niższych kosztach niż 16384 FFT. Świetny. I właśnie teraz mam inne rozwiązanie: na próbce 16384, za każdym razem goertzel o 32. Tak więc, dzięki akumulacji, mogę wydobywać zarówno niskie, jak i wysokie częstotliwości przy niższych kosztach. Wielkie dzięki. :)
0

Jeśli analiza, którą zamierzasz przeprowadzić, wymaga częstotliwości sygnałów w każdym przedziale, możesz to zrobić za pomocą krótkotrwałej transformacji Fouriera .

Każdy przedział FFT daje liczbę zespoloną reprezentującą rzeczywisty i urojony komponent - lub po odrobinie fazy manipulacji i wielkości.

Jako częstotliwość = dPhi / dt, (Phi == faza), biorąc odpowiednie pojemniki z par kolejnych widm STFT, możesz obliczyć częstotliwość.

DSP Dimension ma dobry artykuł na temat tego procesu.

Marko
źródło
Wygląda na to, że zastanawiam się nad bardziej złożonym problemem. Mogę używać FFT, ale przy analizie sygnału audio nie jest to jednak odpowiednie.
3
Spójrz na wersję „stałej Q” krótkotrwałej transformacji Fouriera. Taki układ STFT zapewnia rozdzielczość częstotliwości, która dostosowuje się logarytmicznie do wymagań różnych zakresów częstotliwości.
user2718,
Spojrzę. Myślałem, że to tylko prosta operacja transformacji banku filtrów zastosowana do wyniku fft.
Laie