Jak ponownie próbkować dźwięk za pomocą FFT lub DFT

12

W dół próbkuję dźwięk głosu, najpierw wykonując FFT, a następnie biorąc tylko te części wyniku, których potrzebuję, a następnie wykonuję odwrotną FFT. Działa jednak poprawnie tylko wtedy, gdy używam częstotliwości, które są potęgą dwóch, powiedzmy próbkowanie w dół z 32768 do 8192. Wykonuję FFT na danych 32k, odrzucam górną 3/4 danych, a następnie wykonuję odwrotna FFT na pozostałych 1/4.

Jednak za każdym razem, gdy próbuję to zrobić z danymi, które nie są odpowiednio wyrównane, dzieje się jedna z dwóch rzeczy: biblioteka matematyczna, której używam (Aforge.Math), rzuca dopasowanie, ponieważ moje próbki nie są potęgą dwóch. Jeśli spróbuję zerować próbki, aby stały się potęgą dwójki, na drugim końcu rozlegnie się bełkot. Próbowałem również użyć DFT, ale kończy się to niesamowicie wolno (należy to zrobić w czasie rzeczywistym).

Jak miałbym zamiar wyzerować właściwie dane FFT, zarówno na początkowym FFT, jak i na odwrotnym FFT na końcu? Zakładając, że mam próbkę 44,1 kHz, która musi dostać się do 16 kHz, obecnie próbuję czegoś takiego, próbka ma rozmiar 1000.

  1. Podkład danych wejściowych do 1024 na końcu
  2. Wykonaj FFT
  3. Przeczytaj pierwsze 512 elementów do tablicy (potrzebuję tylko pierwszych 362, ale potrzebuję ^ 2)
  4. Wykonaj odwrotną FFT
  5. Przeczytaj pierwsze 362 elementy do bufora odtwarzania audio

Z tego na końcu wyrzucam śmieci. Wykonanie tej samej czynności, ale bez konieczności wypełniania kroku 1 i 3, ponieważ próbki już są ^ 2, daje prawidłowy wynik.


źródło
9
FFT naprawdę nie jest dobrym sposobem na zrobienie tego. Chcesz mieć filtr filtrów wielofazowych dla maksymalnej wydajności, ale jeśli chcesz tylko rozwiązać problem, najpierw próbkuj do GCD, potem dolnoprzepustowy, a następnie próbkuj do dołu.
Bjorn Roche,
Cześć Bjorn: co to jest „GCD”?
SpeedCoder5,

Odpowiedzi:

16

Pierwszym krokiem jest sprawdzenie, czy zarówno początkowa częstotliwość próbkowania, jak i docelowa częstotliwość próbkowania są liczbami wymiernymi . Ponieważ są liczbami całkowitymi, są automatycznie liczbami wymiernymi. Jeśli jeden z nich nie byłby liczbą racjonalną, nadal można byłoby zmienić częstotliwość próbkowania, ale jest to proces znacznie inny i trudniejszy.

2232527227533272255

Poprzednie kroki należy wykonać bez względu na to, jak chcesz ponownie próbkować dane. Porozmawiajmy teraz o tym, jak to zrobić za pomocą FFT. Sztuką ponownego próbkowania z FFT jest wybranie długości FFT, które sprawią, że wszystko dobrze się ułoży. Oznacza to wybranie długości FFT, która jest wielokrotnością szybkości decymacji (w tym przypadku 441). Na przykład wybierzmy długość FFT 441, chociaż moglibyśmy wybrać 882 lub 1323 lub dowolną inną dodatnią wielokrotność 441.

Aby zrozumieć, jak to działa, pomaga to wizualizować. Zaczynasz od sygnału audio, który wygląda w dziedzinie częstotliwości mniej więcej tak jak na poniższym rysunku. Częstotliwość próbkowania 44,1 kHz

Po zakończeniu przetwarzania chcesz zmniejszyć częstotliwość próbkowania do 16 kHz, ale chcesz możliwie najmniej zniekształceń. Innymi słowy, po prostu chcesz zachować wszystko od powyższego obrazu od -8 kHz do +8 kHz i upuścić wszystko inne. To pokazuje poniższy obrazek. wprowadź opis zdjęcia tutaj

Uwaga: częstości próbkowania nie są skalowane, służą jedynie zilustrowaniu pojęć.

255

Jak możesz podejrzewać, istnieje kilka potencjalnych problemów. Przejrzę je i wyjaśnię, jak je pokonać.

  1. Co robisz, jeśli Twoje dane nie są ładną wielokrotnością współczynnika dziesiętnego? Możesz łatwo temu zaradzić, wypełniając koniec danych wystarczającą liczbą zer, aby był wielokrotnością współczynnika dziesiętnego. Dane są wypełniane ZANIM zostaną FFT.

  2. ll1zera (należy pamiętać, że liczba próbek danych i liczba próbek wypełnienia muszą ZARÓWNO być dodatnią wielokrotnością współczynnika dziesiętnego - możesz zwiększyć długość wypełnienia, aby spełnić to ograniczenie), FFT 'wypełnianie danych, mnożenie domeny częstotliwości dane i filtr, a następnie aliasing wyników wysokiej częstotliwości (> 8 kHz) w dół do wyników niskiej częstotliwości (<8 kHz) przed upuszczeniem wyników wysokiej częstotliwości. Niestety, ponieważ filtrowanie w dziedzinie częstotliwości jest samo w sobie dużym tematem, nie będę mógł bardziej szczegółowo omówić tej odpowiedzi. Powiem jednak, że jeśli filtrujesz i przetwarzasz dane w więcej niż jednym kawałku, będziesz musiał zaimplementować Overlap-and-Add lub Overlap-and-Save, aby filtrowanie było kontynuowane.

