相位聲碼器

相位聲碼器一種以傅立葉轉換為基礎的頻率處理工具，廣泛應用於音訊信號的時間伸縮（time-stretching）與音高轉換（pitch-shifting）等領域。為聲碼器演演算法的一種，使用相位聲碼器策略還可以實現許多其他特殊效果。

## 簡介

相位聲碼器會將input訊號分解成各個區塊，並對各個區塊進行短時距傅立葉變換（STFT），得到音訊的訊息，例如：強度（amplitude），和相位（phase）。由於每個聲音都是由不同頻率的許多諧波部分組成的，因此可以使用該資訊來猜測在該分析幀中播放或唱出的音符。在所需的頻譜變化之後，透過反向快速傅立葉轉換（inverse FFT）處理重新合成，將每個段返回到時間域。然後將修改後的段落相加。

## 短時距傅立葉轉換（STFT）

### 原理

相位聲碼器第一個核心機制就是STFT，本身為一種傅立葉轉換（Fourier Transform）的變形，分析非平穩訊號（非恆定頻率），核心概念為將input訊號拆成各種短段，然後再對每一段進行快速傅立葉轉換。又稱加窗傅立葉轉換（Windowed Fourier Transform）。用於描繪頻域與時域的變化，是頻譜分析重要的工具。在基於軟體定義無線電（SDR）的頻譜顯示中常用的。覆蓋 SDR 整個範圍的全頻寬顯示器通常在桌上型電腦上使用具有 2^24 點的快速傅立葉變換（FFT）。

### 數學公式

#### 連續STFT

在連續時間情況下，要變換的函數乘以一個僅在短時間內非零，它的數學公式基本形式為以下式子：

$$\mathbf{STFT}\{x(t)\}(\tau,\omega) \equiv X(\tau, \omega) = \int_{-\infty}^{\infty} x(t) w(t-\tau) e^{-i \omega t} \, d t$$

$x(\tau)$為原始訊號；$\omega$($\tau$−t)為窗函數（Window Function），集中在 t 附近，通常為高斯窗函數或漢窗函數；$\omega$為頻率變數；$X(\tau, \omega)$為一個表示訊號隨時間和頻率變化的相位和振幅的複函數。通常沿時間軸或兩個軸進行相位展開，τ和頻率軸，$\omega$，以抑制STFT 相位結果的任何跳躍不連續性。

這個式子其實就是Convulution的樣子，而這個公式等價於

$$F[x(\tau) \centerdot \omega(\tau-t) ] (\omega)$$

窗函數的選擇會影響其結果，如果窗函數是Rectangular，時間會比較集中，但會有leakage；如果是Hamming或是Gaussian，整體能量會比較集中，且比較平滑。

#### 離散STFT

然而在大多數情況下，你不會處理連續訊號。在離散的時間下，要轉換的資料分解成區塊，每一段進行傅立葉轉換，它的數學公式基本形式為以下式子：

$$\mathbf{STFT}\{x[n]\}(m,\omega)\equiv X(m,\omega) = \sum_{n=0}^{N-1} x[n]w[n-m]e^{-i \omega n}$$

$m$為第幾個窗口位置。對每個m乘上窗函數，再做DFT。

### 限制

#### 海森堡不確定性原理

對於任意函數$x(t)$，時間域與頻率域的能量集中程度不能同時任意小：

$$\Delta t \cdot \Delta \omega \geq {1 \over 2}$$

意思是無法同時獲得非常精細的時間和非常精細的頻率資訊，換句話說，STFT本質上是折衷，當窗越短，時間解析度高，但頻率模糊；相反地，當窗越長，頻率解析度高，但時間模糊。這也是後來產生 Wavelet Transform 或 Wigner-Ville 分布 等替代方法的原因。

### 用途

STFT應用在很多領域，如果是語音和音樂領域，有應用在語音辨識及樂譜分析，分析一首樂曲裡的和聲進行和音高變化；在醫學方面則是腦電圖（EEG）的分析和心電圖（ECG）的雜訊過濾；在工程方面，機器有時出現間歇性振動或軸承故障，而STFT 可追蹤這些不穩定震動頻率，做出預警或自動維修建議。

## 相位展開（Phase Unwrapping）

另外一個機制是相位重建，在許多訊號處理領域中（例如雷達、光學干涉儀、MRI 或合成孔徑雷達 SAR），測量的相位常常是被包裹的（wrapped）。換句話說，所量得的相位值僅限於$(- \pi , \pi]$或$[0 , 2 \pi)$，這會導致一個問題：原始訊號的連續相位會出現跳躍（phase jumps），因為超出區間的部分被模$2 \pi$回到範圍內。

### 常見解法

