Ogólna zasada generowania jest taka:
Masz tablicę spróbkowanego sinusa, np. cały okres to 256 próbek (numerowanych od 0 do 255)
Próbki te odtwarzasz przesyłając je co stały okres czasu
$$Tp=\frac{1}{fp}$$ do przetwornika cyfrowo analogowego.
Częstotliwość sygnału jaką uzyskasz tą metodą to:
$$fwy=\frac{fp}{N}$$
fp - częstotliwść próbkowania
N - ilość próbek na okres.
Czestotliwość możesz zmieniać na kilka sposobów:
1. Zmiana częstotliwości próbkowania (zmieniasz okresy czasu pomiędzy wysłaniem kolejnych próbek).
Rozwiązanie to ma jednak wadę. Sygnał z przetwornika powinien być wygładzany filtrem dolnoprzepustowym o częstotliwości odcięcia niższej niż fp/2 (np. 0.4 fp ) i o sporej stromosci. Zmienianie fp powoduje konieczność strojenia filtru co mocno komplikuje obwód (można co prawda użyć np. filtrów z przełączanymi pojemnościami wyrabianych jako gotowe kostki (np. Maxim takie robi) ale wymaga to generowania jeszcze sygnału taktującego taki filtr. Sygnał ten musi byc np. 100 razy większy niż częstotliwość generowana.)
2. Zmiana długości tablicy czyli liczby N w mianowniku.
Daje skokową zmianę częstotliwości, wymaga zapamiętania (lub programowego generowania sinusoidy do pamięci RAM o długości N.
N nie może być zbyt małe, bo rosną zniekształcenia przebiegu.
3. Zmiana kroku odtwarzania pamięci z przebiegiem.
Otrzymujesz możliwość generowania następujących częstotliwości:
$$fwy=k*\frac{fp}{N}$$
gdzie
k może się zmieniać od 1 do
$$\frac{N}{2}-1$$
Czyli jeżeli np. odtwarzasz co drugą próbkę z pamięci to uzyskujesz 2 razy większą częstotliwość.
Metoda ta jest przydatna do uzyskiwania czystych przebiegów sinusoidalnych ale wymaga użycia długiej pamięci okresu. Np. dla pamięci 8kB i typowej dla akustyki częstotliwości próbkowania 48000 Hz
wygenerować sygnały o czestotliwościach:
fmin=5,859375 Hz dla k=1 do
fmax=20003,90625 dla k=3414
Oczywiście generowanie przebiegu wymaga dodawania przyrostu k do adresu pamięci oraz uwzględnienia zapętlenia wskaźnika pamięci gdy wynik sumowania jest większy niż długość tablicy N (odejmujesz wtedy N, by indeks był z zakresu 0 do N-1)
4. Indeks (równoważny fazie przebiegu) może być także zwiększany o liczbę ułamkową co pozwala uzyskać wartości będące niecałkowitym przyrostem częstotliwości.
W tym przypadku indeks jest liczbą z ułamkiem, którą przed użyciem do adresowania tablicy zamienia się na liczbę całkowita z zakresu 0 do N-1.
Zależnie od metody zamiany (obcięcie części ułamkowej lub zaokrąglenie) uzyskuje się różny poziom zniekształceń sinusoidy.
Przy przyroście 1.5 dla metody obcinania ułamka, kolejno odtwarzane są komórki pamięci
Faza -> adres
0.0 -> 0
1.5 -> 1
3.0 -> 3
4.5 -> 4
6.0 -> 6
7.5 -> 7
Dla metody zaokraglania (tu są trochę mniejsze błędy sinusoidy)
Faza -> adres
0.0 -> 0
1.5 -> 2
3.0 -> 3
4.5 -> 5
6.0 -> 6
7.5 -> 8
oczywiście dokładność przestrajania zależy od ilości bitów części ułamkowej przyrostu fazy.
Powyższej metody używa się np. w elektronicznych instrumentach muzycznych do uzyskania odpowiedniej dokładności przestrajania częstotliwości (np. używa się wtedy 13 i więcej bitów ułamka)
Najdokładnieszą metodą, będącą rozwinięciem powyższych jest metoda generowanis sygnału z interpolacją. Wymaga ona jednak szybkich obliczeń wartości pośrednich (interpolacja liniowa) pomiędzy wartościami próbek zapisanymi w pamięci:
WY=T[index]+Ułamek*(T[index+1]-T[index])
WY - wartość wysyłana do DAC (zaokrąglona do całkowitej)
T[index] - wartość tablicy przebiegu dla danej chwili czasowej
T[index+1] - wartość w następnej komórce tablicy przebiegu.
UŁAMEK - część ułamkowa fazy z zakresu <0;1)
Metoda ta wymaga szybkiego mnożenia (operacja dostępna w procesorach sygnałowych) i operacji zamiany na liczby całkowite.
Powyższe rozważania dotyczą generowania przebiegu sinusoidalnego. W przypadku gdy zawartość tablicy nie jest przebiegiem sinusoidalnym powyższe metody przy stosowaniu wprost powodują generowanie przebiegów zniekształconych w stosunku do tego co jest zapisane w tablicy kształtu. Wynika to z teorii próbkowania przebiegów, która mówi, że przebiegi są odtwarzane poprawnie o ile wszystkie składowe przebiegów mają częstotliwości poniżej połowy częstotliwości próbkowania. Jeżeli nie, to przebiegi te pojawiają się w paśmie częstotliwości ale ich częstotliwość wynika z różnicy częstotliwości składowej przebiegu i częstotliwości próbkowania. Daje to np. przy zwiększaniu częstotliwości efekt taki, że składowe poniżej fp/2 zwiększają częstotliwość a za to te "wystające" ponad fp/2 jadą z czstotliwością w dół i do tego w sposób nie związany harmonicznie z sygnałem pierwotnym.
Oczywiście na wyjściu dostajemy nierozdzielną sumę tych dwóch przebiegów co powoduje, że mamy przebieg zniekształcony.
Ponieważ większość przebiegów "naturalnych" (prostokąt, piła) daje się przedstawić jako nieskończona suma przebiegów sinusoidalnych to widać, że problem wystapi praktycznie zawsze, bo zawsze znajdą się składowe, które wyjdą za te fp/2.
Rozwiązaniem jest tu zapisywanie w tablicach sygnałów o skończonym widmie częstotliwości, tj. syntezujemy przebiegi złożone przez sumowanie sinusoid ale tylko do momentu, do którego mają one częstotliwości poniżej fp/2.
Oczywiście jeżeli zakładamy możliwość przestrajania częstotliwości takiego generatora, to trzeba mieć ileś tablic z przebiegami wcześniej zsyntetyzowanymi (trudno by było te sumy liczyć "w locie") i odpowiednio przełączać tablice zależnie od zakresu częstotliwości. Tu oczywiście im wyższa częstotliwość tym mniej składowych i przebieg co raz bardziej odbiega od kształtu idealnego prostokąta czy piły.
Przebieg prostokątny można też generować wpuszczając filtrowany przebieg z naszego generatora na wejście komparatora, który wygeneruje nam przebieg prostokątny.
Niestety przebiegu piłokształtnego czy trójkątnego nie da się tak prosto wygenerować. Wymagało by to zastosowania integratora z współbieżną ze zmianą częstotliwości, zmianą prędkości narastania przebiegu liniowego, dla utrzymania stałości amplitudy.
Pozostaje jeszcze problem rozdzielczości przebiegu wyjściowego. Osiem bitów nadaje się do prostych rozwiązań. Szesnaście bitów wymaga 2 razy większej pamięci i większej ilości operacji przy użyciu procesora 8 bitowego.
Jak więc widać jest z czego wybierać
