Back to Home

Phân tích Fourier: Từ lý thuyết chuỗi đến ứng dụng trong xử lý tín hiệu số

Phân tích Fourier được đặt tên theo nhà toán học và vật lý học người Pháp Jean-Baptiste Joseph Fourier (1768–1830). Ông là người đã đặt nền móng cho lý thuyết này thông qua công trình nghiên cứu về sự truyền nhiệt (Théorie analytique de la chaleur). Fourier đề xuất rằng bất kỳ hàm số nào, dù liên tục hay gián đoạn, đều có thể được biểu diễn dưới dạng một chuỗi các hàm lượng giác. Mặc dù ý tưởng này ban đầu gặp phải sự hoài nghi từ các nhà toán học cùng thời như Lagrange hay Laplace, nhưng nó đã trở thành một trong những công cụ quan trọng nhất của toán học ứng dụng và kỹ thuật tín hiệu hiện đại.

Nguyên lý cốt lõi của phương pháp này dựa trên khẳng định: một tín hiệu phức tạp có thể được biểu diễn dưới dạng tổng các hàm lượng giác đơn giản (sine và cosine) với các tần số, biên độ và pha khác nhau. Việc chuyển đổi một tín hiệu từ miền thời gian (time domain) sang miền tần số (frequency domain) cho phép chúng ta quan sát và xử lý dữ liệu theo cách mà các phương pháp truyền thống không làm được.

Trong bài viết này, mình sẽ trình bày cách thức hoạt động của Fourier thông qua hai khía cạnh:

  1. Fourier Series (Chuỗi Fourier): Giải thích cách tổng hợp các sóng tuần hoàn từ những thành phần cơ bản.

  2. Discrete Fourier Transform (DFT - Biến đổi Fourier rời rạc): Cách áp dụng toán học Fourier vào dữ liệu hữu hạn để tái cấu trúc lại các đối tượng hình học.

Thông qua hai demo tương tác dưới đây, mình sẽ phân tích cách các hệ số Fourier trực tiếp tác động đến đặc tính của tín hiệu.

Chuỗi Fourier (Fourier Series)

Hàm tuần hoàn là gì?

Trước khi tìm hiểu về Fourier, chúng ta cần hiểu về đối tượng mà nó xử lý: Hàm tuần hoàn.

Một hàm số f(t)f(t) được gọi là tuần hoàn nếu giá trị của nó lặp lại sau những khoảng thời gian bằng nhau. Khoảng thời gian ngắn nhất để sự lặp lại này xảy ra được gọi là Chu kỳ (TT).

  • Công thức: f(t)=f(t+T)f(t) = f(t + T) với mọi tt.

  • Ví dụ: Tiếng bíp đều đặn của máy đo nhịp tim, chuyển động quay của cánh quạt, hay đơn giản nhất là các hàm lượng giác sin(x)\sin(x)cos(x)\cos(x) với chu kỳ 2π2\pi.

Ý tưởng của Fourier: Phân rã tín hiệu

Joseph Fourier đưa ra một giả thuyết quan trọng: Mọi hàm tuần hoàn phức tạp đều có thể được tạo thành bằng cách cộng các hàm sin\sincos\cos đơn giản lại với nhau.

Hãy tưởng tượng bạn có một sợi dây thừng. Bạn có thể tạo ra một hình dạng phức tạp bằng cách kết hợp nhiều dao động nhỏ với các tần số khác nhau. Chuỗi Fourier chính là "công thức" để xác định xem mỗi dao động nhỏ đó đóng góp bao nhiêu vào hình dạng tổng thể.

Công thức Chuỗi Fourier

Công thức tổng quát của chuỗi Fourier cho một hàm f(t)f(t) chu kỳ TT là:

f(t)=a02Thaˋnh phaˆˋn DC+n=1[ancos(2πntT)+bnsin(2πntT)]f(t) = \underbrace{\frac{a_0}{2}}_{\text{Thành phần DC}} + \sum_{n=1}^{\infty} \left[ a_n \cos\left(\frac{2\pi nt}{T}\right) + b_n \sin\left(\frac{2\pi nt}{T}\right) \right]

Trong đó:

  • a0a_0: Giá trị trung bình của hàm số (thành phần DC).

  • an,bna_n, b_n: Các hệ số Fourier, xác định biên độ của các thành phần cosin và sin ở tần số bậc nn.

  • nn: Số nguyên dương, đại diện cho các họa âm (harmonics). Tần số của họa âm bậc nnfn=nf1f_n = n \cdot f_1 (với f1=1T\displaystyle f_1 = \frac 1T là tần số cơ bản).

Ví dụ

