Cơ bản về xử lý số tín hiệu
Giới thiệu về xử lý số tín hiệu
Trước khi nói đến việc xử lý số tín hiệu, chúng ta hãy xem xét việc xử lý tín hiệu. Tín
hiệu (ở đây là một dòng thông tin được chuyển tải thông qua một đại lượng vật lý nào đó,
thường là điện áp hay dòng điện) có thể được xử lý theo một trong hai cách: xử lý tương
tự và xử lý số. Lấy ví dụ việc lọc thông thấp một tín hiệu dòng điện, giải pháp tương tự sẽ
dùng một mạch lọc (tích cực hay thụ động) để làm suy giảm các thành phần tần số không
mong muốn và giữ lại các thành phần được quan tâm ở ngõ ra, trong khi giải pháp số sẽ
chuyển tín hiệu dòng điện thành một chuỗi các giá trị tương ứng tại những thời điểm rời
rạc, sử dụng các cơ cấu tính toán số để thực hiện việc lọc tần số, sau đó tái tạo lại tín hiệu
đã được lọc ở ngõ ra. Việc chuyển đổi các giá trị tương tự thành chuỗi giá trị số được
thực hiện bằng các bộ chuyển đổi tương tự-số (ADC-Analog to Digital Converter), và
việc chuyển đổi ngược lại được thực hiện bằng các bộ chuyển đổi số-tương tự (DAC-
Digital to Analog Converter).
Như vậy, các hệ thống xử lý tương tự tín hiệu sử dụng các cơ cấu tính toán tương tự để
thực hiện việc xử lý các tín hiệu tương tự, còn các hệ thống xử lý số tín hiệu lại thực hiện
việc xử lý các tín hiệu số thông qua các cơ cấu tính toán số. Một điều cần nói là các thuật
ngữ 'tương tự' và 'số' không thể hiện bản chất của việc xử lý, thuật ngữ chính xác hơn là
'liên tục' và 'rời rạc' (theo thời gian và phạm vi biến đổi của tín hiệu). Chúng ta có các hệ
thống xử lý liên tục tín hiệu với các cơ cấu tính toán tác động lên các tín hiệu liên tục (có
độ lớn thay đổi một cách liên tục) đối lập với các hệ thống xử lý rời rạc tín hiệu sử dụng
các cơ cấu tính toán tác động lên các tín hiệu rời rạc (có độ lớn thay đổi một cách rời rạc
tại những thời điểm rời rạc). Nhưng kể từ đây trở đi, tôi vẫn dùng các thuật ngữ phổ
thông là 'tương tự' và 'số' để thuận tiện cho người đọc.
Việc xử lý số tín hiệu xem ra có vẻ phức tạp hóa vấn đề, nếu dựa vào ví dụ đơn giản trên
để đánh giá. Tuy nhiên, có một số lý do khiến việc xử lý số tín hiệu vẫn được sử dụng:
• Tính linh hoạt: dữ liệu có thể được lấy mẫu và xử lý sau đó, cũng có thể áp dụng
nhiều thuật toán lên cùng một dữ liệu để tìm ra thuật toán thích hợp nhất. Ngoài
ra, độ phức tạp của thuật toán hầu hết chỉ bị giới hạn bởi bộ nhớ và tốc độ của bộ
xử lý, cũng như các thuật toán có thể được tạo sẵn để tự động thích nghi với môi
trường. Cần nhấn mạnh thêm là một số thuật toán rất hữu ích được đặc biệt tạo ra
đến khi đạt được sự hội tụ. Thời gian chuyển đổi của ADC dùng thuật toán xấp xỉ liên
tiếp chỉ phụ thuộc vào chu kỳ xung clock và số bit (độ phân giải). Các ADC loại này cho
phép thực hiện một sự thỏa hiệp giữa độ phân giải và thời gian chuyển đổi. Loại ADC thứ
ba là các bộ biến đổi Flash, thực hiện trực tiếp việc so sánh điện áp ngõ vào với điện áp
có được từ các bộ phân áp. Mỗi bộ phân áp xác định một mức lượng tử hóa. Vì các bit
ngõ ra có được một cách song song, các bộ biến đổi loại này là cực nhanh. Tất nhiên
chúng cũng rất đắt tiền, đặc biệt với độ phân giải cao.
Lượng tử hóa và các sự phi tuyến khác
Quá trình biến đổi A/D chuyển tín hiệu tương tự thành một giá trị số tỷ lệ với tín hiệu
gốc, biểu diễn bằng một số hữu hạn các bit. Do đó, tín hiệu gốc chỉ có thể được rời rạc
hóa với một độ phân giải hữu hạn, dẫn đến sai số giữa giá trị gốc và giá trị được lượng tử
hóa, và sai số này được gọi là nhiễu lượng tử hóa (quantisation noise). Nếu các giá trị ngõ
vào có xác suất xuất hiện bằng nhau, giá trị trung bình của nhiễu lượng tử hóa sẽ là 0, do
đó người ta thường biểu diễn nhiễu này bằng giá trị trung bình bình phương.
Gọi q là bước lượng tử hóa, nhiễu lượng tử hóa sẽ nằm trong biên ±q/2, hàm mật độ xác
suất của nhiễu lượng tử hóa sẽ là P(e
q
) = 1/q (vì xác suất phân bố đều, và tổng xác suất
phải là 1). Giá trị trung bình bình phương sẽ là:
Giá trị hiệu dụng (rms) của nhiễu lượng tử hóa là:
Xét tín hiệu vào tương tự hình sin có biên độ là A. Nếu sóng sin phủ vừa đủ phạm vi
lượng tử hóa, mỗi bước lượng tử hóa sẽ là:
với n là số bit của bộ ADC. Giá trị công suất trung bình bình phương cho bởi:
Tỷ số (công suất) giữa tín hiệu và nhiễu lượng tử hóa SQNR do đó sẽ là:
Trong thực tế SQNR thường được biểu diễn bằng dB (với công suất thì dB được tính
bằng 10log()), giá trị của SQNR tính bằng dB như vậy sẽ là SQNR
dB
= 1.76 + 6.02n dB.
Điều này có nghĩa là với mỗi bit thêm vào độ phân giải của bộ ADC, chúng ta có thể tăng
6 dB trong SQNR.
s
/2, nghĩa là:
với (F
s
/2)/F
b
được gọi là tỷ số over-sampling (OSR). Chúng ta hãy so sánh giá trị công
suất nhiễu trên với công suất nhiễu của một tín hiệu được lấy mẫu ở tần số Nyquist, nghĩa
là F
s
/2 = /F
b
, bằng một bộ ADC m-bit. Nếu cả hai tín hiệu cách lấy mẫu có cùng công
suất nhiễu, chúng ta có quan hệ sau:
Từ đó chúng ta có được quan hệ sau: m − n = (1/2)log
2
(OSR). Điều này có nghĩa là nếu
chúng ta lấy mẫu nhanh hơn 4 lần, chúng ta sẽ tăng số bit hiệu dụng của bộ ADC lên 1.
Nói cách khác, chúng ta có thể tăng OSR để giảm số bit cần có trong bộ ADC thực mà
vẫn có được công suất nhiễu trong băng thông được quan tâm giống như của một bộ
ADC được lấy mẫu ở tần số Nyquist. Như vậy chúng ta có thể tăng OSR đến khi chỉ cần
1-bit để hiện thực bộ ADC, chẳng hạn, có thể dùng OSR là 16384 để có được độ phân
giải 8-bit với bộ ADC 1-bit.
Các định nghĩa cơ bản
Một tín hiệu liên tục theo thời gian là một hàm của thời gian, và gán một giá trị thực cho
mỗi giá trị thời gian. Một tín hiệu rời rạc theo thời gian là một chuỗi được định nghĩa
theo các số nguyên. Nếu một tín hiệu liên tục theo thời gian x(t) được lấy mẫu mỗi T
giây, kết quả là chuỗi rời rạc theo thời gian x[n] = {x(nT)}.
Một chuỗi rời rạc theo thời gian x[n] là tuần hoàn nếu có một số nguyên N sao cho
x[n+N] = x[n]. Số nguyên dương N nhỏ nhất thỏa mãn x[n+N] = x[n] được gọi là chu kỳ
.
Xét hàm mũ phức trong miền thời gian liên tục:
cùng với các phần tử:
Rõ ràng các hàm mũ phức bao gồm cả lớp hàm sin thực lẫn ảo. Tính chất tổng quát này
của các hàm mũ phức khiến chúng rất có ích cho việc phân tích tín hiệu cả trong miền
thời gian liên tục lẫn rời rạc. Từ các biểu thức trên, chúng ta giới thiệu các tần số âm,
(chỉ) để thuận tiện về mặt toán học:
Với hàm mũ phức:
chúng ta có thể biểu diễn thành phần ảo theo thành phần thực thành và có được một vectơ
quay ngược chiều kim đồng hồ với tốc độ ω
c
rad/s. Các hàm mũ có tần số âm là các vectơ
tương tự nhưng quay cùng chiều kim đồng hồ. Do đó tổng của một hàm mữ tần số dương
và một hàm mũ tần số âm (với cùng biên độ và tần số) sẽ tạo ra một vectơ nằm trên trục
hoành, tức là có thể tạo thành các tín hiệu hình sin thực từ tổng các hàm mũ phức.
Với các hàm sin và mũ rời rạc theo thời gian, có các khác biệt cơ bản với các hàm liên
tục theo thời gian. Xét tín hiệu sin đơn giản:
x(t) = cos(ω
c
t)
Nếu chúng ta lấy mẫu tại những khoảng thời gian rời rạc T giây, chúng ta có được chuỗi
rời rạc theo thời gian:
x[n] = cos(ω
c
nT) = cos(ω
d
n)
Tần số rời rạc ω
d
có đơn vị là rad/mẫu. Theo cách tương tự, chúng ta có thể định nghĩa
Do đó, để chuyển phạm vi tần số rời rạc trở về phạm vi tần số liên tục, chúng ta chia
phạm vi tần số rời rạc cho chu kỳ lấy mẫu T. Như vậy, chúng ta không thể nói đến tần số
của một tín hiệu liên tục theo thời gian từ dữ liệu rời rạc theo thời gian mà không biết về
chu kỳ lấy mẫu. Hệ quả, khi một sóng sin liên tục theo thời gian được lấy mẫu, nó phải
nằm trong khoảng:
−F
s
/2 ≤ F
c
≤ F
s
/2
Lấy mẫu lý tưởng và tự nhiên
Xét một tín hiệu liên tục theo thời gian, x(t), được lấy mẫu mỗi T giây. Tín hiệu lấy mẫu
được, x
*
(t), có thể được biểu diễn:
Sử dụng phép biến đổi Fourier, có thể cho thấy các thành phần tần số của tín hiệu lấy
mẫu được, x
*
(t), như sau:
với X(jω) biểu diễn biến đổi Fourier của tín hiệu gốc x(t). Với n = 0, X
*
(jω) trùng với
X(jω), tuy nhiên với n ≠ 0, chúng ta có các thành phần tần số khác, với hình dạng tương
tự như X(jω), nhưng bị dịch bởi một số nguyên lần tần số lấy mẫu ω
s
theo cả chiều dương
lẫn chiều âm. Những thành phần này được gọi là alias.
Nếu tần số cao nhất của tín hiệu gốc là nhỏ hơn một nửa tần số lấy mẫu, nghĩa là ω
trong miền thời gian liên tục. Với các hệ trong miền thời gian rời rạc, chúng ta có công cụ
tương tự là các phương trình sai phân. Phương trình sai phân liên hệ (chuỗi) đầu ra của
một hệ rời rạc, y[n], với một (chuỗi) đầu vào rời rạc, x[n].
Ngày nay, các hệ rời rạc có thể được hiện thực hoàn toàn trong máy tính; có thể thực hiện
một bộ lọc số chẳng hạn. Tín hiệu vào, x[n], sẽ là dữ liệu đã được lấy mẫu (và thực tế là
một số nhị phân), và y[n] sẽ là kết quả của việc lọc, sẵn sàng được xuất ra thế giới thực
thông qua một DAC.
Bất chấp bản chất của hệ rời rạc, chúng ta muốn biểu diễn mối quan hệ vào/ra bằng toán
học, để hiểu tính chất của hệ hay để thiết kế các bộ lọc mới đáp ứng các chỉ tiêu kỹ thuật
riêng bằng các phương pháp toán học hợp lý. Các phương trình sai phân chính là một
công cụ như vậy.
Xét một hệ được biểu diễn toán học bằng một phương trình sai phân:
y[n] = a.y[n−1] + b.y[n−2] + c.x[n] + d.x[n−1]
Ngõ ra hiện tại, y[n], là một hàm của các ngõ ra trước đó (y[n−1], y[n−2]), giá trị ngõ vào
hiện tại, x[n], và giá trị ngõ vào ngay trước đó, x[n−1]. Chức năng của hệ phụ thuộc vào
các hệ số a, b, c, d.
Như với hệ liên tục, có một số tính chất chung cần phải làm quen. Các tính chất này bao
gồm:
• Tính tuyến tính Giả thiết x[n] là tổng của một số tín hiệu, x[n] = x
1
[n] + x
2
[n].
Gọi y[n] là ngõ ra của hệ khi ngõ vào là x[n]. Giả sử y
1
[n] là ngõ ra khi ngõ vào là
x
1
[n], và y
2
Chập tín hiệu là quá trình nền tảng cho việc phân tích và xử lý tín hiệu. Nó có quan hệ rất
gần gũi với phép biến đổi Fourier, hay tổng quát hơn là phép biến đổi Laplace, trong
miền tần số và với phép biến đổi Z trong miền thời gian rời rạc. Việc nhân các thành
phần trong miền tần số, tức là nhân hàm truyền trong miền tần số của một hệ với biểu
diễn trong miền tần số của một tín hiệu vào, là tương đương với việc chập đáp ứng xung
trong miền thời gian của hệ với tín hiệu ngõ vào trong miền thời gian. Nhớ lại rằng phép
biến đổi Laplace ngược của một hàm truyền của một hệ cho ta đáp ứng xung của hệ.
Phép chập chỉ đơn thuần là một phép toán trong miền thời gian, không giống như phép
nhân các biến đổi Laplace xảy ra trong một miền tần số giả.
Phép chập thường được ký hiệu bằng dấu sao (*). Bằng cách này, chúng ta có thể biểu
diễn phép chập của h[n] và x[n] bởi y[n] = h[n]*x[n]. Khi mô tả bằng đồ thị, chúng ta
thường đảo ngược một tín hiệu, và tính tổng của tích các thành phần chồng lên nhau cho
mỗi một phép dịch thời gian. Với những tín hiệu có nhiều thành phần khác 0, đây là một
quá trình rất tốn công sức và thời gian. May mắn là chúng ta có một công thức toán học
ngắn gọn cho phép chập:
Tổng chập có ích trong nhiều phương diện phân tích và xử lý tín hiệu, tuy nhiên ứng
dụng cơ bản nhất là lấy đáp ứng rời rạc của các hệ, các bộ lọc đối với tín hiệu vào rời rạc
mong muốn.
Đối với miền thời gian liên tục, có thể dễ dàng chứng minh hàm truyền của một hệ cho
biết đáp ứng xung của hệ đó. Trong miền thời gian rời rạc, chúng ta cũng có quan hệ
tương tự. Xét một hệ với ngõ vào là một xung rời rạc δ[n], và để ý ngõ ra rời rạc y[n] của
hệ, với hàm truyền là h[n]. Vì ngõ vào chỉ là một xung rời rạc, kết quả của phép chập sau
mỗi phép dịch thời gian chỉ là thành phần tương ứng trong h[n] nhân với 1 (của ngõ vào),
nghĩa là ngõ ra y[n] chính là h[n]. Nói cách khác, h[n] chính là đáp ứng xung rời rạc của
hệ.
Nhân nói về phép chập, 2 loại bộ lọc cũng được giới thiệu ở đây, vì chúng được phân loại
dựa vào đáp ứng xung. Trước tiên, xét phương trình sai phân bậc nhất liên hệ ngõ ra y[n]
và ngõ vào x[n] của bộ lọc:
y[n] = x[n] + 0.5y[n−1]
Hàm truyền của hệ có thể tìm được bằng cách cho x[n] = δ[n]. Tại n = 0, ta có x[0] = 1,
[n] + x[n]*h
2
[n]
Nhân tiện đang nói đến chập tín hiệu, có thể giới thiệu định lý cửa sổ (windowing
theorem) ở đây. Khi xét mối quan hệ giữa các miền thời gian và tần số, chúng ta có thể
thấy chập của hai chuỗi rời rạc trong miền thời gian tương đương với nhân các đáp ứng
tần số của chúng trong miền tần số. Ngược lại, tích của hai chuỗi rời rạc trong miền thời
gian tương đương với chập các biến đổi Fourier của chúng:
Phân tích trong miền tần số
Xét trường hợp chuỗi vào x[n] có dạng hàm mũ phức x[n] = e
jω
d
n
. Ngõ ra của hệ được
tính bởi tổng chập:
Chúng ta định nghĩa:
và như vậy có thể biểu diễn ngõ ra như sau:
H(e
jω
d
) bao gồm các thành phần biên độ và pha phụ thuộc tần số, và được coi là đáp ứng
tần số của hệ. Cần chú ý rằng đáp ứng tần số là một hàm liên tục và tuần hoàn, và đáp
ứng tần số được định nghĩa hoàn toàn trong phạm vi tần số −π ≤ ω
d
≤ π.
Ví dụ về tính đáp ứng tần số: Tính đáp ứng tần số của hệ được biểu diễn bằng phương
trình sai phân sau: y[n] = 0.5x[n] + x[n−1] + 0.5x[n−2].
Về mặt toán học, đáp ứng xung cho bởi: h[n] = 0.5δ[n] + δ[n−1] + 0.5δ[n−2].
Do đó, đáp ứng tần số cho bởi:
Chúng ta tính phần biên độ và phần pha riêng biệt:
rạc. Cũng có thể thấy rõ là hàm truyền theo biến z của một hệ rời rạc là tương đương với
biến đổi Fourier của đáp ứng xung rời rạc.
Nếu cần đánh giá đáp ứng tần số, chúng ta thay z bằng e
jω
d
, và đánh giá biên độ và pha
theo cách bình thường.
Biến đổi z là trường hợp tổng quát của biến đổi Fourier của chuỗi rời rạc trong miền thời
gian, giống như phép biến đổi Laplace là trường hợp tổng quát hóa của biến đổi Fourier
cho tín hiệu liên tục theo thời gian.
Để đánh giá đáp ứng tần số thuận tiện hơn, chúng ta có thể biến đổi thẳng từ hàm theo z
sang miền tần số tương tự, bằng cách thay z bằng e
jω
c
T
, với tần số tính bằng rad/s.
Phép biến đổi Fourier rời rạc-DFT
Theo cách tương tự như với tín hiệu liên tục theo thời gian, chúng ta có thể rút ra chuỗi
Fourier của tín hiệu rời rạc theo thời gian:
với N là số mẫu trong một chu kỳ của tín hiệu tuần hoàn rời rạc theo thời gian. Chú ý là
không giống với trường hợp tín hiệu liên tục theo thời gian, có vô số hệ số C
k
, chuỗi
Fourier rời rạc chỉ có N hệ số, nghĩa là k = 0 N−1.
Việc biểu diễn các hệ số ra các thành phần biên độ và pha mang nhiều thông tin hơn.
Thành phần biên độ là có ích nhất trong việc thể hiện mức độ mà một tần số cụ thể có
mặt trong tín hiệu gốc, được tính bằng cách bình phương cả hai phần thực và ảo, sau đó
rút căn tổng các bình phương. Trục tần số được tính theo đơn vị F
s
/N Hz, với F
Kỹ thuật cửa sổ là một phương pháp điều chỉnh dữ liệu có chiều dài hữu hạn để dữ liệu
trở nên thích hợp hơn nhiều cho xử lý số tín hiệu. Một cửa sổ mô tả một số hệ số nhân
được áp đặt vào các phần tử rời rạc của một chuỗi dữ liệu. Dạng cửa sổ đơn giản nhất là
cửa sổ chữ nhật (có tất cả các phần tử khác 0 là 1). Các phần tử của chuỗi dữ liệu cửa sổ
w[n] được nhân với các phần tử tương ứng của chuỗi dữ liệu có chiều dài hữu hạn x[n].
Kiểu dữ liệu này không thực sự có ích trừ khi cần cắt bỏ chuỗi dữ liệu.
Một cửa sổ hữu dụng hơn là cửa sổ Hanning (còn gọi là cửa sổ cosin nâng lên). Cửa sổ
Hanning được định nghĩa như sau:
Hiển nhiên, nhân một chuỗi dữ liệu với cửa sổ Hanning sẽ làm méo nghiêm trọng tín
hiệu. Tuy nhiên, từ quan điểm phân tích trong miền tần số, một cửa sổ như vậy sẽ làm dữ
liệu giống như tuần hoàn, nghĩa là không có sự gián đoạn đột ngột. Như vậy các vấn đề
liên quan đến việc rò phổ có thể được giảm đi.
Một cửa sổ thông dụng khác là cửa sổ Hamming, một biến thể của cửa sổ Hanning, được
định nghĩa như sau:
Cửa sổ Hamming nhìn chung cho kết quả tốt hơn cửa sổ Hanning, mặc dù nó hơi phức
tạp hơn khi tính toán. Ngoài ra còn một số cửa sổ khác như Blackman, và Kaiser, có
những cải thiện hơn nữa và càng phức tạp hơn khi tính toán.
Một điểm cần chú ý là tuy các cửa sổ cải thiện vấn đề rò phổ bằng cách làm giảm kích
thước của side-lobe trong phổ tần số của chúng, nhưng chúng lại làm giảm độ phân giải
phổ. Điều này xảy ra vì các cửa sổ phức tạp thường có main-lobe của phổ tần số của
chúng rộng hơn main-lobe của cửa sổ chữ nhật, và như vậy có khuynh hướng làm nhòe
thành phần phổ trội lên. Khi phân biệt các thành phần tần số gần nhau, điều này sẽ gây
khó khăn rất nhiều.
Như vậy, việc dùng cửa sổ thường đòi hỏi một sự thỏa hiệp giữa việc chọn cửa sổ có
side-lobe nhỏ để giảm rò phổ, và cửa sổ có main-lobe nhỏ để có được độ phân giải tần số
tốt bằng cách giảm sự nhòe phổ.
Phép biến đổi Fourier nhanh-FFT
Mặc dù một cách lý tưởng thì chúng ta muốn tính biến đổi Fourier của tín hiệu rời rạc,
nhưng sẽ dễ dàng hơn nếu chúng ta giả thiết chuỗi dữ liệu rời rạc là 1 chu kỳ của một
chuỗi tuần hoàn, và hệ quả là chúng ta tính chuỗi Fourier rời rạc của tín hiệu. Cách xử lý
10240 phép cộng phức và 5120 phép nhân phức. Khi chiều dài mẫu N càng lớn, ưu thế
của FFT so với DFT càng thể hiện rõ.
Phần này chỉ nói đến những vấn đề cơ bản trong xử lý số tín hiệu, các phương pháp thiết
kế mạch lọc số (ứng dụng rộng rãi nhất của DSP) sẽ được giới thiệu qua những ví dụ cụ
thể cho các dòng chip khác nhau.