Mam nadzieję, że to pomoże.

EDYCJA: Różnica między początkową liczbą próbek w dziedzinie częstotliwości a docelową liczbą próbek w dziedzinie częstotliwości musi być równa, aby można było usunąć tę samą liczbę próbek z dodatniej strony wyników, jak z ujemnej strony wyników. W przypadku naszego przykładu początkową liczbą próbek była szybkość decymacji lub 441, a docelową liczbą próbek była szybkość interpolacji lub 160. Różnica wynosi 279, co nie jest parzyste. Rozwiązaniem jest podwojenie długości FFT do 882, co powoduje, że docelowa liczba próbek również podwaja się do 320. Teraz różnica jest równa i możesz bez problemu upuścić odpowiednie próbki w dziedzinie częstotliwości.

Jim Clay
źródło
Bardzo dobrze. Jak robisz takie fajne postacie w locie, Jim?
Spacey,
@Mohammad Zwykle używam Powerpoint. W tym przypadku użyłem wersji Powerpoint pakietu Libre Office, która moim zdaniem nazywa się „Impress”.
Jim Clay
Witaj, mam pytanie dotyczące twojej kwestii (2). Co dokładnie masz na myśli w tym kroku: „... a następnie aliasing wyników wysokiej częstotliwości (> 8 kHz) w dół do wyników niskiej częstotliwości (<8 kHz) przed upuszczeniem wyników wysokiej częstotliwości”. Rozumiem wcześniejsze kroki. Po pomnożeniu danych w domenie f przez domenę f mojego filtra, co wtedy? Czy ta metoda działa również, jeśli chcesz również upsamplować swoje dane? Dziękuję Ci.
TheGrapeBeyond
@TheGrapeBeyond Kiedy pseudonim w domenie czasu dodajesz razem wszystkie strefy Nyquist. Pierwsze elementy wszystkich stref Nyquist są sumowane i stają się nowym pierwszym elementem pierwszej strefy Nyquist. Drugi element wszystkich stref Nyquist zostaje zsumowany i staje się nowym drugim elementem pierwszej strefy Nyquist itp.
Jim Clay
Hmm, nie jestem pewien, czy rozumiem, jak sobie radzisz z ponownym próbkowaniem opartym na FFT, ponieważ kiedy próbuję tutaj, otrzymuję bardzo dziwne wyniki. Zadam pytanie.
TheGrapeBeyond
3

Chociaż powyższa odpowiedź jest naprawdę kompletna:

Oto jego sedno:

  1. aby zmniejszyć próbkę sygnału, musi to być liczba całkowita. Przed próbkowaniem sygnału w dół należy go FILTROWAĆ.
  2. można uzyskać próbkowanie w dół liczby wymiernej, najpierw próbkując w górę / interpolując sygnał.
  3. Upsampling polega po prostu na wstawianiu zer, a następnie filtrowaniu sygnału.
  4. aby osiągnąć częstotliwość próbkowania 3/4. próbkuj sygnał w górę, wstawiając 4 zera między każdą próbką sygnału. Zastosuj filtr. Następnie odfiltruj sygnał i usuń co 3 z każdych 4 próbek sygnału.

Szczegóły na ten temat:

http://www.ws.binghamton.edu/fowler/fowler%20personal%20page/EE523_files/Ch_14_1%20Subband%20Intro%20&%20Multirate%20(PPT).pdf

Ponadto: o ile nie jest to absolutnie konieczne NIE NALEŻY komputerować FFT, aby następnie obliczyć IFFT. Jest to niezwykle powolny proces i uważany za nieodpowiedni do większości zadań przetwarzania sygnałów. FFT jest zwykle używany do analizy problemu lub zastosowania przetwarzania sygnału tylko w dziedzinie częstotliwości.

CyberMen
źródło
1

Jak mówił Bjorn Roche, użycie FFT do tego byłoby strasznie inne. Ale tutaj idzie to w bardzo bardzo prosty sposób, stosując metodę filtra próbkowania i próbkowania w dziedzinie częstotliwości.

1 - Weź pożądany sygnał wektorowy o długości N.

2 - Wykonaj punkt N FFT.

3 - Zero padd FFT ze 160 * N zerami na środku wektora FFT.

4 - Wykonaj IFFT

5 - Wybierz jedną z 441 próbek, odrzucając pozostałe 440.

Pozostanie ci wektor o długości N * 160/441, który będzie Twoim ponownie próbkowanym sygnałem.

Jak widać, wykonujesz wiele bezcelowych obliczeń, ponieważ większość wyników zostanie następnie wyrzucona. Ale jeśli masz dostęp do kodu wykonującego FFT, możesz go nieco ulepszyć, aby obliczał tylko wyniki IFFT, z którymi się skończysz, a nie te, które wyrzucisz.

Mam nadzieję, że to pomoże.

kość
źródło