Wskazówki pomocnicze do ćw. P3 – programowanie Podane

Transkrypt

Wskazówki pomocnicze do ćw. P3 – programowanie Podane
Wskazówki pomocnicze do ćw. P3 – programowanie
Podane funkcje dotyczą pakietu Scilab. Więcej informacji o tych funkcjach oraz o innych funkcjach można
znaleźć w pomocy, która jest dostępna z okna konsoli pakietu.
Nad programami z pewnością trzeba popracować w ramach pracy własnej po zajęciach!
Ad 1.
Najpierw należy ustalić format pliku CSV – które wiersze i kolumny zawierają dane, jaki jest separator kolumn, a
jaki jest znak dziesiętny itd. Dla uproszczenia należy założyć, że zarejestrowane dane będą zawsze pochodzić z 2
kanałów.
Zmiana katalogu roboczego w konsoli – cd().
Notacja elementów macierzy w środowisku Scilab:
• pojedynczy element wektora – v(i);
• element macierzy – m(i,j);
• kolumna macierzy – m(:,j);
• wiersz macierzy – m(i,:).
Można zacząć od próby wykorzystania funkcji csvRead (nie nadaje się ona jednak do niestandardowych
formatów typu CSV, z którymi dość często można się spotkać.
Jeżeli natomiast skorzystanie z funkcji csvRead okaże się niemożliwe, należy skorzystać z ogólnych funkcji
obsługi plików. Najprostsze z nich (w obsłudze) są te podobne do języka C, o nazwach rozpoczynających się od
„m” (mopen, mclose itd.), chociaż można także korzystać z analogicznych funkcji bez tego przedrostka
(działających w sposób bardziej zbliżony do środowiska Matlab). Funkcje, których użycie można rozważyć (nie
wszystkich naraz), to:
• mfscanf() – odczyt wartości z pliku zgodnie z podanym formatem – nie jest dobrym rozwiązaniem, gdyż
pola mają różną długość, ich separator nie jest przerwą (spacją, tabulacją itp.), za to zawierają one spacje
wewnątrz siebie, tymczasem założenia funkcji typu scanf są dokładnie odwrotne;
• mgetl() – odczyt całej(ych) linii z pliku;
• msscanf() – odczyt wartości z łańcucha znaków (np. z linii) zgodnie z podanym formatem.
Funkcje operujące na łańcuchach znaków (w zależności od rozwiązania, nawet żadna może nie być potrzebna):
• strsubst() – w łańcuchu wyszukaj i zamień podłańcuch (można by zamienić dotychczasowe separatory na
przerwy, ale uwaga: przerwy następujące bezpośrednio po sobie traktowane są jako jedna – trzeba by
najpierw pozbyć się takiej możliwości);
• tokens() – podział łańcucha (np. linii) na podłańcuchy według podanego separatora (do separatorów
stosuje się uwaga jak do przerw po wyżej);
• strtod() – konwersja łańcucha znaków na wartość typu double;
• part() – wydzielenie części łańcucha o konkretnych numerach znaków,
• strchr() – pozycja konkretnego znaku w łańcuchu,
• strrchr() – pozycja konkretnego znaku w łańcuchu idąc od końca,
• strstr() – pozycja podłańcucha w łańcuchu,
• strsplit() – podział łańcucha na podłańcuchy na konkretnych numerach znaków,
• strncpy() – wydzielenie konkretnych znaków z łańcucha,
• stripblanks() – odrzucenie przerw (spacji, ew. tabulacji) z końca i początku łańcucha,
• inne – wyszczególnione w sekcji „Strings” pomocy.
Ad 2.
Oprzeć się na definicji wartości skutecznej.
Należy zwrócić uwagę, że całkowanie musi się odbywać za całkowitą liczbę okresów. Niekoniecznie musi to
jednak być 1 okres; większa liczba da taki wynik, jak uśrednienie za taką liczbę pomiarów, co z reguły jest
korzystne. Funkcja powinna sama obciąć zapis z oscyloskopu do odpowiedniej liczby próbek. W tym punkcie
należy przyjąć, że częstotliwość zna użytkownik i poda ją jako parametr funkcji. Natomiast funkcja powinna
sama ustalić, ile okresów mieści się w zarejestrowanym fragmencie.
Należy zaimplementować lub skorzystać z gotowej funkcji całkowania numerycznego, np. inttrap(), intsplin().
W celu skrócenia czasu obliczeń, należy wszystkie możliwe operacje wyciągnąć przed całkowanie i wykonać
tylko jeden raz na koniec.
Ad 3.
Funkcja fft() oblicza dyskretną transformatę Fouriera algorytmem FFT. Należy uwzględnić, że algorytm FFT
zwraca współczynniki Fouriera:
• w nadmiarowej liczbie – dla ujemnych częstotliwości jest to lustrzane odbicie (można je więc odrzucić)
widma dla częstotliwości dodatnich (wykreślenie widma da odpowiedź na pytanie, w którym miejscu
znajduje się częstotliwość zerowa – na początku czy w środku wyniku);
• przeskalowane o czynnik zależny od liczby próbek oraz odmienny dla składowej stałej;
• dla częstotliwości zwiększającej się ze stałym krokiem ∆f, który pozostaje w pewnym związku z liczbą
próbek i okresem próbkowania (krokiem czasu ∆t).
Aby widmo nie wykazywało tzw. rozmycia, tj. fałszywych prążków bocznych (które doprowadzą do błędów
obliczeń), należy je obliczyć z całkowitej liczby okresów przebiegu – patrz pkt 2.
Dzięki wewnętrznym algorytmom obliczeniowym, działania arytmetyczne zostaną szybciej wykonane na
macierzach/wektorach niż w pętli na pojedynczych elementach. Działania „element po elemencie” oznaczane są
kropką, np. „.*” oznacza mnożenie poszczególnych elementów jednej macierzy przez te same elementy drugiej
macierzy, a nie mnożenie w sensie macierzowym (analogicznie ./, .^).
Ad 6.
W Scilabie do pomiaru czasów wykonania należy użyć funkcji timer().
Ponieważ czasy są bardzo krótkie, dla wyeliminowania wpływu czasu dostępu do pamięci itp. należy powtórzyć
wykonanie funkcji w pętli, rzędu 1000 razy, tzn.:
timer(); for …, wywołanie_funkcji; end; timer()