2012-04-04 16 views
8

Po pierwsze, przepraszam, że nie zamieszczałem tutaj kodu. Z jakiegoś powodu cały kod został zawalony upp, gdy próbowałem wprowadzić kod, który miałem na tej stronie, i prawdopodobnie było zbyt wiele, aby opublikować, aby być akceptowanym. Oto mój kod: http://pastebin.com/bmMRehbdFiltr dolnoprzepustowy FIR z konwertacją FFT - zakładka dodaj, dlaczego i jak

Teraz, od tego, co mi powiedziano, powodem, dla którego nie mogę uzyskać dobrego wyniku z tego kodu, jest to, że nie używam nakładania. Próbowałem przeczytać na kilku źródłach w Internecie, dlaczego muszę użyć nakładki dodać, ale nie mogę tego zrozumieć. Wygląda na to, że działa filtr siłowy, bo wszystko powyżej danego odcięcia, rzeczywiście odcina.

Należy wspomnieć, że jest to kod stworzony do pracy dla vst2-sdk.

Czy ktoś może mi powiedzieć, dlaczego muszę go dodać i jak mogę zaimplementować dodawanie kodu do kodu?

Należy również wspomnieć, że jestem dość głupi, jeśli chodzi o algorytmy i matematykę. Jestem jedną z tych osób, które muszą wizualnie zrozumieć, co robię. To lub otrzymywanie rzeczy wyjaśnione przez kod :), a następnie mam na myśli faktyczne nakładanie się.

overlad dodać teorię: http://en.wikipedia.org/wiki/Overlap%E2%80%93add_method

Dzięki za wszelką pomoc można dać!

+0

Przez "nakładanie się dodaj" masz na myśli skondensowaną wielokrotność kumulacji? –

+0

http://en.wikipedia.org/wiki/Overlap%E2%80%93add_method jest co mam na myśli chyba :) – Hiam

Odpowiedz

3

Metoda nakładania-dodawania jest potrzebna do obsługi granic każdego bufora fft. Problem polega na tym, że mnożenie w domenie FFT powoduje kołowy splot w dziedzinie czasu. Oznacza to, że po perfekcji IFFT wyniki na końcu ramki zawijają się i zniekształcają wyjściowe próbki na początku ramki.

Może być łatwiej myśleć w ten sposób: Załóżmy, że masz filtr o długości N. Liniowy splot tego filtra z próbkami wejściowymi M faktycznie zwraca M+N-1 próbek wyjściowych. Jednak splot kołowy wykonany w domenie FFT daje taką samą liczbę próbek wejściowych i wyjściowych, M. Dodatkowe próbki ze splotu liniowego "zawijają się" i zniekształcają pierwsze próbki wyjściowe.

Oto przykład (Matlab lub oktawy)

a = [1,2,3,4,5,6]; 
b = [1,2,1]; 
conv(a,b) %linear convolution 

    1 4 8 12 16 20 17 6 

ifft(fft(a,6).*fft(b,6)) %circular convolution 

    18 10 8 12 16 20 

Należy zauważyć, że w ciągu ostatnich 2 próbki są owinięte wokół i dodano do pierwszych 2 próbek z okrągłej obudowy.

Metody nakładania-dodawania/nakładania-save są w zasadzie metodami obsługi tego oblewania. Nakładanie się buforów FFT jest potrzebne, ponieważ splot kołowy zwraca mniej nieprzekształconych próbek wyjściowych niż liczba próbek wejściowych.

+0

To wyjaśnia, dlaczego potrzebuję tego bardzo dobrze, po prostu muszę trochę o tym pomyśleć i zobaczyć, jak mogę zaadoptować ten knolwedge do kodu. – Hiam

4

Po przeprowadzeniu splotu (ze skończonym filtrem odpowiedzi impulsowej) poprzez zastosowanie odwrotnej dyskretnej transformaty Fouriera iloczynu dyskretnych transformacji Fouriera dwóch sygnałów wejściowych, w rzeczywistości stosuje się splot kołowy. Niniejszym nazywam to "splotem wyliczonym w dziedzinie częstotliwości". (Jeśli nie wiesz, co to jest kołowy splot, look at this link. Jest to w zasadzie splot, w którym zakłada się, że domena jest okrągła, tj. Przesunięcie sygnału poza boki powoduje, że jest on "zawinięty" na drugą stronę domeny).

