You are on page 1of 4

P Oscyloskop

R O  J E cyfrowy
K T Y

Oscyloskop cyfrowy,
część 3
kit AVT−891

KoÒczymy opis cyfrowego


oscyloskopu prezentacj¹
programu na PC, ktÛry
odpowiada za obrÛbkÍ tania elementÛw zwanych kompo-
i†wyúwietlenie wynikÛw nentami. Komponenty te w†spo-
zebranych przez modu³ sÛb zasadniczy przyúpieszaj¹ pra-
sprzÍtowy. cÍ nad programem, poniewaø
Program steruj¹cy oscylosko- przypomina ona bardziej sk³ada-
pem cyfrowym AVT-891 napisano nie programu z†gotowych klockÛw
w†Delphi. NarzÍdzie to charakte- niø typow¹ pracÍ programisty.
ryzuje siÍ wyj¹tkowo ³atwym W†tym projekcie zosta³y wyko-
w†obs³udze interfejsem i†bogat¹ rzystane cztery znalezione w†In-
bibliotek¹ gotowych do wykorzys- ternecie elementy:

Rys. 8. Widok ekranu podczas pracy programu.

Elektronika Praktyczna 11/2000 43


Oscyloskop cyfrowy

- komponent spsgraph (ekran os- specyfikÍ urz¹dzenia, wystarcza-


cyloskopu), j¹ce jest pobieranie danych co
- komponent TComPort (komuni- 10ms. Obs³uga tej czynnoúci jest
kacja z†portem szeregowym), wykonywana w†zdarzeniu OnTi-
- biblioteka fourier (procedury mer zwyk³ego komponentu TTi-
FFT). mer, stanowi¹cego element pa-
Program ten przeznaczony kietu Delphi. Zmiana dowolnego
jest do pracy w†úrodowisku Win- ustawienia za pomoc¹ widocz-
dows 95 lub nowszym. Co is- nych na ekranie elementÛw (rys.
totne, nie ma przy tym wygÛ- 8), powoduje wys³anie do mo-
rowanych wymagaÒ sprzÍto- du³u kodÛw steruj¹cych opisa-
wych, powinien uruchomiÊ siÍ nych w†poprzednich czÍúciach
na kaødym komputerze ze tego artyku³u. Sterowanie do pro-
sprawnie dzia³aj¹cym systemem gramu jest zwrÛcone po otrzyma-
operacyjnym. Jedyny problem niu przez program kodÛw po-
moøe stworzyÊ znalezienie wol- twierdzaj¹cych odebranie polece-
Rys. 9. Okno konfiguracji portu nego i†prawid³owo pod³¹czone- nia.
szeregowego. go portu szeregowego. W†trakcie uruchamiania pro-
Wszystkie czynnoúci jakie wy- gramu urz¹dzenie z†w³¹czonym
- komponent circlehandle (pokrÍt- konuje program obs³uøone s¹ zasilaczem powinno byÊ pod³¹-
³a oscyloskopu), w†jednym w¹tku. Ze wzglÍdu na czone do komputera. Program

