Przypuśćmy, że:
- Częstotliwość podstawy sygnału została oszacowana za pomocą FFT i niektórych metod szacowania częstotliwości i leży pomiędzy dwoma centrami bin
- Częstotliwość próbkowania jest stała
- Wysiłek obliczeniowy nie stanowi problemu
Znając częstotliwość, jaki jest najdokładniejszy sposób oszacowania odpowiedniej wartości szczytowej fundamentalnych sygnałów?
Jednym ze sposobów może być zerowanie pola czasowego w celu zwiększenia rozdzielczości FFT, tak aby środek przedziału był bliższy oszacowanej częstotliwości. W tym scenariuszu jedną kwestią, o której nie jestem pewien, jest to, czy mogę zerować tak dużo, jak chcę, lub czy są w tym jakieś wady. Innym jest to, który środek przedziału powinienem wybrać po wypełnieniu zerowym, jako ten, od którego otrzymuję wartość szczytową (ponieważ nie można dokładnie trafić na częstotliwość będącą przedmiotem zainteresowania, nawet po wypełnieniu zerowym).
Zastanawiam się jednak również, czy istnieje inna metoda, która może zapewnić lepsze wyniki, na przykład estymator, który wykorzystuje wartości szczytowe otaczających dwóch centrów bin do oszacowania wartości szczytowej przy częstotliwości zainteresowania.
imax
jest pik FFT) da dokładne wynikiOdpowiedzi:
Pierwszym algorytmem, który przychodzi mi do głowy, jest algorytm Goertzela . Algorytm ten zwykle zakłada, że częstotliwość będąca przedmiotem zainteresowania jest całkowitą wielokrotnością częstotliwości podstawowej. Jednak ten artykuł stosuje (uogólniony) algorytm w przypadku, który Cię interesuje.
Innym problemem jest to, że model sygnału jest nieprawidłowy. Używa
2*%pi*(1:siglen)*(Fc/siglen)
. Należy użyć,2*%pi*(0:siglen-1)*(Fc/siglen)
aby faza wyszła poprawnie.Myślę również, że istnieje problem z
Fc=21.3
bardzo niską częstotliwością . Sygnały o niskiej wartości rzeczywistej niskiej częstotliwości wykazują tendencyjność, jeśli chodzi o problemy z oszacowaniem fazy / częstotliwości.Próbowałem również zgrubnego wyszukiwania siatki dla oszacowania fazy i daje to tę samą odpowiedź, co algorytm Goertzela.
Poniżej znajduje się wykres, który pokazuje odchylenie w obu oszacowaniach (Goertzel: niebieski, Gruboziarnisty: czerwony) dla dwóch różnych częstotliwości:
Fc=21.3
(stała) iFc=210.3
(przerywana). Jak widać odchylenie dla wyższej częstotliwości jest znacznie mniejsze.Wykres osi jest początkową fazą zmieniającą się od 0 do .2 πx 2 π
źródło
Jeśli chcesz używać wielu sąsiednich pojemników FFT, a nie tylko 2, to interpolacja Sinc w okienku między złożonymi wynikami bin może dać bardzo dokładne oszacowanie, w zależności od szerokości okna.
Interpolacja okienkowana jest powszechnie spotykana w wysokiej jakości próbnikach audio, więc artykuły na ten temat będą miały odpowiednie formuły interpolacyjne z analizą błędów.
źródło
Jeśli użyjesz Flanagana [1], jest on obliczany na podstawie różnicy faz kolejnych widm fazowych ϕϕ (Częstotliwość chwilowa), a jeśli rekonstruujesz wielkość za pomocą właściwego współczynnika (Natychmiastowa wielkość) [2], użyj znormalizowanej funkcji sinusa: A na koniec użyj interpolacji parabolicznej wokół wielkości szczytowej, możesz uzyskać niesamowite rezultaty, dziś uważam, że jest to najlepszy sposób, wykorzystałem go, a wyniki są zawsze bardzo solidny :-)
[1] JL Flanagan i RM Golden, „Phaser vocoder”, Bell Systems Technical Journal, vol. 45, s. 1493–1509, 1966.
[2] K. Dressler, „Ekstrakcja sinusoidalna z wykorzystaniem efektywnej implementacji FFT o wielu rozdzielczościach”, w Proc. 9th Int. Konf. w sprawie cyfrowych efektów dźwiękowych (DAFx-06), Montreal, Kanada, wrzesień 2006, s. 247–252.
źródło
Jedną z metod jest znalezienie maksimum i dopasowanie do niego paraboli, a następnie użycie maksimum paraboli jako oszacowania częstotliwości i wielkości. Możesz przeczytać wszystko o tutaj: https://ccrma.stanford.edu/~jos/sasp/Sinusoidal_Peak_Interpolation.html
źródło
Kilka lat temu miałem wiele problemów z tym właśnie problemem.
Zadałem to pytanie:
/programming/4633203/extracting-precise-frequencies-from-fft-bins-using-phase-change-between-frames
Skończyłem robić obliczenia od zera i opublikowałem odpowiedź na moje własne pytanie.
Dziwi mnie, że nie udało mi się znaleźć podobnej ekspozycji w Internecie.
Ponownie opublikuję odpowiedź tutaj; zwróć uwagę, że kod jest przeznaczony na scenariusz, w którym nakładam okno FFT 4x.
π
Ta łamigłówka wymaga dwóch kluczy, aby ją odblokować.
Pierwszym kluczem jest zrozumienie, w jaki sposób nakładanie się okna FFT wprowadza obrót w fazie bin.
Drugi klucz pochodzi z wykresu 3.3 i 3.4 tutaj (dzięki Stephan Bernsee za zgodę na kopiowanie zdjęć tutaj).
Wykres 3.3:
Wykres 3.4:
Kod:
źródło
Ten kod python daje bardzo dokładny wynik (użyłem go do wielu nut i uzyskałem błędy poniżej 0,01% półtonu) z interpolacją paraboliczną (metoda z powodzeniem stosowana przez McAulay Quatieri, Serra itp. W harmonicznej + resztkowa techniki separacji)
źródło
Częstotliwości, z którymi mamy do czynienia (21,3 Hz próbkowanych przy 8 kHz) są bardzo niskie. Ponieważ są to sygnały o wartościach rzeczywistych, będą wykazywać błąd w szacowaniu faz dla ** dowolnej ** częstotliwości.
To zdjęcie pokazuje wykres odchylenia (
phase_est - phase_orig
) dlaFc = 210.3;
(na czerwono) w stosunku do odchylenia dlaFc = 21.3;
. Jak widać, przesunięcie jest znacznie większe w21.3
przypadku.Inną opcją jest zmniejszenie częstotliwości próbkowania. Zielona krzywa pokazuje odchylenie
Fs = 800
zamiast8000
.źródło
goertzel = atan(imag(y(2)),real(y(2)))*180/%pi + 90;
. :-) Kopie trochę więcej. Obserwuj tą przestrzeń.p
przyp2 = (abs(y(3)) - abs(y(1)))/(2*(2*abs(y(2)) - abs(y(3)) - abs(y(1)))); phase2 = y0 - 0.25*(ym1-yp1)*p2;
czym można uzyskać znacznie lepsze odpowiedzi --- nawetFc=210
. Nie jestem wcale pewien, czy obecna wersjap
da ci coś sensownego. Formuła interpolacji służy do interpolacji AMPLITUDY paraboli, alep
interpoluje fazę, która jest po prostu ... dziwna.p = (yp1 - ym1)/(2*(2*y0 - yp1 - ym1))
) będzie przez pewien czas niepoprawne, jeśli użyjesz FAZY zamiast amplitud. Jest tak, ponieważ fazy mogą przeskakiwać wokół granicy +/- 180 stopni. Wszystko, co jest potrzebne, aby to naprawić dla fazy, to zmienić tę linię na mojep2
obliczenia powyżej.