Wednesday 22 November 2017

Przenoszenie średnia filtr matlab code example


Pobierz movAv. m (patrz także movAv2 - zaktualizowana wersja umożliwiająca ważenie) Opis Matlab zawiera funkcje nazwane movavg i tsmovavg (średnia czasowa ruchu szeregów czasowych) w Przyborniku finansowym, movAv jest przeznaczony do replikowania podstawowych funkcji tych. Kod tutaj stanowi dobry przykład zarządzania indeksami wewnątrz pętli, co może być mylące na początek. Rozmyślnie trzymałem kod krótki i prosty, aby ten proces był jasny. movAv wykonuje prostą średnią ruchomą, która może być używana do odzyskiwania hałaśliwych danych w niektórych sytuacjach. Działa poprzez przyjmowanie średniej wartości wejściowej (y) na przesuwanym oknie czasowym, którego rozmiar jest określony przez n. Im większe n, tym większa ilość wygładzania efektu n jest zależna od długości wektora wejściowego y. i skutecznie (no, w pewnym sensie) tworzy filtr dolnoprzepustowy - patrz rozdział Przykłady i zagadnienia. Ponieważ wielkość wygładzania zapewniona przez każdą wartość n jest zależna od długości wektora wejściowego, zawsze warto przetestować różne wartości, aby zobaczyć, co jest właściwe. Pamiętaj także, że n punktów jest traconych na każdej średniej, jeśli n wynosi 100, pierwsze 99 punktów wektora wejściowego nie zawiera wystarczającej ilości danych dla średniej 100pt. Można tego w pewnym stopniu uniknąć, układając średnie wartości, na przykład poniższy kod i wykres porównują różne długości okien o różnych długościach. Zwróć uwagę, jak gładki 1010pt jest porównywany z pojedynczą średnią 20pt. W obu przypadkach łącznie traci się 20 punktów danych. Utwórz xaxis x1: 0.01: 5 Wygeneruj szum hałasuReps 4 repmat szumu (randn (1, ceil (numel (x) noiseReps)), noiseReps, 1) noise shape (noise, 1, length (noise) noiseReps) Generuj ydata noise yexp ( x) 10noza (1: długość (x)) Od średnich: y2 movAv (y, 10) 10 pkt y3 movAv (y2, 10) 1010 pkt y4 movAv (y, 20) 20 pkt y5 movAv (y, 40) 40 pkt y6 movAv (y, 100) 100 pt Legenda wydruku wykresu (x, y, y2, y3, y4, y5, y6) (surowe dane, 10pt średnia ruchoma, 1010pt, 20pt, 40pt, 100pt) xlabel (x) ylabel ( y) tytuł (Porównanie średnich kroczących) wartość wyjściowa funkcji movAv. m movAv (y, n) Pierwsza linia definiuje nazwę funkcji, wejścia i wyjścia. Wejście x powinno być wektorem danych do wykonania średniej na, n powinna być liczbą punktów do wykonania średniej ponad wyjście będzie zawierać uśrednione dane zwracane przez funkcję. Prealocate output output NaN (1, numel (y)) Znajdź punkt środkowy rundy midpoint (n2) Główna praca funkcji odbywa się w pętli for, ale przed rozpoczęciem przygotowuje się dwie rzeczy. Po pierwsze, dane wyjściowe są wstępnie przydzielane jako NaN, co służy dwóm celom. Po pierwsze, wstępna alokacja jest ogólnie dobrą praktyką, ponieważ redukuje ona żonglowanie pamięcią Matlaba, a po drugie bardzo ułatwia umieszczanie uśrednionych danych na wyjściu o takim samym rozmiarze jak wektor wejściowy. Oznacza to, że te same xaxis mogą być później użyte dla obu, co jest wygodne do wykreślania, alternatywnie NaN można później usunąć w jednym wierszu kodu (wyjście wyjściowe (Zmienna midPoint będzie używana do wyrównania danych w wektorze wyjściowym. n 10, 10 punktów zostanie utraconych, ponieważ dla pierwszych 9 punktów wektora wejściowego nie ma wystarczającej ilości danych, aby uzyskać średnią z 10 punktów, ponieważ dane wyjściowe będą krótsze niż dane wejściowe, muszą być odpowiednio wyrównane. być użyte, aby na początku i na końcu utracić taką samą ilość danych, a dane wejściowe są utrzymywane w wyrównaniu z danymi wyjściowymi przez bufory NaN utworzone podczas wstępnego przydzielania danych wyjściowych dla 1: length (y) - n Znajdź zakres indeksów, aby uzyskać średnią over (a: b) bana Obliczyć średnią wartość wyjściową (amidPoint) średnia (y (a: b)) koniec W pętli for, średnia jest brana na każdy kolejny segment wejścia. Pętla będzie działać dla a., która jest zdefiniowane jako 1 do długości wejścia (y) minus dane, które zostaną utracone (n).Jeśli wejście wynosi 100 punktów ng in wynosi 10, pętla będzie przebiegać od (a) od 1 do 90. Oznacza to, że zapewnia pierwszy indeks segmentu, który ma być uśredniony. Drugi indeks (b) jest po prostu an-1. Tak więc w pierwszej iteracji, a1. n10. więc b 11-1 10. Pierwsza średnia jest pobierana przez y (a: b). lub x (1:10). Średnia tego segmentu, który jest pojedynczą wartością, jest przechowywana w wynikach w indeksie amidPoint. lub 156. W drugiej iteracji, a2. b 210-1 11. więc średnia jest brana pod x (2:11) i zapisywana na wyjściu (7). W ostatniej iteracji pętli dla wejścia o długości 100, a91. b 9010-1 100, więc średnia jest brana na x (91: 100) i zapisywana na wyjściu (95). Pozostawia to wynik w sumie n (10) wartości NaN na indeksie (1: 5) i (96: 100). Przykłady i rozważania Średnie kroczące są przydatne w niektórych sytuacjach, ale nie zawsze są najlepszym wyborem. Oto dwa przykłady, które niekoniecznie są optymalne. Kalibracja mikrofonu Ten zestaw danych reprezentuje poziomy każdej częstotliwości wytwarzanej przez głośnik i rejestrowane przez mikrofon ze znaną reakcją liniową. Moc wyjściowa głośnika zmienia się z częstotliwością, ale możemy skorygować tę zmianę za pomocą danych kalibracyjnych - moc wyjściową można regulować w poziomie, aby uwzględnić fluktuacje w kalibracji. Zauważ, że surowe dane są hałaśliwe - oznacza to, że niewielka zmiana częstotliwości wymaga dużej, nieobliczalnej zmiany poziomu. Czy jest to realistyczne? Czy jest to produkt środowiska nagrywającego? Rozsądne w tym przypadku jest zastosowanie średniej ruchomej, która wygładza krzywą częstotliwości, aby uzyskać krzywą kalibracji, która jest nieco mniej błędna. Ale dlaczego nie jest to optymalne w tym przykładzie? Więcej danych byłoby lepsze - uśrednione wielokrotne kalibracje zniszczyłyby hałas w systemie (tak długo, jak jego losowe wartości) i zapewnią krzywiznę z mniejszą ilością subtelnych szczegółów. Średnia ruchoma może jedynie przybliżać to, i może usunąć niektóre spadki i piki wyższej częstotliwości z krzywej, która naprawdę istnieje. Fale sinusoidalne Używanie średniej ruchomej na falach sinusoidalnych podkreśla dwa punkty: Ogólny problem wyboru rozsądnej liczby punktów do wykonania średniej. Jest to proste, ale istnieją skuteczniejsze metody analizy sygnałów niż uśrednianie sygnałów oscylujących w dziedzinie czasu. Na tym wykresie oryginalna fala sinusoidalna jest naniesiona na niebiesko. Hałas jest dodawany i wykreślany jako pomarańczowa krzywa. Średnia ruchoma jest wykonywana z różną liczbą punktów, aby sprawdzić, czy można odzyskać oryginalną falę. 5 i 10 punktów daje rozsądne wyniki, ale nie usuwaj hałasu w całości, gdzie jako większa liczba punktów zaczynają tracić szczegóły amplitudy, ponieważ średnia rozciąga się na różne fazy (pamiętaj, że fala oscyluje wokół zera, a średnia (-1 1) 0) . Alternatywnym podejściem byłoby skonstruowanie filtra dolnoprzepustowego, niż można zastosować do sygnału w dziedzinie częstotliwości. Nie będę wchodził w szczegóły, ponieważ wykracza poza zakres tego artykułu, ale ponieważ szum jest znacznie większą częstotliwością niż częstotliwość podstawowa fal, w tym przypadku byłoby dość łatwo skonstruować filtr dolnoprzepustowy, niż usunąć wysoką częstotliwość noise. Averaging Filter Ten przykład pokazuje zalecany przepływ pracy dla generowania kodu C z funkcji MATLAB przy użyciu polecenia codegen. Oto kroki: 1. Dodaj dyrektywę codegen do funkcji MATLAB, aby wskazać, że jest ona przeznaczona do generowania kodu. Niniejsza dyrektywa umożliwia również analizatorowi kodów MATLAB identyfikowanie ostrzeżeń i błędów specyficznych dla MATLAB do generowania kodu. 2. Wygeneruj funkcję MEX, aby sprawdzić, czy kod MATLAB nadaje się do generowania kodu. Jeśli wystąpią błędy, powinieneś je naprawić przed wygenerowaniem kodu C. 3. Przetestuj funkcję MEX w MATLAB, aby upewnić się, że jest funkcjonalnie równoważna z oryginalnym kodem MATLAB i że nie występują błędy czasu wykonywania. 4. Wygeneruj kod C. 5. Sprawdź kod C. Wymagania wstępne Nie ma żadnych wymagań wstępnych dla tego przykładu. Utwórz nowy folder i skopiuj odpowiednie pliki Poniższy kod spowoduje utworzenie folderu w bieżącym folderze roboczym (pwd). Nowy folder będzie zawierał tylko pliki odpowiednie dla tego przykładu. Jeśli nie chcesz wpływać na bieżący folder (lub jeśli nie możesz wygenerować plików w tym folderze), powinieneś zmienić folder roboczy. Uruchom polecenie: Utwórz nowy folder i skopiuj odpowiednie pliki Informacje o funkcji filtru uśredniającego Funkcja uśredniania filtru. m działa jako filtr uśredniający na sygnał wejściowy, pobierający wektor wejściowy wartości i oblicza średnią dla każdej wartości w wektorze. Wektor wyjściowy ma taki sam rozmiar i kształt jak wektor wejściowy. Dyrektywa kompilacyjna codegen wskazuje, że kod MATLAB jest przeznaczony do generowania kodu. Utwórz niektóre dane próbki Wygeneruj hałaśliwą falę sinusoidalną i narysuj wynik. Wygeneruj funkcję MEX do testowania Wygeneruj funkcję MEX za pomocą polecenia codegen. Polecenie codegen sprawdza, czy funkcja MATLAB nadaje się do generowania kodu i generuje funkcję MEX, którą można przetestować w MATLAB przed wygenerowaniem kodu C. Ponieważ C używa pisania statycznego, kodegen musi określić właściwości wszystkich zmiennych w plikach MATLAB podczas kompilacji. W tym przypadku opcja wiersza polecenia - args dostarcza przykładowe wejście, aby kodek mógł wnioskować o nowych typach w oparciu o typy wejściowe. Wykorzystanie przykładowego sygnału utworzonego powyżej jako przykładowego wejścia zapewnia, że ​​funkcja MEX może korzystać z tego samego wejścia. Domyślnie kodegen generuje w bieżącym folderze funkcję MEX o nazwie averagingfiltermex. Pozwala to przetestować kod MATLAB i funkcję MEX i porównać wyniki. Przetestuj funkcję MEX w MATLAB Uruchom funkcję MEX w MATLAB Generate C Code Sprawdź wygenerowany kod Polecenie codegen z opcją - config coder. config (lib) generuje kod C zapakowany jako samodzielna biblioteka C. Wygenerowany kod C znajduje się w folderze codegenlibaververfilter. Pliki są następujące: Sprawdź kod C dla averagingfilter. c Funkcja Wybierz kraj Dokumentacja Ten przykład pokazuje zalecany przepływ pracy dla generowania kodu C z funkcji MATLAB przy użyciu polecenia codegen. Oto kroki: 1. Dodaj dyrektywę codegen do funkcji MATLAB, aby wskazać, że jest ona przeznaczona do generowania kodu. Niniejsza dyrektywa umożliwia również analizatorowi kodów MATLAB identyfikowanie ostrzeżeń i błędów specyficznych dla MATLAB do generowania kodu. 2. Wygeneruj funkcję MEX, aby sprawdzić, czy kod MATLAB nadaje się do generowania kodu. Jeśli wystąpią błędy, powinieneś je naprawić przed wygenerowaniem kodu C. 3. Przetestuj funkcję MEX w MATLAB, aby upewnić się, że jest funkcjonalnie równoważna z oryginalnym kodem MATLAB i że nie występują błędy czasu wykonywania. 4. Wygeneruj kod C. 5. Sprawdź kod C. Wymagania wstępne Nie ma żadnych wymagań wstępnych dla tego przykładu. Utwórz nowy folder i skopiuj odpowiednie pliki Poniższy kod spowoduje utworzenie folderu w bieżącym folderze roboczym (pwd). Nowy folder będzie zawierał tylko pliki odpowiednie dla tego przykładu. Jeśli nie chcesz wpływać na bieżący folder (lub jeśli nie możesz wygenerować plików w tym folderze), powinieneś zmienić folder roboczy. Uruchom polecenie: Utwórz nowy folder i skopiuj odpowiednie pliki Informacje o funkcji filtru uśredniającego Funkcja uśredniania filtru. m działa jako filtr uśredniający na sygnał wejściowy, pobierający wektor wejściowy wartości i oblicza średnią dla każdej wartości w wektorze. Wektor wyjściowy ma taki sam rozmiar i kształt jak wektor wejściowy. Wybierz swój kraj

No comments:

Post a Comment