Giả sử mình muốn tạo ra một tín hiệu điện áp dao động quanh mức 5V5V, với biên độ dao động là 3V3V và tần số là 1Hz1Hz (T=1T=1).

  1. Thành phần DC (a0/2a_0/2): Đây là giá trị trung bình (mức nền) của tín hiệu. Trong ví dụ này, a02=5\displaystyle \frac {a_0} 2 = 5. Nếu không có thành phần này, sóng sẽ dao động quanh mức 00 (từ 3-3 đến 33). Nhờ có DC, sóng sẽ dao động từ 2V2V đến 8V8V.

  2. Tần số cơ bản (n=1n=1): Đây là thành phần chính quyết định tốc độ lặp lại của tín hiệu. Ở đây biên độ là 33, nên mình có b1=3b_1 = 3 (nếu dùng hàm sin\sin).

  3. Các họa âm (n>1n > 1): Trong các tín hiệu thực tế phức tạp như sóng vuông hay sóng răng cưa, chúng ta sẽ cần thêm các thành phần a2,b2,a3,b3...a_2, b_2, a_3, b_3... để "uốn" đường cong theo ý muốn.

Từ đó, chúng ta có hàm kết quả là f(t)=5+3sin(2πt)f(t) = 5 + 3\sin(2\pi t).

Chuyển đổi sang dạng Biên độ và Pha

Từ công thức tổng quát trên, chúng ta có thể gộp lại thành một hàm sin\sin duy nhất khi bị dịch đi một góc ϕ\phi. Công thức trở thành:

f(t)=a02+n=1Ansin(2πntT+ϕn)f(t) = \frac{a_0}{2} + \sum_{n=1}^{\infty} A_n \sin\left(\frac{2\pi nt}{T} + \phi_n\right)

Trong đó:

  • AnA_n (Biên độ): an2+bn2\sqrt{a_n^2 + b_n^2} - Cho biết độ lớn của sóng.

  • ϕn\phi_n (Pha): arctan(an/bn)\arctan(a_n/b_n) - Cho biết vị trí bắt đầu của sóng.

Cách biểu diễn này cho thấy: để tạo ra một tín hiệu, mình chỉ cần biết mỗi tần số cần "to" bao nhiêu (Biên độ) và "xuất phát" lúc nào (Pha).

Demo - Tổng các hàm sin\sin

Trong giao diện này, mình đã hiện thực hóa công thức f(t)=Ansin(nωt+ϕn)f(t) = \sum A_n \sin(n\omega t + \phi_n). Khi các bạn thay đổi Biên độ (Amplitude)Pha (Phase) của từng họa âm, bạn sẽ thấy cách chúng cộng hưởng hoặc triệt tiêu lẫn nhau để tạo ra các dạng sóng phức tạp.

Từ thực tại đến số phức

Mặc dù việc cộng các hàm sine rất trực quan, nhưng khi tính toán với hàng ngàn tần số khác nhau, các hàm lượng giác trở nên rất cồng kềnh. Để tối ưu hóa, mình cần một công cụ mạnh mẽ hơn: đó là Số phức.

Công thức ban đầu:

f(t)=a02+n=1[ancos(2πntT)+bnsin(2πntT)]f(t) = \frac{a_0}{2} + \sum_{n=1}^{\infty} \left[ a_n \cos\left(\frac{2\pi nt}{T}\right) + b_n \sin\left(\frac{2\pi nt}{T}\right) \right]

Nhớ lại công thức Euler vĩ đại:

eix=cos(x)+isin(x)e^{ix} = \cos(x) + i\sin(x)

Để đưa chuỗi Fourier về dạng hàm mũ ee, mình sử dụng hai hệ quả trực tiếp từ công thức Euler:

cos(x)=eix+eix2sin(x)=eixeix2i\cos(x) = \frac{e^{ix} + e^{-ix}}{2} \\ \sin(x) = \frac{e^{ix} - e^{-ix}}{2i}

Khi thay hai biểu thức này vào công thức lượng giác ban đầu:

f(t)=a02+n=1[an(einωt+einωt2)+bn(einωteinωt2i)]f(t) = \frac{a_0}{2} + \sum_{n=1}^{\infty} \left[ a_n \left( \frac{e^{in\omega t} + e^{-in\omega t}}{2} \right) + b_n \left( \frac{e^{in\omega t} - e^{-in\omega t}}{2i} \right) \right]

Nếu ta gom các số hạng có cùng mũ einωte^{in\omega t}einωte^{-in\omega t} lại với nhau, ta sẽ thấy một cấu trúc đối xứng thú vị. Thay vì viết riêng lẻ ana_nbnb_n, ta đặt ra một hệ số phức mới là cnc_n. Lúc này:

  • Thành phần einωte^{in\omega t} (với n>0n > 0) đại diện cho các vector xoay ngược chiều kim đồng hồ.

  • Thành phần einωte^{-in\omega t} (với n>0n > 0 thực chất là các chỉ số âm trong tổng) đại diện cho các vector xoay cùng chiều kim đồng hồ.

  • Thành phần a02\displaystyle \frac {a_0} 2 chính là c0c_0 (tần số bằng 0).

