3.2.1 Phương pháp khôi phục dạng tín hiệu
3.2.1.1 Cơ sở
Luận văn không xem xét những tín hiệu có tính ngẫu nhiên mà chỉ quan tâm việc đo và hiển thị các tín hiệu tuần hoàn, với những tín hiệu ngẫu nhiên không thể có phương pháp nào khác để hiển thị một cách chính xác ngoài việc tăng tần số lấy mẫu và đảm bảo tiêu chuẩn Nyquist.
Xét một tín hiệu là một hàm tuần hoàn theo thời gian với chu kỳ là T, có dạng biểu diễn toán học như sau: y=f(t)=f(t+nT)
Giả sử thời điểm lấy mẫu ban đầu là và chu kỳ lấy mẫu là khi đó các mẫu lấy được có biên độ là:
= f ( +i x ) với i= 0,1,…, N-1(N là độ dài bộ đệm dùng để lưu giữ mẫu)
Khi đó gọi = +i x ) mod T là pha của mẫu thứ i trong chu kỳ tín hiệu. Do tín hiệu là tuần hoàn với chu kỳ T nên:
f( )= f( i x )
f( )= f( i x )với 0
Khi đó gọi cặp (xi, yi) (với i=1 N) đại diện cho mẫu thứ i trong bộ đệm, tham số xi đại diện cho pha của mẫu và tham số yi đại diện cho biên độ của mẫu
Như vậy các mẫu lấy được tương đương với các mẫu trong một chu kỳ tín hiệu. Đây chính là cơ sở toán học cho thuật toán dồn pha.Thuật toán này thông qua ba bước được mô tả ở phần sau.Mục đích của thuật toán là lấy thêm thông tin của tín hiệu, đặc biệt là trong vùng biến thiên nhanh. Hình dưới đây mô tả dạng sóng hiển thị trong hai trường hợp không sử dụng thuật toán dồn pha và sử dụng thuật toán dồn pha
Hình 3.3 phương pháp dồn pha tín hiệu
Hình 3.2 cho thấy, ngay cả trong trường hợp tần số tín hiệu lấy mẫu lớn hơn khoảng 10 lần thì dạng tín hiệu được hiển thị trong trường hợp không có dồn cũng rất thiếu chính xác so với dạng thực tế, mặc dù nó đã mô tả được chu kỳ của tín hiệu.
Trường hợp có sử dụng phương pháp dồn cho thấy rằng ngoài việc mô tả được chu kỳ của tín hiệu, nó còn mô tả khá chính xác được dạng của tín hiệu, khi số mẫu trong bộ đệm là đủ lớn (trong trường hợp này là N = 100).
Phương pháp dồn không những khôi phục được tương đối chính xác dạng tín hiệu trong trường hợp tần số lấy mẫu và tần số tín hiệu thỏa mãn điều kiện của định lý Nyquist.Trong trường hợp tần số tín hiệu xấp xỉ bằng, thậm chí lớn hơn tần số lấy mẫu, nó cũng khôi phục được khá chính xác. Để thấy rõ hơn được điều này, xem xét trong hai trường hợp dưới đây:
Hình 3.4 Tần số tín hiệu xấp xỉ tần số lấy mẫu
Trường hợp 2: tần số tín hiệu lớn hơn tần số lấy mẫu
Hình 3.5 : Tần số tín hiệu lớn hơn tần số lấy mẫu
Hình 3.4 và 3.5 cho thấy trong cả hai trường hợp không thỏa mãn định lý Nyquist về mối liên hệ giữa tần số tín hiệu và tần số lấy mẫu. Nếu sử dụng phương pháp dồn pha khôi phục được dạng tín hiệu và chu kỳ tương đối chính xác
3.2.1.2 Thuật toán và ứng dụng
Để khôi phục dạng tín hiệu, sử dụng 3 thuật toán chính đó là: thuật toán dồn pha, thuật toán smooth[ ] và thuật toán smooth_add[ ]
Hình 3.6 Lưu đồ thời gian và chức năng của các thuật toán
Chức năng của các khối:
1. Dồn các mẫu trong bộ đệm về một chu kỳ sau đó sắp sếp và loại trừ mẫu thừa
2. Khôi phục dạng tín hiệu (trong một chu kỳ)
3. Nhân nhiều lần chu kỳ của tín hiệu từ bước 2 sau đó ghép lại và hiển thị 4. Ghép tín hiệu giữa hai lần hiển thị thị liên tiếp
a, Thuật toán dồn pha
a.1, Thuật toán dồn pha trong trường hợp lý tưởng
Thuật toán dồn pha bao gồm ba bước.Bước thứ nhất, tính toán số mẫu dồn, bước này nhằm tránh tình trạng dồn thừa mẫu không cần thiết. Bước thứ hai, xác định pha của mẫu, mục đích là xác định vị trí của mẫu trong 1 chu kỳ tín hiệu. Và bước thứ ba, sắp sếp các pha của mẫu, mục đích là đưa các mẫu trở về đúng vị trí của nó trong một chu kỳ.
a.1.1, Tính toán số mẫu dồn.
Với tín hiệu dạng sin thì chỉ cần 4 mẫu trong một chu kỳ, tín hiệu xung vuông thì số lượng mẫu lớn hơn, như khoảng 20 mẫu trong một chu kỳ.Do đó khi số mẫu trong một chu kỳ lớn hơn 20 thì không cần thiết phải dùng phương pháp dồn mẫu nữa, trong trường hợp này sẽ dùng cách nội suy đường cong trực tiếp để khôi phục lại dụng tín hiệu.
Để tính toán số mẫu dồn, gọi: mod T (tần số dư)
Khi đó =( x ) mod T=( x ) mod T
Xét hai trường hợp :
+ Trường hợp thứ nhất : T mod = 0 T= x với k là một số nguyên dương.
=( x ) mod T=( x ) mod T=
Như vậy { xi }là dãy tuần hoàn với chu kỳ là k. Do đó nếu k lớn hơn N (độ dài bộ đệm) thì tiến hành dồn tất cả N mẫu. Còn trong trường hợp k nhỏ hơn N thì chỉ cần dồn với k mẫu đầu tiên
Khi đó không tồn tại số nguyên k sao cho: x hay = dãy{ xi } gồm các phần tử khác nhau từng đôi một, do đó tiến hành dồn với tất cả N mẫu
a.1.2, Xác định pha của mẫu.
Xác định pha của mẫu là tìm vị trí của mẫu đó trong một chu kỳ của tín hiệu, dựa vào thông tin này mới có thể sắp xếp lại thứ tự của mẫu trong môt chu kỳ. Pha của các mẫu trong trường hợp này chính là {xi}
a.1.3, Sắp xếp các pha của mẫu.
Sau khi đã xác định được pha của các mẫu trong một chu kỳ, tiến hành sắp xếp theo chiều tăng dần của pha, thực chất đây chỉ là một bài toán sắp xếp thuần túy. Trong trường hợp này chính là xắp xếp các mẫu (xi, yi) (với i=1 N) theo chiều tăng dần của pha hay cụ thể hơn là chiều tăng dần của xi
a.2, Thuật toán dồn pha trong trường hợp thực tế
Trong thực tế, phương pháp dồn pha gặp một vấn đề khi tần số của tín hiệu không ổn định cũng như tần số lấy mẫu gặp phải sai số, khi đó phép dồn sẽ không còn được chính xác nữa.Dẫn đến việc khôi phục lại dạng tín hiệu sẽ không chính xác, thậm trí sai một cách nghiêm trọng. Do đó khi thực hiện dồn pha sẽ chỉ dồn những mẫu trong khoảng một số khung nhất định. Mỗi khung
tương ứng với một chu kỳ thời gian của tín hiệu. Để xác định số khung và số mẫu dồn, ta gọi sai số của tần số tín hiệu là a% khi đó:
= (1 )
= = = = T
Sai số lớn nhất giữa hai chu kỳ cạnh nhau là:
S= max(T , T ) – min(T , T )
S= T( - )=T = T
Do a<< 100 nên S T= T
Số chu kỳ chứa mẫu là: =
Để khôi phục chính xác thì S T/
T T/
(3.39)
Từ biểu thức (3.39) ta nhận thấy rằng số mẫu dùng để dồn sẽ tỷ lệ nghịch
với sai số và tỷ lệ thuận với tỷ số . Điều đó có nghĩa là, khi sai số của tần số tín hiệu càng lớn thì số mẫu dùng để dồn càng nhỏ và số mẫu dùng để dồn sẽ càng lớn khi tần số lấy mẫu càng lớn hơn so với tần số tín hiệu. Hình 3.7 dưới đây thể hiện sự phụ thuộc của số mẫu dùng để dồn vào tỷ số giữa tần số lấy mẫu và tần số tín hiệu trong trường hợp sai số tần số a=1%
Hình 3.7 Đồ thị mối tương quan giữa và tỷ số (a=1%)
Như vậy trong trường hợp thực tế này thuật toán dồn pha sẽ khác so với ở trường hợp lý tưởng. Thuật toán bao gồm 4 bước
- Bước 1: Tính toán số mẫu dùng để dồn pha sử dụng công thức (3.39) - Bước 2: Xác định pha của mẫu, cũng giống như trường hợp lý tưởng
- Bước 4: Tính toán và đưa ra một tập lớn nhất các mẫu có pha đôi một khác nhau. Thực chất là thay thế nhóm mẫu có pha bằng nhau bằng một mẫu mới có pha bằng các pha của các mẫu trong nhóm đó nhưng có biên độ bằng trung bình bình phương biên độ của các mẫu trong nhóm
b, Thuật toán Smooth
b.1, Phân chia nhóm
Chia các mẫu ( , ) (i= 1 N) thành nhóm loại I và nhóm loại II thỏa mãn tính chất sau:
Nhóm loại I:
- Các mẫu trong 1 nhóm là liên tiếp nhau.
- Hai mẫu liên tiếp tạo một đường thẳng có hệ số góc (đối với trục x) lớn hơn
- Tổng số mẫu của nhóm là lớn tùy ý Nhóm loại II:
- Các mẫu là liên tiếp nhau.
- Hai mẫu liên tiếptạo thành đường thẳng có hệ số góc( so với trục x) nhỏ hơn
- Tổng số mẫu trong nhóm nhỏ hơn N (đảm bảo tốc độ của thuật toán). Sau khi tiến hành chia các mẫu thành các nhóm loại I và II, tiến hành khôi phục tín hiệu với từng nhóm như sau:
b.2, Hiển thị
Đối với nhóm II:
Khôi phục các điểm nằm giữa ( , ) theo trục thời gian bằng cách nội suy từ:
+, ( ), ( ) và ( ). với i = 1
+, ( ), ( ) và ( ) với 1 < i N – 2
- Số mẫu trong nhóm lớn hơn 2: ( ),.., ( )
Khôi phục các điểm nằm giữa xi và theo trục thời gian bằng cách nội suy
các điểm ( ),.. , ( ). Đối với nhóm I:
- Nếu số mẫu của nhóm bằng 2: ( ), ( )
Khôi phục các điểm nằm giữa (xI, xI+1) theo trục thời gian bằng cách nội suy từ các điểm:
Nếu số mẫu của nhóm lớn hơn 2: ( ), ( ),.., ( ):
Khôi phục các điểm nằm giữa ( ) theo trục thời gian bằng cách nối các
đường thẳng từ điểm ( ) ( ) …….. ( )
Phương pháp nội suy ở đây có thể sử dụng một trong các phương pháp sau: phương pháp nội suy Newton, nội suy Lagrange, phương pháp bình phương tối thiểu như đã nói ở trên
Hình 3.7 Lưu đồ thuật toán Smooth
CalType(i,j) = 1 :delta(i,j) < A = 2 :delta(i,j) >=A
Delta(I,j) : Hệ số góc giữa điểm i và j
Delta(i,j) =
Draw(i,j,type): vẽ nội suy các điểm từ theo : - Nếu Type=1 thì nội suy theo lagrange
- Nếu Type=2 nối các điểm từ ij
c, Thuật toán Smooth_add
Hình 3.9 Lưu đồ thời gian xử lý
như hình trên. Mặt khác sau khi dồn pha và hiển thị một chu kỳ, phải tiến hành nhân và dán chu kỳ đó để hiển thị đầy đủ trên màn hình. Để giải quyết vấn đề này có 3 cách thức:
Cách thức 1: cắt bỏ một phần tín hiệu của lần kế tiếp như hình sau:
Hình 3.10 Cắt bỏ một phần tín hiệu
Điểm cắt và điểm cuối có cùng biên độ và có đạo hàm cùng dấu với nhau, có nghĩa là cùng tăng hay cùng giảm.
Cách thức 2: Thêm một phần tín hiệu vào đầu của tín hiệu kế tiếp (n + 1)
Hình 3.11 Thêm một phần tín hiệu
Cách thức 3: Nhân tín hiệu được khôi phục của mỗi lần lấy mẫu để hiển thị
Hình 3.12 Nhân tín hiệu
Nhìn trên hình vẽ cho thấy T là phần tín hiệu nội suy được trong một lần lấy mẫu. là một phần con của T, nó được cắt theo nguyên tắc sau:
Xác định điểm đầu tiên, tính từ bên trái của T, đồng pha với điểm cuối cùng của T.
Sau khi đã xác định được điểm đầu tiên đó, chính là phần còn lại của tín hiệu T tính từ điểm đã tìm được.
Sau khi đã tính được phần con tiến hành nhân phần con này cho đến khi tín hiệu được điền đầy cửa sổ hiển thị.
Trong luận văn này tôi đã sử dụng cách thức hai và ba cho việc hiển thị dạng tín hiệu. Vì cách thức này rất phù hợp khi mà ta sử dụng phương pháp dồn pha , khi mà các mẫu đã đưa về vị trí của một chu kỳ tín hiệu.
lần chu kỳ mẫu và ghép chúng lại thành dạng tín hiệu hoàn chỉnh.
Hình 3.13 Nhân và ghép một chu kỳ tín hiệu
Hình vẽ cho thấy, để thực hiện ghép chính xác thuật toán phải xác định được = sao cho hai điểm và trùng nhau. Khi đó kết quả thu được như dưới hình sau:
= + - ) i=0÷2
Trong thực tế việc xác định để hai đường cong cắt nhau tại một điểm
trên trục thời gian là phức tạp hơn nhiều so với việc xác định = để đường
cong (ε) tạo bởi các điểm {( , ), ( , ), ( , )} đi qua điểm
K( , ).Thực chất thì hai cách này cho ta một kết quả hoàn toàn giống nhau .
Do đó, để đơn giản ta chỉ đi xác định .
Đường cong (ε) ở đây chính là hàm lagrange tạo bới 3 điểm
Y = (3.38)
=
Để đơn giản ta tịnh tiến tâm của trục tọa độ về điểm ( , ). Khi đó
dặt: =1/ =1/ =1/ Khi đó biểu thức (3.38) trở thành: (ε): Y=A + Bx + Trong đó: A= [ ( - )+ ( - )] B= ( - ) - ( + ) +
Tọa độ của điểm K theo trục tọa độ mới là K( +1/ , ) Đường cong (ε) đi qua K khi:
=A + B( +1/ )+
A + B( +1/ ) + C =0
Với C=
= -
Ta sẽ chọn nghiệm dương (trong trường hợp có hai nghiệm dương sẽ chọn nghiệm nhỏ nhất
c.2, Lưu đồ thuật toán
Trong đó hàm GetOffset() trả về giá trị
Hàm AddtoArrPoint() có nhiệm vụ chèn chuỗi điểm con trỏ {(X(i),Y(i))} vào chuỗi con trỏ ArrPoint
Hàm Draw(ArrPoint) có nhiệm vụ vẽ đường cong tạo bởi các phần tử của chuỗi ArrPoint
3.2.2 Thuật toán phân tích phổ ( FFT cơ số 2)
Giải thuật lập trình thông qua 2 bước:
- Bước thứ nhất: sắp xếp lại vị trí của các mẫu, mục đích là phân chia các mẫu ban đầu thành các chuỗi có độ dài là hai liên tiếp nhau. Thuật toán phân chia ở đây rất đơn giản có thể biểu diễn bằng chu trình như sau: ShiffRigh(0) ShiffRigh(1)….. ShiffRigh(m-1).
Hình vẽ dưới đây mô tả chu trình khi N=8
ShiffRigh(0) ShiffRigh(1)
-ShiffRigh(1) (bắt đầu từ bít 1): b’(1) =b(2), b’(2)=b(1), bít 0 không thay đổi
Tổng Quát :
- ShiffRigh(i) sẽ bắt đầu từ bít thứ i: b’(m)=b(i) , b’(m-1)=b(m) ,…. b’ (i+1) =b(i). Các bít j (j<i) giữ nguyên vị trí
- - Bước thứ hai: tiến hành tính toán tại m bước (N= là độ dài dãy x(n)).
Thuật toán với phương thức ghi đè nên chỉ cần N ô nhớ và tính toán tại chỗ có nghĩa là quả tính toán sẽ được lưu ngay tại mỗi ô nhớ đó.
Dim c1, c2, ty, t1, t2, u1, u2, z As Double '/* Calculate the number of points */ n = 1
For i = 0 To m - 1 n *= 2
Next
'/* Do the bit reversal */ i2 = n / 2 j = 0 For i = 0 To n - 2 If (i < j) Then ty = y(i) y(i) = y(j) y(j) = ty End If k = i2 Do While (k <= j) j -= k k = k / 2 Loop j += k Next ' /* Compute the FFT */ c1 = -1.0 c2 = 0.0 l2 = 1 For l = 0 To m - 1 l1 = l2 l2 = l2 * 2 u1 = 1.0 u2 = 0.0 For j = 0 To l1 - 1 For i = j To n - 1 Step l2 i1 = i + l1 t1 = -u2 * y(i1) t2 = u1 * y(i1) y(i1) = y(i) - t2
y(i) += t2 Next z = u1 * c1 - u2 * c2 u2 = u1 * c2 + u2 * c1 u1 = z Next c2 = Math.Sqrt((1.0 - c1) / 2.0) If (dir = 1) Then c2 = -c2 End If c1 = Math.Sqrt((1.0 + c1) / 2.0) Next
'/* Scaling for forward transform */ For i = 0 To n - 1 y(i) /= n Next End If Return (True) End Function
CHƯƠNG 4: KẾT LUẬN 4.1 Độ chính xác
Xét về sai số của thông số biên độ, thông số này phụ thuộc vào loại ADC sử dụng mà cụ thể hơn là số bít / sample của ADC đó. Ngoài ra thông số này còn phụ thuộc vào mạch vào của bộ ADC trong mối tương quan giữa tần số tín hiệu đo.
Xét về sai số của thông số tần số, thông số này không những phụ thuộc vào mạch đo tần số (với một sai số nhất định) mà còn phụ thuộc vào mối tương quan giữa tần số tín hiệu và tần số lấy mẫu. Trong trường hợp tần số tín hiệu là đặc biệt với tần số lấy mẫu, có nghĩa là tần số dư là (với i=1→6), thì khả năng hiển thị tần số là tương đối không chính xác. Đặc biệt trong trường hợp tần số lấy mẫu bằng số nguyên lần tần số tín hiệu, không thể hiển thị được chu kỳ tín