# Bài 2: từ dãy mẫu tới convolution và Fourier

[Bắt đầu](00-BAT-DAU-LOP-01.md) · Trước: [tiếng nói](01-TIENG-NOI-VA-SOURCE-FILTER.md) · Tiếp: [sampling](03-SAMPLING-ALIASING-RESAMPLING.md)

## Mục tiêu và cầu nối

Tự tính được một convolution, hiểu vì sao DFT dùng số phức, khôi phục một tín hiệu nhỏ, và bắt được câu “Fourier mất thời gian” thiếu điều kiện. Bạn cần bài 1 và phép cộng/nhân. Với fs mẫu/giây, mẫu n có thời điểm t=n/fs giây. Vector [x[0],…,x[L−1]] là L tọa độ; dấu ngoặc vuông chỉ số không phải đơn vị.

## 1. Một hệ tuyến tính được mô tả bằng đáp ứng xung thế nào?

Xung đơn vị δ[n] bằng 1 tại n=0, bằng 0 nơi khác. Mọi dãy có thể viết x[n]=Σ_r x[r]δ[n−r]. Hệ **tuyến tính** giữ phép cộng và nhân hệ số; **bất biến theo thời gian** cho cùng đáp ứng khi đầu vào bị dịch. Với h là đầu ra ứng với δ, đầu ra ứng với x[r]δ[n−r] là x[r]h[n−r]. Cộng lại:

$$y[n]=\sum_r x[r]h[n-r].$$