Lại có:

ω=2πT    nωt=2πntT\omega = \frac {2 \pi} T \implies n\omega t = \frac {2 \pi n t} T

Bây giờ, hãy nhìn vào cách ta gom nhóm các số hạng sau khi thay công thức Euler vào:

f(t)=a02+n=1[(anibn2)ei2πntT+(an+ibn2)ei2πntT]f(t) = \frac{a_0}{2} + \sum_{n=1}^{\infty} \left[ \left( \frac{a_n - ib_n}{2} \right) e^{i\frac{2\pi nt}{T}} + \left( \frac{a_n + ib_n}{2} \right) e^{-i\frac{2\pi nt}{T}} \right]

Bước đặt biến để thống nhất công thức:

Để đưa về một biểu thức duy nhất, các nhà toán học đặt ra hệ số phức cnc_n như sau:

  • Với n>0n > 0: cn=anibn2c_n = \frac{a_n - ib_n}{2} (Hệ số ứng với các vector xoay ngược chiều kim đồng hồ).

  • Với n<0n < 0: cn=an+ibn2c_n = \frac{a_{-n} + ib_{-n}}{2} (Hệ số ứng với các vector xoay cùng chiều kim đồng hồ).

  • Với n=0n = 0: c0=a02\displaystyle c_0 = \frac{a_0}{2} (Thành phần DC, không xoay).

Nhờ việc đặt biến này, hai số hạng eie^{i\dots}eie^{-i\dots} trong dấu ngoặc vuông (vốn chạy từ n=1n=1 \to \infty) đã được trải phẳng ra thành một dải chỉ số chạy từ -\infty đến ++\infty

Kết quả cuối cùng:

f(t)=n=cnei2πntTf(t) = \sum_{n=-\infty}^{\infty} c_n e^{i \frac{2\pi nt}{T}}

Giá trị của các hệ số cnc_n được tính bằng công thức:

cn=1T0Tf(t)ei2πntTdtc_n = \frac{1}{T} \int_{0}^{T} f(t) e^{-i \frac{2\pi nt}{T}} dt

Bước nhảy sang Miền rời rạc

Có một vấn đề nảy sinh là công thức trên vẫn đang làm việc với biến thời gian tt liên tục và một tổng vô hạn các tần số. Máy tính không hiểu khái niệm "liên tục". Đối với nó, một đường vẽ không phải là một dòng chảy vô tận của các điểm, mà là một danh sách (mảng) các tọa độ cụ thể. Để máy tính có thể hiểu công thức Fourier, chúng ta phải thực hiện hai thay đổi mang tính bước ngoặt:

  • Hữu hạn hóa: Thay vì tổng đến \infty, ta chỉ xét đúng NN thành phần tần số tương ứng với NN điểm dữ liệu đầu vào.

  • Rời rạc hóa: Tích phân liên tục được thay thế bằng phép cộng tổng các mẫu (samples).

Biến đổi Fourier rời rạc (Discrete Fourier Transform - DFT)

Trong thế giới liên tục, chúng ta có vô số điểm. Nhưng trong máy tính, chúng ta chỉ có NN điểm dữ liệu rời rạc. Giả sử bạn có một tập hợp các cặp điểm (tn,yn)(t_n, y_n):

  • tnt_n: Các thời điểm lấy mẫu (thường chia đều khoảng cách). Như vậy tn=n.TN\displaystyle t_n = n. \frac T N với n=0,1,2,,N1n=0,1,2,\dots, N-1

  • yny_n: Giá trị tại thời điểm đó (có thể là biên độ âm thanh, tín hiệu, ...). Lúc này, thay vì hàm f(t)f(t), ta có một dãy NN điểm dữ liệu: yn=f(tn)y_n = f(t_n).

Thay t=nTN\displaystyle t=n \frac T N vào công thức tổng quát f(t)=ckei2πktTf(t) = \sum c_k e^{i \frac{2\pi kt}{T}}:

yn=kckei2πk(nTN)Ty_n = \sum_{k} c_k e^{i \frac{2\pi k (n \frac{T}{N})}{T}}

Triệt tiêu TT ở cả tử và mẫu, ta thấy một điều kỳ diệu xảy ra: Chu kỳ TT hoàn toàn biến mất, chỉ còn lại tỉ lệ giữa chỉ số bước nn và tổng số mẫu NN:

yn=kckei2πknNy_n = \sum_{k} c_k e^{i \frac{2\pi kn}{N}}