Generalnie chcesz przeprowadzić splot, korzystając z szybkich transformacji Fouriera dla dużych sygnałów, ponieważ jest on wydajniejszy obliczeniowo.

Nakładka add (i jego kuzyn, save overlap) są metodami, które działają na to, że zawiłości wykonywane w domenie częstotliwości są naprawdę kolistymi zwojami, ale w rzeczywistości rzadko chcemy robić splot kołowy, ale zwykle raczej liniowe zawijasy .

Nakładanie dodaje się za pomocą fragmentów "zerowego wypełnienia" sygnału wejściowego, a następnie odpowiednio wykorzystując część kolistych zwojów (wykonanych w domenie częstotliwości). Nakładanie się zachowuje, przechowując jedynie część sygnału odpowiadającą liniowemu splotowi i przewracając część, która została "uszkodzona" przez okrężne przesunięcia.

Oto dwa linki dla Wikipedii dla obu metod.

Overlap-add: Ten ma fajną figurkę wyjaśniającą, co się dzieje.

Overlap-save

This book by Orfanidis explains it well. See section 9.9.2. To nie jest standard „de facto” na przetwarzaniu sygnału, ale to bardzo dobrze napisana i jest lepiej niż wprowadzenie innych książek, moim zdaniem.

+0

Tak, problem polega na tym, że nie mogę zrozumieć algorytmów, o których mi mówią w artykułach wikipedii , nie mogę dopasować go do mojego kodu. Próbowałem co najmniej tyle :) – Hiam

+0

Najlepszym odniesieniem, jakie widziałem w tej książce, była książka, którą miałem w Rutgers Orfanidis. [Tutaj jest link do .pdf] (http://www.ece.rutgers.edu/~orfanidi/intro2sp/orfanidis-i2sp.pdf) Rozdział 9.9.2 wyjaśnia to bardzo dobrze. –

+0

Przepraszam, chciałbym napisać kod tylko w przypadku, gdy ktoś zapłacił mi lub stopień zależał od tego. To nie jest proste i wymaga myślenia o przypadkach i rozmiarach tablic itp. Ta książka powinna jednak pomóc w zrozumieniu. –

0

Po pierwsze, zrozumcie, że splot w dziedzinie czasu jest równoważny mnożeniu w dziedzinie częstotliwości. W splotach, jesteś w przybliżeniu O (n * m), gdzie n jest długością FIR, a m jest liczbą próbek do przefiltrowania.W dziedzinie częstotliwości, używając FFT, uruchamiasz O (n * log n). Dla wystarczająco dużego n, koszt filtrowania jest znacznie mniejszy, gdy robi się to w dziedzinie częstotliwości. Jeśli n jest względnie małe, korzyści maleją do tego stopnia, że ​​łatwiej je odfiltrować w dziedzinie czasu. Ten punkt przerwania jest subiektywny, jednak jest to 50 do 100 jako punkt, w którym możesz się zmienić.

+0

Jestem prawdopodobnie zbyt głupi, ale algorytmy nie pasują do mnie. Jeśli mógłbyś w jakiś sposób przekształcić to, co powiedziałeś, w kod, to mógłbym to zrozumieć :) – Hiam

+0

To jest wyjaśnienie dla zawijania przez domenę częstotliwości, a nie wyjaśnienie, dlaczego nakładanie-dodawania jest wymagane. –

0

Tak, filtr splotów będzie "działał", jeśli chodzi o zmianę charakterystyki częstotliwościowej. Ale to zwielokrotnienie w dziedzinie częstotliwości spowoduje również zanieczyszczenie danych w dziedzinie czasu na jednym końcu danymi z drugiego końca i odwrotnie. Overlap add/save rozszerza rozmiar FFT i usuwa "zanieczyszczony" koniec, a następnie wykorzystuje dane końca, aby ustalić początek kolejnego okna FFT.