Đây là dẫn xuất cho LTI (linear time-invariant), không cho clipping hay bộ lọc thay hệ số theo nội dung. [S3: Smith, chương 6, impulse response và input/output-side convolution](https://www.dspguide.com/CH6.PDF).

**Ví dụ số hoàn chỉnh:** x=[1,2,−1], h=[1,0.5], biên độ quy ước, zero ngoài miền.

| n | Phép cộng ảnh hưởng | y[n] |
|---|---|---:|
| 0 | 1×1 | 1 |
| 1 | 2×1 + 1×0.5 | 2.5 |
| 2 | (−1)×1 + 2×0.5 | 0 |
| 3 | (−1)×0.5 | −0.5 |

Chiều dài linear convolution là 3+2−1=4. **Phản ví dụ:** với C(x)=clip(x,−1,1), C(0.8+0.8)=1 nhưng C(0.8)+C(0.8)=1.6. Không tuyến tính, nên không có một h cố định biểu diễn C cho mọi x.

## 2. Cầu nối số phức: hai tọa độ thay vì một số bí ẩn

j thỏa j²=−1. Số a+jb là điểm (a,b); độ lớn |a+jb|=√(a²+b²), góc arg(a+jb) tính bằng radian. Euler viết e^(jθ)=cosθ+j sinθ. Nhân e^(jθ) quay một vector góc θ. Nếu chưa quen Euler, chỉ thay nó bằng cos và sin trong công thức dưới: DFT đồng thời đo hai thành phần vuông pha.

Tích vô hướng giữa hai vector thực u,v là Σ_n u[n]v[n]: lớn khi hình dạng cùng hướng, có triệt tiêu khi khác hướng. DFT dùng các sóng sin/cos làm “thước đo” hình dạng dao động. [S4: Smith, chương 8, DFT và basis functions](https://www.dspguide.com/CH8.PDF).

## 3. DFT giữ đủ thông tin nếu giữ cả phần phức

Với dãy N mẫu, chọn quy ước forward không chia N:

$$X[k]=\sum_{n=0}^{N-1}x[n]e^{-j2\pi kn/N},\quad k=0,\ldots,N-1.$$

Mỗi k là một sóng quay k vòng trong N mẫu; mỗi x[n] nhân với vị trí của sóng đó rồi cộng. Tần số bin dương f_k=k fs/N Hz tới Nyquist; các k phía trên biểu diễn tần số âm trong quy ước phổ hai phía. Inverse có hệ số 1/N:

$$x[n]=\frac1N\sum_{k=0}^{N-1}X[k]e^{j2\pi kn/N}.$$

Các basis trực giao nên inverse cộng lại đúng tín hiệu. FFT là thuật toán tính DFT nhanh, không phải một representation có thông tin khác. Đơn vị X phụ thuộc normalization; đừng đọc một FFT coefficient chưa hiệu chỉnh thành áp suất âm hay dB SPL. [S4, mục Synthesis/Analysis](https://www.dspguide.com/CH8.PDF).

**Ví dụ DFT hoàn chỉnh:** N=4, x=[1,0,−1,0], fs=8 Hz.

- k=0: X[0]=1−1=0.
- k=1: n=2 có e^(−jπ)=−1, nên X[1]=1+(−1)(−1)=2.
- k=2: n=2 có e^(−j2π)=1, nên X[2]=1−1=0.
- k=3: n=2 có e^(−j3π)=−1, nên X[3]=2.

Phổ [0,2,0,2]. Bin 1 là +2 Hz, bin 3 là −2 Hz; hai phía đối xứng vì x thực. Inverse: x[n]=(2e^(jπn/2)+2e^(−jπn/2))/4=cos(πn/2), tạo đúng [1,0,−1,0]. Đây là kiểm tra giữ thông tin, không chỉ nhận biết peak.

## 4. Phase mang thông tin dịch thời gian

Dịch vòng x một mẫu thành y=[0,1,0,−1]. Thay n−1 vào DFT và đổi biến cho:

$$Y[k]=e^{-j2\pi k/4}X[k].$$

Do hệ số quay có độ lớn 1, magnitude không đổi: |Y|=|X|=[0,2,0,2]. Nhưng Y=[0,−2j,0,2j]. Từ phổ phức, inverse biết peak xảy ra ở n nào; từ magnitude đơn lẻ, không phân biệt x và y. Phép dịch vòng ở đây có giả định periodic boundary; dịch thật rồi crop có thể làm magnitude đổi vì mất/thêm mẫu ở biên. [S25: Julius O. Smith, Shift Theorem, định lý và chứng minh](https://dsprelated.com/freebooks/mdft/Shift_Theorem.html).

Do đó, Fourier của toàn clip **không có trục thời gian cục bộ dễ đọc như spectrogram**, nhưng giữ đủ mẫu qua magnitude+phase. Câu đúng khi xây log-mel là “bỏ phase trực tiếp và gộp năng lượng”; không phải “Fourier luôn xóa vị trí”.

## 5. Convolution theorem và cái bẫy biên

Với biến đổi phù hợp, convolution trong thời gian trở thành nhân trong tần số. Tuy nhiên, N-point DFT biểu diễn **circular convolution** nếu nhân phổ và inverse với cùng N. Muốn lấy linear convolution của hai dãy dài L và K, zero-pad chúng tới N≥L+K−1 trước.

**Tự dựng phản ví dụ:** x=[1,2], h=[1,1]. Linear output [1,3,2]. Nếu N=2, mẫu cuối cuộn về đầu: circular output [3,3]. Thêm zero để N=3 hoặc lớn hơn mới tránh wrap-around. Đây là khác biệt toán về boundary, không lỗi số học của FFT. [S5, mục Convolution theorem](https://www.dspguide.com/CH9.PDF).

## 6. Nối với Audio-JEPA

Source-filter dùng convolution; STFT trong bài 4 dùng DFT của từng đoạn. Từ log-mel, encoder không nhận phase phức trực tiếp. Một cue chỉ tồn tại trong phần phase bị bỏ sẽ không thể khôi phục vô điều kiện. Nhưng detector có thể vẫn thấy cue tương quan trong magnitude theo thời gian: “không nhập phase” không chứng minh “không phát hiện được mọi phase artifact”. Đây là suy luận về information path, không đo cue retention của checkpoint.

CNN trong thư viện thường tính **cross-correlation** thay vì đảo kernel như định nghĩa convolution. Vì kernel được học, tên layer không buộc ta diễn giải trọng số như một bộ lọc DSP cố định; chi tiết này sẽ nối lại ở bài 8.

## 7. Bài tập và đáp án

1. Tính convolution [1,−1]*[1,1] với zero ngoài miền.
2. Tính DFT N=4 của δ=[1,0,0,0]. Dịch nó một mẫu: magnitude và phase thay ra sao?
3. Có thể lấy inverse FFT của magnitude với phase=0 và gọi đó là waveform gốc không?
4. x dài 800, h dài 129. FFT length 800 có đủ cho linear convolution không? Nếu chọn 1.024 thì sao?

<details>
<summary>Lời giải</summary>

1. [1,0,−1]: giữa là 1×1+(−1)×1=0. Đầu ra dài 3.
2. X[k]=1 cho mọi k. Dịch thành [0,1,0,0] cho Y[k]=e^(−j2πk/4)=[1,−j,−1,j]; magnitude vẫn 1, phase thay.
3. Không. Bạn đã tự chọn một tín hiệu trong họ có cùng magnitude; phase gốc chưa biết. Ví dụ x/y ở mục 4 bác bỏ khôi phục duy nhất. Với nhiều STFT magnitude chồng nhau, constraints có thể hạn chế họ nghiệm; điều đó không cứu magnitude DFT đơn lẻ ở ví dụ này.
4. Cần ít nhất 800+129−1=928. N=800 không đủ; N=1.024 đủ tránh circular aliasing về thời gian trong phép tính này. Đây là zero-padding cho convolution, khác zero-padding để vẽ phổ mịn hơn.

</details>

## Đào sâu tự chọn

Tự chứng minh trực giao Σ_n e^(j2π(k−l)n/N)=0 khi k≠l modulo N bằng tổng cấp số nhân. Sau đó inverse DFT trở nên một phép đổi basis. Phân biệt DTFT (tần số liên tục của dãy rời rạc) và DFT (N bin của đoạn hữu hạn); luồng chính chỉ cần DFT.