Đến đây, máy tính đã có thể tính toán được. Chúng ta định nghĩa lại hệ số ckc_k (vốn là tích phân) thành một tổng hữu hạn XkX_k. Và từ đây chúng ta có mục tiêu của toàn bộ quá trình này là: Tìm bộ hệ số XkX_k sao cho khi thay vào công thức iDFT, kết quả yny_n thu được phải trùng khớp 100% với các điểm dữ liệu ban đầu:

Xk=n=0N1ynei2πNknX_k = \sum_{n=0}^{N-1} y_n \cdot e^{-i \frac{2\pi}{N} kn}

Và từ đó ta có thể tính ngược lại yny_n với công thức inverse-DFT (iDFT):

yn=1Nk=0N1Xkei2πNkny_n = \frac{1}{N} \sum_{k=0}^{N-1} X_k \cdot e^{i \frac{2\pi}{N} kn}

Demo - DFT Sampling

Demo mô phỏng dùng DFT để vẽ hình

Sau khi bạn đã trải nghiệm demo trên (DFT 1D), bây giờ mình sẽ "nâng cấp" ý tưởng một chút để chuyển sang DFT 2D cho đồ họa vector. Đây chính là kỹ thuật mà các video nổi tiếng (như của 3Blue1Brown) dùng để vẽ Fourier từ một nét vẽ liên tục.

Một hình ảnh nét vẽ (contour) thực chất là một tập hợp các điểm tọa độ trong không gian 2D. Để dùng Fourier, chúng ta không coi nó là một hàm số y=f(x)y = f(x) (vì một xx có thể có nhiều yy), mà coi nó là một hàm tham số theo thời gian tt:

P(t)=(x(t),y(t))P(t) = (x(t), y(t))

Khi đó, quá trình tái tạo diễn ra như sau:

  1. Trục X: Ta lấy chuỗi các giá trị xix_i tại thời điểm tit_i và thực hiện DFT để tìm ra các hệ số Fourier cho riêng trục hoành.

  2. Trục Y: Tương tự, ta lấy chuỗi yiy_i và thực hiện DFT cho riêng trục tung.

  3. Hợp nhất: Tại mỗi thời điểm tt, ta lấy kết quả của cả hai chuỗi vòng tròn:

    • Chuỗi vòng tròn X quyết định vị trí ngang.

    • Chuỗi vòng tròn Y quyết định vị trí dọc.

    • Kết quả: Điểm cuối cùng của hai chuỗi này khớp lại sẽ vẽ nên hình ảnh ban đầu ❤❤❤

Định lý lấy mẫu Nyquist-Shannon (Nyquist-Shannon Sampling Theorem)

Trước khi rời rạc hóa tín hiệu liên tục để áp dụng Fourier, chúng ta phải đối mặt với một câu hỏi quan trọng: Lấy mẫu bao nhiêu điểm là đủ?

Nếu lấy mẫu quá thưa (sampling rate thấp), chúng ta sẽ mất thông tin và gặp hiện tượng aliasing (tần số cao bị “giả mạo” thành tần số thấp). Ngược lại, nếu lấy mẫu quá dày thì lãng phí tài nguyên tính toán.

Định lý Nyquist-Shannon đưa ra câu trả lời chính xác:

Nếu một tín hiệu liên tục x(t)x(t)không chứa bất kỳ tần số nào cao hơn BBHz (gọi là băng thông tối đa), thì ta có thể hoàn toàn tái tạo lại tín hiệu gốc từ các mẫu rời rạc chỉ cần lấy với tần số lấy mẫu fs>2Bf_s > 2B.

Tần số 2B2B được gọi là tần số Nyquist (Nyquist rate). Thực tế, người ta thường lấy fs2.2Bf_s \geq 2.2B đến 2.5B2.5B để có biên an toàn.

Ví dụ:

  • Tín hiệu âm thanh con người có tần số cao nhất khoảng 20 kHz → ta cần lấy mẫu ít nhất 40 kHz (thực tế CD audio dùng 44.1 kHz).

  • Nếu chỉ lấy mẫu ở 30 kHz, tần số 18 kHz sẽ bị “gập” xuống thành tần số thấp hơn (ví dụ 12 kHz), gây méo tiếng nghiêm trọng.

Tại sao định lý này quan trọng trước khi vào DFT?

DFT chỉ làm việc trên dữ liệu rời rạc (một mảng hữu hạn các điểm x[0],x[1],,x[N1]x[0], x[1], \dots, x[N-1]). Nếu chúng ta không tuân thủ định lý Nyquist-Shannon khi lấy mẫu từ tín hiệu liên tục, thì dù sau này tính DFT chính xác đến đâu, kết quả cũng sẽ sai vì thông tin tần số cao đã bị mất hoặc bị méo từ khâu lấy mẫu.

Comments

0/300

Leave name/email blank to comment anonymously

No comments yet. Be the first to comment!