Średnia średnica ruchu buforującego okrągły
Przewodnik Naukowca i Inżynierowie ds. Przetwarzania Przetwarzania Cyfrowego Sygnału Autor: Steven W. Smith, Ph. D. Rozdział 28: Cyfrowe procesory sygnałowe Procesory sygnałów cyfrowych są zaprojektowane do szybkiego wykonywania filtrów FIR i podobnych technik. Aby zrozumieć sprzęt. musimy najpierw zrozumieć algorytmy. W tej sekcji przedstawimy szczegółową listę kroków niezbędnych do wdrożenia filtra FIR. W następnej sekcji zobaczymy, w jaki sposób DSP są zaprojektowane tak, aby wykonywać te czynności tak efektywnie jak to możliwe. Na początek musimy rozróżnić przetwarzanie off-line i przetwarzanie w czasie rzeczywistym. W trybie off-line cały sygnał wejściowy znajduje się w komputerze jednocześnie. Na przykład geofizyk może używać sejsmometru do rejestrowania ruchu ziemi podczas trzęsienia ziemi. Po zakończeniu drgań informacje mogą być odczytywane do komputera i analizowane w jakiś sposób. Innym przykładem przetwarzania off-line jest obrazowanie medyczne, takie jak tomografia komputerowa i MRI. Zestaw danych jest pobierany, gdy pacjent znajduje się wewnątrz urządzenia, ale odtwarzanie obrazu może zostać opóźnione do późniejszego. Kluczowym punktem jest to, że wszystkie informacje są jednocześnie dostępne dla programu przetwarzania. Jest to zjawisko powszechne w badaniach naukowych i inżynierii, ale nie w produktach konsumenckich. Przetwarzanie off-line to dziedzina komputerów osobistych i mainframe. W przetwarzaniu w czasie rzeczywistym sygnał wyjściowy jest wytwarzany w tym samym czasie, w którym pobiera się sygnał wejściowy. Na przykład jest to konieczne w komunikacji telefonicznej, aparatach słuchowych i radarach. Te aplikacje muszą mieć natychmiast dostępną informację, chociaż mogą zostać opóźnione o krótką kwotę. Na przykład, głośnik lub słuchacz nie może wykryć opóźnienia o 10 milisekundach w rozmowie telefonicznej. Podobnie, nie ma znaczenia, jeśli sygnał radaru jest opóźniany o kilka sekund przed wyświetleniem go operatorowi. Aplikacje w czasie rzeczywistym wprowadzają próbkę, wykonują algorytm i wyprowadzają próbkę, over-and-over. Alternatywnie, mogą wprowadzić grupę próbek, wykonać algorytm i wyprowadzić grupę próbek. To jest świat cyfrowych procesorów sygnałowych. Teraz spójrzmy na rys. 28-2 i wyobraźmy sobie, że jest to filtr FIR, który jest realizowany w czasie rzeczywistym. Aby obliczyć próbkę wyjściową, musimy mieć dostęp do pewnej liczby najnowszych próbek z wejścia. Załóżmy na przykład, że w tym filtrze zastosujemy osiem współczynników, a 0. a. hellip 7. Oznacza to, że musimy znać wartość ośmiu ostatnich próbek z sygnału wejściowego, xn, xn -1, hellip xn -7. Te osiem próbek musi być przechowywanych w pamięci i stale aktualizowanych w miarę pobierania nowych próbek. Jaki jest najlepszy sposób na zarządzanie tymi przechowywanymi próbkami Odpowiedź brzmi okrągłym buforowaniem. Na rysunku 28-3 przedstawiono osiem próbek okrągłego bufora. Zostało to umieszczone w okrągłym buforze w ośmiu kolejnych miejscach pamięci, od 2004 do 2004. Rysunek (a) pokazuje, jak osiem próbek z wejściowego mogłoby być przechowywane w określonej chwili w czasie, natomiast (b) pokazuje zmiany po kolejnej próbce nabyty. Idea buforowania kołowego polega na tym, że koniec tej liniowej tablicy jest podłączony do jego początkowej pamięci 20041 jest uważany za następny do 20048, podobnie jak 20044 jest obok 20045. Utrzymujesz śledzenie tablicy przez wskaźnik (zmienna, której wartość jest adresem), która wskazuje, gdzie znajduje się najnowsza próbka. Na przykład w (a) wskaźnik zawiera adres 20044, podczas gdy w (b) zawiera 20045. Po otrzymaniu nowej próbki zastępuje ona najstarszą próbkę w tablicy, a wskaźnik jest przesuwany o jeden adres. Bufory okrĘ ... głe sĘ ... wydajne, ponieważ w przypadku pobrania nowej próbki, tylko jedna wartość musi być zmieniona. Do zarządzania okrągłym buforem potrzebne są cztery parametry. Najpierw musi być wskaźnik, który wskazuje początek okrągłego bufora w pamięci (w tym przykładzie 20041). Po drugie, musi być wskaźnik wskazujący koniec tablicy (na przykład 20048) lub zmienną, która utrzymuje jego długość (na przykład 8). Po trzecie, należy określić wielkość kroku adresowania pamięci. Na rys. 28-3 rozmiar kroku jest równy. na przykład: adres 20043 zawiera jedną próbkę, adres 20044 zawiera następną próbkę i tak dalej. To często nie jest. Na przykład adresowanie może odwoływać się do bajtów, a każda próbka może wymagać przechowywania dwóch lub czterech bajtów. W tych przypadkach rozmiar kroku musiałby wynosić odpowiednio dwa lub cztery. Te trzy wartości określają rozmiar i konfigurację bufora kołowego i nie ulegną zmianie podczas działania programu. Czwarta wartość, wskaźnik do ostatniej próbki, musi zostać zmodyfikowany w miarę pobierania każdej nowej próbki. Innymi słowy, musi istnieć program logiczny, który kontroluje, jak ta czwarta wartość jest aktualizowana w oparciu o wartość trzech pierwszych wartości. Choć ta logika jest dość prosta, musi być bardzo szybka. To jest cały punkt tej dyskusji. DSP powinny być zoptymalizowane w zarządzaniu okrągłymi buforami, aby osiągnąć jak najwyższą szybkość wykonywania. Jako bok, okrągłe buforowanie jest również przydatne w off-line przetwarzania. Rozważmy program, w którym zarówno sygnały wejściowe jak i wyjściowe są całkowicie zawarte w pamięci. Do obliczania convolution nie potrzeba buforowania okólników, ponieważ każda próbka może być natychmiast dostępna. Jednak wiele etapów jest realizowanych przez wiele algorytmów. z pośrednim sygnałem jest tworzony między każdym etapem. Na przykład filtr rekurencyjny przeprowadzony w ten sposób, że seria biquadów działa w ten sposób. Metoda brutalnej siły polega na przechowywaniu całej długości każdego pośredniego sygnału w pamięci. Cykliczne buforowanie zapewnia inną opcję: przechowywać tylko te pośrednie próbki potrzebne do obliczeń pod ręką. Zmniejsza to wymaganą ilość pamięci, kosztem bardziej skomplikowanego algorytmu. Ważnym założeniem jest to, że bufory kołowe są przydatne do przetwarzania poza siecią, ale mają kluczowe znaczenie dla aplikacji w czasie rzeczywistym. Teraz możemy przyjrzeć się krokom niezbędnym do wykonania filtra FIR przy użyciu kołowych buforów zarówno sygnału wejściowego, jak i współczynników. Ta lista może wydawać się trywialna i nadmierna, a nie Skuteczna obróbka tych pojedynczych zadań polega na oddzieleniu DSP od tradycyjnego mikroprocesora. Dla każdej nowej próbki należy wykonać wszystkie poniższe kroki: celem jest szybkie wykonanie tych czynności. Ponieważ kroki 6-12 powtarzają się wielokrotnie (raz dla każdego współczynnika w filtrze), należy zwrócić szczególną uwagę na te operacje. Tradycyjne mikroprocesory muszą wykonywać te 14 kroków seryjnych (jeden po drugim), podczas gdy DSP są zaprojektowane do ich równoległych. W niektórych przypadkach wszystkie operacje w obrębie pętli (kroki 6-12) mogą być zakończone w jednym cyklu zegara. Pozwalamy spojrzeć na wewnętrzną architekturę, która pozwala na to wspaniałe wykonanie. Nie mam pojęcia o okrągłych buforach Jeśli chodzi o język C w kontekście przypisania: kwercowa buforowa tablica to tablica. Zacznij wprowadzać rzeczy do zera elementu i zwiększyć indeks dla następnego dostępu. Gdy indeks stanie się większy niż największa dopuszczalna wartość (tj. Następny dostęp wykracza poza koniec tablicy), po prostu ustaw indeks na zero. Oznacza to, że po pełnym buforze (program napisał coś w każdym elemencie tablicy) dalsze uzyskiwanie dostępu spowoduje nadpisanie poprzedniej wartości w każdym adresie. Powoduje to zastąpienie najstarszej wartości najnowszą wartością za każdym razem, a średnia wszystkich elementów tablicy zawsze wykorzystuje najnowsze wartości próbek. Na przykład dla okrągłego buforu ints: Oczywiście, nie potrzebujesz osobnej zmiennej o nazwie MAXINDEX, ale to podkreśliłem. (To jest po prostu porównać currentindex z BUFFERSIZE-1.) Originally Posted by tellthatmatt szybkie pytanie, czy jest jakieś dedykowane funkcji, aby pozwolić mi podjąć średnią tablicy lub czy muszę kod go przez dodanie wszystkich elementów razem wzmacniacza następnie podzielenie . Nazywa się pętlą. (Nie jest to funkcja, ale istnieje kilka wbudowanych konstrukcji sterujących do tworzenia pętli.) Jeśli wiesz, że zrobisz coś dokładnie n razy, to pętla może wyglądać tak: Załóżmy, że masz tablicę x dziesięć podwójnych liczb precyzji i chcesz znaleźć sumę ich wartości (to znaczy: chcesz sumę x0 x1 x2 x9). Potem można to zrobić tak: Originally Posted by tellthatmatt whats najlepszym sposobem na przeczytanie liczb całkowitych z pliku w tym przypadku mamy havnt jeszcze objęte to w klasie amp mój podręcznik doesnt wyjaśnić to bardzo dobrze w ogóle. Myślę, że to coś z fgetsc () funkcji, ale nie jestem pewien. reszta mojego programu działa prawidłowo, po prostu nie wiem, jak czytać liczby całkowite z pliku TEXT Jeśli plik tekstowy zawiera liczby całkowite, to fscanf () najprawdopodobniej jest najprostszym sposobem i jest moim zdaniem najbardziej odpowiedni. (Ale istnieją inne sposoby). Używając fscanf (), podajesz adres (y) dowolnej zmiennej (ów), którą czytasz. Wartość zwracana przez fscanf to liczba elementów, które zostały pomyślnie konwertowane. Zawsze (zawsze) testuj wartość zwracaną. Na przykład, jeśli chcesz przeczytać wartość w jedną wartość: To jest tylko test, aby pokazać, co próbowało wyjaśnić. fscanf () nie powiedzie się (to znaczy, że jego wartość będzie zerem), jeśli nie może konwertować materiału na int --- to znaczy, że napotka char, który nie jest białymi literami i nie jest cyfrą dziesiętną od 0 do 9. jeśli próbuje odczytać koniec końca pliku. Jeśli chcesz odczytać wartość w elemencie tablicy, a następnie podaj scanf adresowi elementu. Jeśli chcesz przeczytać całą zawartość plików w tablicy liczb całkowitych używanych jako okrągły bufor: okrągłe przewijanie sygnałów bufora tapsa wygenerowanego wiersza opóźnienia Automatyczne przesuwanie regresji Trzy słowa pamięci są umieszczane w obszarze zorganizowanym jako okrągły bufor. Dane wejściowe są zapisywane do słowa wskazanego przez indeks, a trzy poprzednie wartości wejścia są odczytywane z trzema poprzednimi wartościami indeksu. W każdej chwili próbki cztery indeksy są zwiększane o jeden, a trik zaczyna się od miejsca 0, gdy przekroczymy długość M bufora (co zapewnia okrągłość bufora). Strzałka w lewo wskazuje kierunek przebiegu indeksów, natomiast strzałka wskazująca ruch wskazówek zegara wskazuje ruch, który powinien być wykonany przez dane, jeśli indeksy pozostaną w stałym położeniu. Na rys. 13 używamy małych trójkątów w celu wskazania mnożników przez współczynniki filtru. Jest to notacja powszechnie używana do mnożenia w obrazach przepływowych reprezentujących filtry cyfrowe. Faktycznie filtr FIR zawiera linię opóźniającą, ponieważ przechowuje N kolejnych próbek sekwencji wejściowej i używa każdego z opóźnieniem najwyżej N próbek. Punkty, w których czytany jest okrągły bufor nazywa się kranami, a cała struktura nazywana jest linią opóźnienia. Ogólnie rzecz biorąc, przyczynowy filtr IIR jest reprezentowany przez równanie różniczkowe, w którym uzyskiwany jest sygnał wyjściowy w danej chwili jako liniowa kombinacja próbek sygnałów wejściowych i wyjściowych w poprzednich momentach czasowych. Ponadto w filtrze IIR znajduje się również chwilowa zależność wyjścia na wejściu. Równanie różniczkowe reprezentujące filtr IIR jest równ. (24) jest również nazywana odwzorowaniem ARM (Moving Average Moving Average). Podczas gdy odpowiedź impulsowa filtrów FIR ma skończone przedłużenie czasu, odpowiedź impulsowa filtrów IIR ma na ogół nieskończone przedłużenie. Funkcja transferu jest uzyskiwana przez zastosowanie przekształcenia Z do sekwencji (24). Ze względu na twierdzenie o zmianie, transformacja Z jest zwykłym podstawieniem operacyjnym każdego tłumaczenia m próbek z mnożeniem przez z Wynikiem jest racjonalna funkcja H (z), która dotyczy przekształcenia Z wyjścia na transformację Z input: Kolejność filtra jest definiowana jako wielomian w z Filtr Simplest IIR W tej części przeanalizujemy właściwości najprostszego filtra IIR, które można sobie wyobrazić: jeden biegunowy filtr o współczynnikach aIm realizujący 80-72 -64-48 wielokrotnego przeciętnego filtra ruchu dla osadzonego systemu w C iw punkcie stałym. Implementacja jest okrągłym buforem, w którym utrzymuje się bieżącą sumę i oblicza yn yn-1 xn - xn-M gdzie M jest długością filtra. Dzieje się tak dla każdego filtra z wyjściem z jednej sesji jako wkładu innego. Im skalowanie moich współczynników o 2, co daje mi współczynniki o długości 2 lub 2 w zależności od długości filtra. Następnie wynik jest zmniejszany o 2, aby uzyskać poprawne wyjście. Teraz wszystko wygląda dobrze na krótkich skalach, ale przez długie lata mam dryf. Powodem rekurencyjnego wdrożenia jest zapisywanie obliczeń na wbudowanym procesorze. Włączam obraz niektórych wewnętrznych filtrów, gdy zastosowana jest odpowiedź krokowa i możemy zobaczyć funkcje transferu filtrów kształtujących, kwadratowych, trójkątów, a następnie przybliżenie gaussowskiego tak, aby filtr pracował zgodnie z oczekiwaniami. Czy istnieje jakiś sposób na to, a gdzie jest najbardziej prawdopodobne źródło tego. to ten dryf z powodu trochę zagubienia się w przesunięciu czy czymś innym. Drift nie jest obecny dla wejść DC, ale dla sygnałów AC powoli dryfuje. ROZWIĄZANIE: Problem występował w akumulatorze, jak sugerował Robert w komentarzach. Problem polegał na tym, że jeden z elementów obliczeń przeszedł dodatkową zmianę w górę iw dół w porównaniu do reszty, co spowodowało powstanie okrągłego przesunięcia. zapytany 27 kwietnia o godzinie 21:12 Twój akumulator yn jest zaokrąglany lub kwantyzowany w jakikolwiek sposób musisz upewnić się, że xn-M odejmowana jest dokładnie taka sama jak xn, która została dodana M próbek temu. więc naprawdę chcesz ruszyć sumę. zamiast średniej ruchomej i skalibrować wynik Twojej ruchomej sumy (z 1M), aby uzyskać średnią. jest to dosyć możliwe do wykonania, a nawet lepiej wykonane w stałym punkcie, a nie na zmiennoprzecinkowe. ndash robert bristow-johnson Kwiecień 27 15 at 22:52 notScaling współczynnikówquot Zakładam, że dzieli przez M po każdym etapie, a to jest współczynnik, który skalę Jest to prawdopodobnie przyczyną offsetu. Lepiej niż podzielić przez prod Mi na końcu wszystkich filtrów. Trzeba śledzić wewnętrzne amplitudy, chociaż ostatecznie przepełniasz akumulatory. Jest to jednak łatwe do rozwiązania poprzez modulo arytmetyczne (w tym szczególny przypadek jest uzupełnieniem dwóch osób). ndash Oscar 28 kwietnia o godzinie 7:00 Oscar, jest to filtr punktów stałych. Znaczenie i tylko arytmetyka całkowita. W przypadku średniej ruchomości o długości gt 1 z zyskiem 1 stały filtr będzie frakcją, która nie może być reprezentowana w liczbach całkowitych. Więc współczynniki są skalowane, aby ich liczb całkowitych przez lewo przesuwanie ich x wiele bitów. Z tego powodu końcowe wyjście musi być przesunięte tak samo na prawo jak najwięcej bitów. Nie mogę utrzymywać sumy na wszystkich 4 filtrach bez przywrócenia wyjścia między nimi, sygnał wejściowy wynosi 16 bitów, a współczynnik skalowania i długości współczynników pojedynczy filtr używa całej przestrzeni akumulatora 32 bitowego ndash user70614 Apr 28 15 at 8:20
Comments
Post a Comment