常見主要有三種：第一個為積分法（Path-following / Integration），按空間或時間順序比對相位差異，當差異超過 $\pi$ 就加減 $2 \pi$ 修正；第二個為最小平方法，用最佳化的方式找出最平滑的相位曲面；第三個為品質指標引導，根據相位變化平滑程度的「可信度」來選擇展開順序。

### 基礎數學定義

假設空間或時間中的真實連續相位為 $\phi(n)$，而測量儀器或反正切函數（Arctangent）計算所得到的包裹相位為 $\psi(n)$。兩者之間的數學關係可以表示為：

$$\psi(n) = \mathcal{W}\{\phi(n)\} = \phi(n) + 2\pi k(n)$$

其中，$\mathcal{W}\{\cdot\}$ 代表相位包裹算子（Wrapping operator），$k(n)$ 為未知的整數陣列，代表在該取樣點被折疊的 $2\pi$ 週期數。相位展開的最終目標，便是從已知的 $\psi(n)$ 中解算出場域中每一個點的 $k(n)$，進而還原出真實的 $\phi(n)$。

### 一維相位展開與伊藤條件（Itoh's Condition）

在一維離散訊號中，最基礎的相位展開實作依賴於計算相鄰取樣點之間的相位差（Phase gradient）。根據伊藤條件（Itoh's Condition），若真實訊號的取樣頻率足夠高（符合奈奎斯特-香農採樣定理），使得相鄰兩點的真實相位變化量絕對值小於 $\pi$：

$$|\phi(n) - \phi(n-1)| < \pi$$

則真實的相位差可以用包裹相位的差值經過包裹算子運算後來精確求得：

$$\Delta\phi(n) = \mathcal{W}\{\psi(n) - \psi(n-1)\}$$

基於此條件，一維連續相位可透過對上述相位差進行離散積分（累加）來重建：

$$\phi(n) = \phi(0) + \sum_{i=1}^{n} \mathcal{W}\{\psi(i) - \psi(i-1)\}$$

其中 $\phi(0)$ 為起始點的參考相位。

### 二維相位展開實作邏輯

在如定量相位成像（QPI）等二維影像處理中，訊號為一個二維矩陣 $\psi(x,y)$。二維相位展開比一維複雜許多，因為真實影像中常含有雜訊或相位奇異點（Phase singularities / Residues），導致沿著不同路徑進行一維積分會得到不同的結果。目前的二維實作演演算法主要分為兩大數學流派：

此類演演算法依賴於辨識影像中的奇異點（即沿著 $2 \times 2$ 像素閉迴路計算相位差總和不為零的點）。透過設置「分支切割線（Branch cuts）」（如 Goldstein 演演算法）來連接這些奇異點，並強制積分路徑避開這些切割線，從而保證空間積分的唯一性。

將相位展開視為一個最佳化問題。其目標是尋找一個連續相位矩陣 $\phi(x,y)$，使其在 $x$ 與 $y$ 方向上的偏微分（離散梯度），盡可能逼近包裹相位 $\psi(x,y)$ 所計算出的包裹梯度。這可以透過最小化以下目標函數（Objective function）來實現：

$$J(\phi) = \sum_{x}\sum_{y} \left( [\nabla_x \phi - \mathcal{W}\{\nabla_x \psi\}]^2 + [\nabla_y \phi - \mathcal{W}\{\nabla_y \psi\}]^2 \right)$$

對此函數求變分極值，可推導出二維離散卜瓦松方程式（Poisson Equation）：

$$\nabla^2 \phi(x,y) = \rho(x,y)$$

其中 $\nabla^2$ 為離散拉普拉斯算子（Discrete Laplacian），而 $\rho(x,y)$ 為由包裹相位計算出的廣義相位二階導數。在實作上，這個偏微分方程式可透過二維離散餘弦變換（2D DCT）或快速傅立葉變換（FFT）在頻域中以 $O(N \log N)$ 的高運算效率獲得全域最佳解，是現代高解析度光學影像最常用的展開手段之一。

## 時間拉伸（Time-Stretch）

指在不改變音調的情況下，對音訊檔案進行處理，使其播放速度變慢或變快的過程。時間拉伸在音樂製作中用於調整循環或樣本的節奏，或將人聲或樣本融入不同節奏的項目中。

當我們要拉長訊號（如兩倍慢放），我們會使用一個比原始 hop size 更小的合成 hop size $H_s$。假設伸長倍率為 $r = {H_s \over H_a}$，例如$r = 2$代表要伸長一倍的時間

當兩個預先錄製的片段無法重新播放或重新取樣時，這些處理通常用於匹配它們的音高和節奏，以便進行混音。時間拉伸通常用於調整廣播廣告和電視廣告的音訊，使其恰好適合30秒或60秒的時長。它也可以用於將較長的素材調整到指定的時間段，例如1小時的廣播節目。