List. 1.
(*====================================================================== NumSamples: word; { can be any positive integer }
fourier.pas - Don Cross <dcross@intersrv.com> FrequencyIndex: word; { must be in the range 0 .. NumSamples-1 }
This is a Turbo Pascal Unit for calculating the Fast Fourier Transform var RealIn: array of double;
(FFT) and the Inverse Fast Fourier Transform (IFFT). var ImagIn: array of double;
Visit the following URL for the latest version of this code. var RealOut: double;
This page also has a C/C++ version, and a brief discussion of the theory var ImagOut: double );
behind the FFT algorithm.
http://www.intersrv.com/~dcross/fft.html#pascal implementation
======================================================================*)
function IsPowerOfTwo ( x: word ): boolean;
{$N+,E+} (* Allows code to use type ‘double’ and run on any iX86 machine *) var i, y: word;
{$R-} (* Turn off range checking...we violate array bounds rules *) begin
y := 2;
unit Fourier; for i := 1 to 15 do begin
if x = y then begin
interface IsPowerOfTwo := TRUE;
exit;
(*————————————————————————————————————— end;
procedure fft y := y SHL 1;
Calculates the Fast Fourier Transform of the array of complex numbers end;
represented by ‘RealIn’ and ‘ImagIn’ to produce the output complex
numbers in ‘RealOut’ and ‘ImagOut’. IsPowerOfTwo := FALSE;
—————————————————————————————————————*) end;
procedure fft (
NumSamples: word; { must be a positive integer power of 2 } function NumberOfBitsNeeded ( PowerOfTwo:
var RealIn: array of double; word ): word;
var ImagIn: array of double; var i: word;
var RealOut: array of double; begin
var ImagOut: array of double ); for i := 0 to 16 do begin
if (PowerOfTwo AND (1 SHL i)) <> 0 then
(*————————————————————————————————————— begin
procedure ifft NumberOfBitsNeeded := i;
Calculates the Inverse Fast Fourier Transform of the array of complex exit;
numbers represented by ‘RealIn’ and ‘ImagIn’ to produce the output end;
complex numbers in ‘RealOut’ and ‘ImagOut’. end;
—————————————————————————————————————*) end;
procedure ifft (
NumSamples: word; { must be a positive integer power of 2 } function ReverseBits ( index, NumBits: word ): word;
var RealIn: array of double; var i, rev: word;
var ImagIn: array of double; begin
var RealOut: array of double; rev := 0;
var ImagOut: array of double ); for i := 0 to NumBits-1 do begin
rev := (rev SHL 1) OR (index AND 1);
(*————————————————————————————————————— index := index SHR 1;
procedure fft_integer end;
Same as procedure fft, but uses integer input arrays instead of double. ReverseBits := rev;
Make sure you call fft_integer_cleanup after the last time you call end;
fft_integer to free up memory it allocates.
—————————————————————————————————————*) procedure FourierTransform (
procedure fft_integer ( AngleNumerator: double;
NumSamples: word; NumSamples: word;
var RealIn: array of integer; var RealIn: array of double;
var ImagIn: array of integer; var ImagIn: array of double;
var RealOut: array of double; var RealOut: array of double;
var ImagOut: array of double ); var ImagOut: array of double );
var
(*————————————————————————————————————— NumBits, i, j, k, n, BlockSize, BlockEnd: word;
procedure fft_integer_cleanup delta_angle, delta_ar: double;
If you call the procedure ‘fft_integer’, you must call alpha, beta: double;
‘fft_integer_cleanup’ after the last time you call ‘fft_integer’ in tr, ti, ar, ai: double;
order to free up dynamic memory. begin
—————————————————————————————————————*) if not IsPowerOfTwo(NumSamples) or
procedure fft_integer_cleanup; (NumSamples<2) then begin
write (‘Error in procedure Fourier: NumSamples=’, NumSamples);
(*————————————————————————————————————— writeln ( ‘ is not a positive integer power of 2.’ );
procedure CalcFrequency halt;
This procedure calculates the complex frequency sample at a given index end;
directly. Use this instead of ‘fft’ when you only need one or two
frequency samples, not the whole spectrum. NumBits := NumberOfBitsNeeded (NumSamples);
It is also useful for calculating the Discrete Fourier Transform (DFT) for i := 0 to NumSamples-1 do begin
of a number of data which is not an integer power of 2. For example, j := ReverseBits ( i, NumBits );
you could calculate the DFT of 100 points instead of rounding up to 128 RealOut[j] := RealIn[i];
and padding the extra 28 array slots with zeroes. ImagOut[j] := ImagIn[i];
—————————————————————————————————————*) end;
procedure CalcFrequency (

44 Elektronika Praktyczna 11/2000


Oscyloskop cyfrowy

w†trakcie uruchamiania zapyta


o†numer portu do ktÛrego jest
pod³¹czony modu³ (rys. 9). Jest to
w†zasadzie jedyne ustawienie ja-
kiego naleøy dokonaÊ aby skon-
figurowaÊ program do pracy z†os-
cyloskopem. W†przypadku wyst¹-
pienia przerw w†transmisji (np.
w†wyniku zaniku zasilania modu-
³u) wyst¹pi koniecznoúÊ zrestarto-
wania programu.
Aplikacja umoøliwia pomiar
charakterystycznych parametrÛw
sygna³u poprzez ustawienie za
pomoc¹ myszy linii odniesienia.
Moøna w†ten sposÛb zmierzyÊ np.
okres lub amplitudÍ sygna³u. Dru-
g¹ uøyteczn¹ w†codziennej pracy
opcj¹ moøe byÊ kopiowanie aktu-
alnego obrazu sygna³u do schow-
ka systemowego. DziÍki temu mo-
Rys. 10. Wyświetlenie wyniku FFT.

List. 1 (cd).
BlockEnd := 1; if NumSamples > TempArraySize then begin
BlockSize := 2; fft_integer_cleanup; {free up memory in case we already have some}
while BlockSize <= NumSamples do begin GetMem ( RealTemp, NumSamples * sizeof(double) );
delta_angle := AngleNumerator/BlockSize; GetMem ( ImagTemp, NumSamples * sizeof(double) );
alpha := sin ( 0.5 * delta_angle ); TempArraySize := NumSamples;
alpha := 2.0 * alpha * alpha; end;
beta := sin ( delta_angle ); for i := 0 to NumSamples-1 do begin
i := 0; RealTemp^[i] := RealIn[i];
while i < NumSamples do begin ImagTemp^[i] := ImagIn[i];
ar := 1.0; (* cos(0) *) end;
ai := 0.0; (* sin(0) *)
j := i; FourierTransform (2*PI,NumSamples,RealTemp^,ImagTemp^,RealOut,ImagOut);
for n := 0 to BlockEnd-1 do begin end;
k := j + BlockEnd;
tr := ar*RealOut[k]-ai*ImagOut[k]; procedure fft_integer_cleanup;
ti := ar*ImagOut[k] + ai*RealOut[k]; begin
RealOut[k] := RealOut[j] - tr; if TempArraySize > 0 then begin
ImagOut[k] := ImagOut[j] - ti; if RealTemp <> NIL then begin
RealOut[j] := RealOut[j] + tr; FreeMem ( RealTemp, TempArraySize * sizeof(double) );
ImagOut[j] := ImagOut[j] + ti; RealTemp := NIL;
delta_ar := alpha*ar + beta*ai; end;
ai := ai - (alpha*ai - beta*ar);
ar := ar - delta_ar; if ImagTemp <> NIL then begin
INC(j); FreeMem ( ImagTemp, TempArraySize * sizeof(double) );
end; ImagTemp := NIL;
i := i + BlockSize; end;
end;
BlockEnd := BlockSize; TempArraySize := 0;
BlockSize := BlockSize SHL 1; end;
end; end;
end;
procedure CalcFrequency (
procedure fft ( NumSamples: word; { must be integer power of 2 }
NumSamples: word; FrequencyIndex: word; { must be in the range 0 .. NumSamples-1 }
var RealIn: array of double; var RealIn: array of double;
var ImagIn: array of double; var ImagIn: array of double;
var RealOut: array of double; var RealOut: double;
var ImagOut: array of double ); var ImagOut: double );
begin var
FourierTransform (2*PI, NumSamples, RealIn, ImagIn, RealOut, ImagOut); k: word;
end; cos1, cos2, cos3, theta, beta: double;
sin1, sin2, sin3: double;
procedure ifft ( begin
NumSamples: word; RealOut := 0.0;
var RealIn: array of double; ImagOut := 0.0;
var ImagIn: array of double; theta := 2*PI * FrequencyIndex / NumSamples;
var RealOut: array of double; sin1 := sin ( -2 * theta );
var ImagOut: array of double ); sin2 := sin ( -theta );
var cos1 := cos ( -2 * theta );
i: word; cos2 := cos ( -theta );
begin beta := 2 * cos2;
FourierTransform (-2*PI, NumSamples, RealIn, ImagIn, RealOut, ImagOut); for k := 0 to NumSamples-1 do begin
{ Update trig values }
(* Normalize the resulting time samples... *) sin3 := beta*sin2 - sin1;
for i := 0 to NumSamples-1 do begin sin1 := sin2;
RealOut[i] := RealOut[i] / NumSamples; sin2 := sin3;
ImagOut[i] := ImagOut[i] / NumSamples;
end; cos3 := beta*cos2 - cos1;
end; cos1 := cos2;
cos2 := cos3;
type
doubleArray = array [0..0] of double; RealOut := RealOut + RealIn[k]*cos3 - ImagIn[k]*sin3;
var ImagOut := ImagOut + ImagIn[k]*cos3 + RealIn[k]*sin3;
RealTemp, ImagTemp: ^doubleArray; end;
TempArraySize: word; end;

procedure fft_integer ( begin { Unit initialization code }


NumSamples: word; TempArraySize := 0; {flag that buffers RealTemp, RealImag not
var RealIn: array of integer; allocated}
var ImagIn: array of integer; RealTemp := NIL;
var RealOut: array of double; ImagTemp := NIL;
var ImagOut: array of double ); end.
var
i: word;
begin (*— end of file fourier.pas —*)

Elektronika Praktyczna 11/2000 45


Oscyloskop cyfrowy

øe on byÊ uøyty w†innych pro- zespolonych oznaczaj¹cych war- t¹ i†urojon¹. Nas bÍdzie intereso-
gramach. toúci w†dziedzinie czÍstotliwoúci. wa³ modu³ wyniku czyli:
Chcielibyúmy zwrÛciÊ wasz¹ Elementy wektora wynikowego
=  Re(c j ) + Im(c j ) 
2 2
uwagÍ na fakt, øe otrzymuj¹c do
rÍki kompletne urz¹dzenie wraz
z†procedury FFT spe³niaj¹ nastÍ-
puj¹ce rÛwnanie:
c j
 
n −1

∑v e
z†opisem protoko³u przesy³ania 2 Πi ( j / n ) k Warto zauwaøyÊ, øe sposÛb
danych, dostajecie teø szansÍ na c j
= 1
n k w†jaki w†naszym przypadku wy-
stworzenie w³asnego, zupe³nie no- k =0 korzystujemy fft naleøy do naj-
wego przyrz¹du, poprzez napisa- W†powyøszym wzorze n†ozna- prostszych. W†przypadku ogÛlnym
nie w³asnego programu steruj¹ce- cza liczbÍ elementÛw v (n=2m), wektor wejúciowy moøe sk³adaÊ
go. MÛg³by to byÊ np. rejestrator zaú i†jest jednostk¹ urojon¹. Ele- siÍ z†szeregu maj¹cego sk³adowe
wolnozmiennych przebiegÛw lub menty wektora obliczonego przez zarÛwno rzeczywiste jak i†urojo-
program steruj¹cy rÛwnoczeúnie FFT odpowiadaj¹ rÛønym czÍstot- ne. W†naszym przypadku na wej-
dwoma modu³ami AVT-891 pod- liwoúciom. W†celu uzyskania fak- úciu podajemy szereg 128 prÛbek
³¹czonymi do dwu portÛw szere- tycznej czÍstotliwoúci konieczna pobranych z†modu³u jako wektor
gowych. jest znajomoúÊ czÍstotliwoúci prÛb- czÍúci rzeczywistych i†wektor zer,
Co fajnego moøna zrobiÊ z†kom- kowania sygna³u wyjúciowego. Je- jako wektor czÍúci urojonych.
pletem 128 prÛbek? Jeúli ktoú lubi øeli v†jest n-elementowym wekto- Na list. 1 przedstawiamy na-
obrÛbkÍ danych ma szansÍ siÍ rem przekazywanym do procedury pisane w†Pascalu procedury: fft,
wyøyÊ. Do wyboru ma rÛøne FFT, a†czÍstotliwoúÊ prÛbkowania niewykorzystywan¹ przez nas
rodzaje regresji, spliny lub coú wynosi fs, faktyczna czÍstotliwoúÊ procedurÍ ifft (inverse fft -†od-
ekstra: szybk¹ transformatÍ Fou- odpowiadaj¹ca elementowi ck wy- wrotna transformata Fouriera)
riera (ang. FFT -†fast Fourier nosi: i†dodatkowe procedury ìnarzÍ-
transformation). k dzioweî. Biblioteka ta zosta³a
f = ⋅ f znaleziona w†przepastnych zaso-
Co to jest FFT?
k n s
bach Internetu, a†zamieszczamy
Szybka transformata Fouriera Warto zwrÛciÊ uwagÍ na fakt, j¹ poniewaø w†odrÛønieniu od
jest, mÛwi¹c w†uproszczeniu, na- øe niemoøliwe jest wykrycie czÍs- innych jakie moøna znaleüÊ
rzÍdziem matematycznym pozwa- totliwoúci wyøszych niø czÍstotli- w†sieci jest napisana przejrzyúcie
laj¹cym przetworzyÊ szereg prÛ- woúÊ prÛbkowania. Nie jest to i†zosta³a starannie sprawdzona.
bek obrazuj¹cych zmianÍ sygna³u ograniczenie moøliwoúci procedur Stanowi klasyczn¹ implementacjÍ
w†dziedzinie czasu na sygna³ numerycznych, ale bazy matema- algorytmu FFT bez zbÍdnych
w†dziedzinie czÍstotliwoúci (rys. tycznej na ktÛrej s¹ one oparte. udziwnieÒ. Jest to niez³y materia³
10). Pozwala wiÍc zanalizowaÊ W†celu poprawnego odczytania wyjúciowy do napisania w³asnego
widmo sygna³u. O†taki analizator sygna³u za pomoc¹ jego prÛbki programu.
widma pokusiliúmy siÍ w†tym poddanej transformacie Fouriera Adam Dêbowski, AVT
programie. Wektor danych wej- naleøy przeprowadziÊ prÛbkowa-
úciowych do algorytmu FFT musi nie z†szerokoúci¹ co najmniej Wzory p³ytek drukowanych w†for-
mieÊ 2m sk³adowych (w naszym dwukrotnie wiÍksz¹ niø szerokoúÊ macie PDF s¹ dostÍpne w†Internecie
przypadku m=7). W†rezultacie pasma. pod adresem: http://www.ep.com.pl/
otrzymamy inny wektor, sk³adaj¹- Elementy wektora wynikowego pcb.html oraz na p³ycie CD-EP11/
cy siÍ ze 1+2(m-1) wspÛ³czynnikÛw c†maja dwie sk³adowe: rzeczywis- 2000 w†katalogu PCB.

46 Elektronika Praktyczna 11/2000

You might also like