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.
- Podkład danych wejściowych do 1024 na końcu
- Wykonaj FFT
- Przeczytaj pierwsze 512 elementów do tablicy (potrzebuję tylko pierwszych 362, ale potrzebuję ^ 2)
- Wykonaj odwrotną FFT
- 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.
Odpowiedzi:
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.
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.
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.
Uwaga: częstości próbkowania nie są skalowane, służą jedynie zilustrowaniu pojęć.
Jak możesz podejrzewać, istnieje kilka potencjalnych problemów. Przejrzę je i wyjaśnię, jak je pokonać.
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.
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.
źródło
Chociaż powyższa odpowiedź jest naprawdę kompletna:
Oto jego sedno:
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.
źródło
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.
źródło