一個 周期信號 分解為 若干個 正弦信號, 就是 傅里葉級數, 不過 我對 傅里葉級數 了解不多, 一方面 是 懶得去 細看, 一方面 也是 為了 保持 神秘感 。
我們把 一個 周期信號, 甚至 非周期信號, 記為 y = Src ( t ) , 也稱為 源信號 。
傅里葉級數 的 一般形式 可以 寫為 : Sin [ 1 ] + Sin [ 2 ] + Sin [ 3 ] + …… + Sin [ n ] , n -> 無窮
Sin [ n ] = An * sin ( ωn * t + ψn ) + bn , A 為 振幅, ω 為 角速度, t 為 時間, ψ 為 初始相位, b 為 增量, n 為 項 的 序號(下標), An 是 第 n 項 的 振幅, ωn 是 第 n 項 的 角速度, ψn 是 第 n 項 的 初始相位, bn 是 第 n 項 的 增量 。
那么, 將 y = Src ( t ) 展開 為 傅里葉級數 可以 這樣表示 :
Src ( t ) = Sin [ 1 ] + Sin [ 2 ] + Sin [ 3 ] + …… + Sin [ n ] , n -> 無窮
只要 確定了 每一項 的 A 、ω 、ψ 、b , 就 得到 源信號 對應 的 傅里葉級數 了 。
那么, 每一項 的 A 、ω 、ψ 、b 怎么 確定 ?
記 Sins ( t ) = Sin [ 1 ] + Sin [ 2 ] + Sin [ 3 ] + …… + Sin [ n ] , n -> 無窮
可以寫一個 定積分, ʃ | Src (t) - Sins (t) | dt , [ t1, t2 ] ,
[ t1, t2 ] 是 定積分 的 區間, 也是 源信號 的 區間,
| Src (t) - Sins (t) | 表示 Src (t) - Sins (t) 的 絕對值 。
我們 只要 找出 讓 ʃ | Src (t) - Sins (t) | dt , [ t1, t2 ] 這個 定積分 的 值 等於 0 的 條件 就可以了 。
就是說, 我們要 為 每一項 找到 合適 的 A 、ω 、ψ 、b , 使得 ʃ | Src (t) - Sins (t) | dt , [ t1, t2 ] = 0 。
這是一個 泛函 問題 。
ʃ | Src (t) - Sins (t) | dt , [ t1, t2 ] 這個 定積分 的 意義是 Src (t) 和 Sins (t) 的 波形 的 差異 有多大, 若 這個 定積分 為 0, 則 Src (t) 和 Sins (t) 的 波形 完全相同 。
因為 Sins (t) 是 無窮級數, 由 n 個 項 組成, n -> 無窮, 所以,
ʃ | Src (t) - Sins (t) | dt , [ t1, t2 ] = 0 (1) 式
也可以寫為 ʃ | Src (t) - Sins (t) | dt , [ t1, t2 ] -> 0 (2) 式
(1) 式 是 等於 0, (2) 式 是 趨於 0 。
(1) 式 和 (2) 式 是 一個 泛函方程, 也是 一個 積分方程 。
(1) 式 (2) 式 的 解 是 每一項 的 A 、ω 、ψ 、b, 可以 寫成 矩陣 :
A1 , ω1 , ψ1 , b1
A2 , ω2 , ψ2 , b2
A3 , ω3 , ψ3 , b3
……
An , ωn , ψn , bn
Oh …… 終於 知道 矩陣 有什么用了 ……
一般的, 泛函 的 常見問題 是 求 最小積分條件, 所以, (1) 式 (2) 式 還可以 寫成 :
ʃ | Src (t) - Sins (t) | dt , [ t1, t2 ] -> min (3) 式
表示 ʃ | Src (t) - Sins (t) | dt , [ t1, t2 ] 趨於 最小,
(3) 式 和 (1) 式 (2) 式 的 意思 差不多 。 下面 我們 就以 (1) 式 為 代表 了 。
(1) 式 這個 泛函方程 要怎么解? 不知道 。 基本上, 這種 方程 已經 達到 無從下手 的 境界 了 。
是 什么 造成了 這種 妖怪方程 ? 數學 的 抽象 。
可以 對 (1) 式 作一些 簡化, 先把 Sins (t) 簡化為 Sins (t) = A1 sin ( ω1 t ) + A2 sin ( ω2 t ) + A3 sin ( ω3 t ) + …… + An sin ( ωn t ) ,
這個簡化 忽略了 ψ 和 b 。
於是, (1) 式 變為 :
ʃ | Src (t) - [ A1 sin ( ω1 t ) + A2 sin ( ω2 t ) + A3 sin ( ω3 t ) + …… + An sin ( ωn t ) ] | dt , [ t1, t2 ] = 0
再簡化一點, 把 絕對值號 去掉,
ʃ Src (t) - [ A1 sin ( ω1 t ) + A2 sin ( ω2 t ) + A3 sin ( ω3 t ) + …… + An sin ( ωn t ) ] dt , [ t1, t2 ] = 0
積分 也 去掉 算了 ,
Src (t) - [ A1 sin ( ω1 t ) + A2 sin ( ω2 t ) + A3 sin ( ω3 t ) + …… + An sin ( ωn t ) ] = 0
A1 sin ( ω1 t ) + A2 sin ( ω2 t ) + A3 sin ( ω3 t ) + …… + An sin ( ωn t ) = Src (t)
現在 這 方程 能 解 了 嗎 ? 好像還不能, 那 把 sin ( ω1 t ) , sin ( ω2 t ) , …… sin ( ωn t ) 都 換成 常量 k1, k2, …… kn, 把 Src (t) 也換成常量 S ,
k1 A1 + k2 A2 + k3 A3 + …… kn An = S , A1 , A2, A3 , …… An 為 未知數, k1, k2, k3, …… kn 為 常數, S 為 常數 (4) 式
這個 方程 能 解 了 嗎? 可以 進一步簡化, 讓 n 為 有限大 的 自然數 ,
k1 A1 + k2 A2 + k3 A3 + …… kn An = S , A1 , A2, A3 , …… An 為 未知數, k1, k2, k3, …… kn 為 常數, S 為 常數, n 為有限大的自然數 (5) 式
(5) 式 是 一個 n 元方程, 也是一個 不定方程, 也是一個 丟番圖 方程 。
(5) 式 方程 怎么解 ? 當然 (5) 式 有 無窮多個 解, 那 比如, 求 最小解, 比如 A1 + A2 + A3 + …… + An 的 和 最小 的 解 。
(4) 式 (5) 式 和 (1) 式 有 什么關系 ? 沒有關系, 但可以 通過 (4) 式 (5) 式 類比 看看 (1) 式 要 怎么解 。
那么, 要怎么來 求 得 傅里葉級數 呢 ? 可以 想點 辦法 。
比如, 先把 問題 簡化 為 求 第一項 Sin [1] , 可以 先 求出 一個 正弦信號, 波形 和 源信號 相差 最小, 這就是 Sin [1] , 然后, 讓 源信號 減去 Sin [1] , 得到 的 差 記為 z :
z = Src (t) - Sin [1]
接下來 再 求 一個 正弦信號, 波形 和 z 相差 最小, 這就是 第二項 Sin [2] , 然后, 讓 z = z - Sin [2] , 以此類推, 求 Sin [3] , Sin [4] , …… , Sin [n] 。
先來看 怎么求 Sin [1] , 和 上文 (1) 式 的 原理 一樣, 可以 寫一個 定積分 來 表示 源信號 和 Sin [1] 的 波形 差異 大小 :
ʃ | Src (t) - Sin [1] | dt , [ t1, t2 ]
讓 這個 定積分 最小,
ʃ | Src (t) - Sin [1] | dt , [ t1, t2 ] -> min (6) 式
(6) 式 就是 求 Sin [1] 的 泛函方程 。
因為 Sin [1] = A1 sin ( ω1 t + ψ1 ) + b1 , 代入 (6) 式 ,
ʃ | Src (t) - A1 sin ( ω1 t + ψ1 ) - b1 | dt , [ t1, t2 ] -> min (7) 式
對於 一些 簡單 、規則 的 周期信號, 比如 方波, 三角波, 這些 信號 作為 源信號 的 話, 可以 不考慮 ψ1 、b1 ,
同時, 顯然, 它們 的 基波 的 周期 和 它們 一樣, 即 ω1 就是 源信號 的 ω ,
於是 (7) 式 可以 簡化 為 :
ʃ | Src (t) - A1 sin ( ω t ) | dt , [ t1, t2 ] -> min (8) 式
ω 已知, 就是 源信號 的 ω , 所以, (8) 式 中 只有一個 待定系數 A1 , 只要 求出 A1 就可以, 這樣的話, 可以試試 變分法, 看用 歐拉方程 能不能 解出來 。
但 歐拉方程 的 解 是 一個 函數, 這里 的 A1 是 一個 系數, 是 常量, 這就 尷尬 了, 呵呵呵呵 。 這兩者(函數 和 常量) 的 矛盾 能不能 調和 ? 期待 數學天才們 的 表演, 拭目以待 。
我們 可以 畫 一個 圖 把 上面 的 過程 形象 的 表示出來 :
藍色 三角波 是 源信號, 紅色 正弦波 是 基波, 也就是 傅里葉級數 的 第一項 Sin [1] , 紅線 和 藍線 之間 用 綠線 標出 的 區域 就是 兩者 波形 的 相差, 綠線 標出 的 區域 面積 大, 則 兩者波形 相差 大, 面積小, 則 波形相差小 。
綠線 標出 的 區域 面積 就是 定積分 ʃ | Src (t) - A1 sin ( ω t ) | dt , [ t1, t2 ] , (8) 式 就是 讓 這個 面積 最小 。
如圖, 在這個 場景 里, 我們 只要 確定 A1, 使得 綠線 標出 的 區域 面積 最小 就可以 。
上文 提到 可以 考慮 用 變分法, 大家 可以 自己 試試, 這里 先不討論 。 我們 看看 用 離散 線性 樣本 的 方法 。
可以 大概 給 A1 划一個 范圍, 把 這個 范圍 切割 成 9 等分, 這樣 可以 有 10 個 值, 把 這 10 個 值 代入 定積分 ʃ | Src (t) - A1 sin ( ω t ) | dt , [ t1, t2 ] , 看 哪個值 得到 的 定積分 最小, 就 取 這個 值 作為 A1, 切割 的 等分 越多, 則 結果 越 精確 。
[t1, t2] 在 這里 是 一個周期 。
當然, 對於 橫坐標 t, 在 [ t1, t2 ] 區間 里 也要 切割一些 等分 來 近似計算積分 。 假設 [ t1, t2 ] 切割了 100 個 等分, 乘上 A1 的 10 個 值, 計算 的 時間復雜度 就是 10 * 1000 = 1 萬 。
這個方法 對於 一般 的 源信號, 也許 有 不錯 的 近似 效果 。 但是 對於 一些 源信號, 比如 突變性 的, 就 不適用 了 。
比如, 上圖 藍色 的 源信號, 突變 很明顯 , 合成 它 的 基波 和 諧波, 大概 要 像 圖上 這樣 比較合適 。
紅色 是 基波, 也就是 傅里葉級數 第一項, 橙色 是 一個 諧波, 它的 頻率 是 基波 的 3 倍, 可以 認為 是 傅里葉級數 的 第三項 。
顯然, 基波 和 源信號 的 波形 差異 並不是 最小, 甚至 還 有點 大 。 從這里看出, 構造 傅里葉級數 需要一些 “總攬全局” 的 規划 。
又或者說, 上面 一開始 提出 的 一項 一項 求 的 方法, 割裂了 傅里葉級數 的 “整體性” 。
如果 把 傅里葉級數 的 所有項 放到一起來 考慮, 可以 簡化一點, 讓 n 等於一個 有限的 不太大的 自然數, 比如 n = 5, 這樣就是 由 5 個 正弦信號 來 組成 源信號 。
5 個 正弦信號 寫成 矩陣 :
A1 , ω1 , ψ1 , b1
A2 , ω2 , ψ2 , b2
A3 , ω3 , ψ3 , b3
A4 , ω4 , ψ4 , b4
A5 , ω5 , ψ5 , b5
每個 正弦信號 的 A , ω , ψ , b 均 取 10 個值, 這樣來匹配, 則 每個 正弦信號 會 產生出 10^4 = 1 萬 個 樣本,
有 5 個 正弦信號, 5 個 正弦信號 的 樣本 在一起 匹配, 會 產生出 ( 1 萬 ) ^ 5 = 10^20 個 樣本,
10^20 個 樣本 中 波形 和 源信號 差異 最小 的 那個 樣本 就是 最優解 。
10 ^ 20 , 這個 計算量 太大 了 , 可以簡化一點, 讓 ω 固定, 5 個 正弦信號 的 ω 依次為 ω , ω * 2 , ω * 3 , ω * 4 , ω * 5 , 忽略 b 。
這樣 寫成 矩陣 :
A1 , ω , ψ1
A2 , 2 * ω , ψ2
A3 , 3 * ω , ψ3
A4 , 4 * ω , ψ4
A5 , 5 * ω , ψ5
因為 ω 是 固定 的, 每個 正弦信號 參與 取值 匹配 的 只有 A 、ψ, 所以, 每個 正弦信號 的 樣本 是 10^2 = 100 個 ,
5 個 正弦信號 組合匹配 產生 的 樣本 是 100 ^ 5 = 10^10 = 100 億 個 。
這個 計算量 還是 太大, 呵呵 。 所以 這個 算法 似乎 有點 不科學, 也有點 白痴, 哈哈 。
到目前為止, 這個 算法 處理的, 是 簡單信號 (Simple and Pure) , 簡單信號 是指 波形 單一 、特點明顯 的 周期信號, 常見 的 人造信號 很多是 簡單信號, 比如 方波 、三角波 、梯形波 , 等等 。
簡單信號 比較 容易 進行 傅里葉級數 分解 。
自然界 中 的 信號 大多 是 復雜的, 具有 復雜 和 多樣 的 波形, 即使 有 周期性, 但 也不是 一成不變 的 。
自然界 中 的 信號 比如 自然界 中 的 聲音, 人聲 、動物的聲音 、樂器的聲音, 以及 自然界 中 的 各種聲音 。
以 聲音信號 為例, 波形 表示 音色 和 音質 , 還傳達着信息, 人類語言 、動植物的聲音 、大自然的聲音 都 傳達 着 各種各樣 的 信息 。
我們來看一個 聲音信號, 這個 聲音信號 是 我 假想 的 。
可以 把 這個 信號 分為 3 個 信號, 也是 3 個 分量 :
分量 1 :
分量 2 :
分量 3 :
分量 1 的 頻率 和 源信號 一樣, 音調(音高) 聽起來 大概 和 源信號 一樣, 但 脈沖寬度窄, 這表示 脈沖本身的 頻率高, 所以, 音色 中 帶有 尖銳 的 特質 。 另外, 脈沖寬度窄 也 意味着 振動 能量 小, 所以, 聽起來 會 比較 弱小 、細小, 總的來說, 聽起來 是一個 尖細 的 聲音 。
分量 1 合成到 源信號 中, 會 讓 源信號 的 音色 聽起來 更豐富 。
我感覺, 分量 1 聽起來 是 “嘀 -” , 分量 2 聽起來 是 “嘟 -” , 分量 3 聽起來 是 “咚 -” 。 哎 ? 怎么 都是 聲母 D 開頭 的 ?
上面 3 個 分量 都是 簡單信號, 這樣 的 分量 稱為 頻域 的 自然分量, 簡稱 自然分量, 又名 特征分量 。 將 信號 分解 為 自然分量 的 方法 稱為 自然分解法, 又名 特征分解法 。
自然分量 和 傅里葉級數 不一樣, 傅里葉級數 是 一組 正弦函數, 且 每一個 正弦函數 的 頻率 是 指定 的 。
自然分量 不是 傅里葉級數 。
要把 自然界 的 信號 分解 為 傅里葉級數 並不容易, 首先一個 問題 就是 基波 的 頻率 是多少? 怎么確定 ?
自然界 的 信號 通常 是 分解為 自然分量 來 進行 分析, 以 聲音信號 為例, 比如 測量 音調(音高), 分離出 基因 泛音, 聲紋識別 、語音識別 、各種廣義的聲音識別 和 聲音特征分析 。
自然界 的 信號 分解 為 傅里葉級數 反而 會 丟失 原始 的 特征信息 。
也許, 通常, 傅里葉級數 只適合於 分解 簡單信號 。
將 自然界 的 信號 分解為 自然分量, 自然分量 是 簡單信號, 可以 進一步 分解為 傅里葉級數 。
當然, 自然界 的 信號 不是 絕對規則的, 分解 得到 的 自然分量 的 每個周期 的 波形 和 周期 也不一定 完全一樣, 可以 近似等價 為 每個周期 都一樣 的 規則的 、理想的 簡單信號, 再 分解 為 傅里葉級數 。
也可以 單獨 取 一個 周期 的 波形 來 分解 為 傅里葉級數, 當然 也可以取 任意 一段 波形 來 分解 為 傅里葉級數 。
也可以 將 任意 一段波形 當作 一個 周期 來 分解 為 傅里葉級數, 就像 對於 非周期信號, 將 整個信號 的 定義域 作為 一個 周期 。
自然界 的 聲音信號 , 可以 通過 特征分解法 分離 出 一組 自然分量, 這組 分量 中, 振幅 明顯 大於 其它 分量 的 那個 分量 稱為 基音, 其它 的 分量 稱為 泛音 。
一個 聲音 的 音調 由 基音 決定, 基音 的 音調 代表 聲音 的 音調 。 泛音 的 音調 讓 聲音 聽起來 層次豐富 。
如果 一個 聲音信號 的 分量 中, 有 2 個 分量 的 振幅 不相上下, 彼此 沒有 明顯優勢, 那么, 這可能是 2 個 聲源 的 聲音, 也有可能是 一個 聲源 發出了 頻率 不同 的 2 個 聲音 混在一起 , 這 2 個 分量 可以認為 是 2 個 聲音 的 基音 。
但 事情 比這 復雜, 那 2 個 聲音 各自 的 泛音 要 怎么 區分, 怎么 找出來 呢 ?
這就 涉及 到 聲音識別 的 問題 了, 這 涉及 到 機器識別 , 或者說 人工智能 。 比如 人類 , 或者 動物 可以 在 一堆 聲音 里 識別 出 不同 聲源 發出 的 聲音, 可以 同時 區分 出 不同的 人 說話, 樂器, 以及 各種聲音 。
這涉及到 特征識別 、特征提取, 這涉及到 人工智能 和 仿生學 。
為什么說 仿生學 呢 ? 因為 生物 有一套 “程序” 來 區分 和 提取 出 聲音信號 中 的 各種聲音 。
又比如, 一群 蝙蝠 在一起, 並不會 把 其它 蝙蝠 的 超聲波 和 自己 發出 的 超聲波 混淆起來 。
要 怎樣 用 特征分解法 來 將 信號 分解為 自然分量 ? 可以看看 《卷積 毫無意義》 https://www.cnblogs.com/KSongKing/p/12839957.html 。
第一次 掃描 分離出 的, 是 頻率 最高 的 分量, 甚至是一些 噪點,
第二次 掃描 分離出 的, 是 頻率 第二高 的 分量,
第三次 掃描 分離出 的, 是 頻率 第三高 的 分量,
……
最后一次 掃描 分離出 的, 是 頻率 最低 的 分量 。
說到這里, 會想到, 有時候, 特征點 和 噪點 僅 一紙之隔 。
我寫了一個 演示程序, 可以把 幾個 正弦信號 合成為一個 合成信號 。 可以作為 學習測試 工具 。
程序 是 用 Html 5 + javascript 寫的, 項目地址 : https://github.com/kelin-xycs/FourierStudy 。
進入 項目頁面 后, 點擊 右邊 的 “Clone or download” 綠色按鈕, 就可以 下載 項目 了 。
項目 里 的 程序文件 是 一個 Html 文件 SinesCompose.html , 用 瀏覽器 打開 就可以運行 。
2020-05-29 補充 :
上文 有 這樣一段話 :
“
ω 已知, 就是 源信號 的 ω , 所以, (8) 式 中 只有一個 待定系數 A1 , 只要 求出 A1 就可以, 這樣的話, 可以試試 變分法, 看用 歐拉方程 能不能 解出來 。
但 歐拉方程 的 解 是 一個 函數, 這里 的 A1 是 一個 系數, 是 常量, 這就 尷尬 了, 呵呵呵呵 。 這兩者(函數 和 常量) 的 矛盾 能不能 調和 ? 期待 數學天才們 的 表演, 拭目以待 。
”
其實不是這么回事 。 求 A1 是 一個 函數極值問題, 不需要用到 歐拉-拉格朗日 方程 。
可以 先 把 (8) 式 里 的 定積分, 也就是 ʃ | Src (t) - A1 sin ( ω t ) | dt , [ t1, t2 ] 這個 定積分 的 表達式 求出來(如果能求出來的話), 怎么求呢 ? 先求 ʃ | Src (t) - A1 sin ( ω t ) | dt 這個 不定積分 的 表達式(如果能求出來的話), 代入 t1, t2 求 不定積分 的 差 就是 定積分, 把 定積分 記為 y = D ( A1 ) , 即 把 定積分 看作 A1 的 函數, 求 y = D ( A1 ) 的 極值, 或者說 求 y = D ( A1 ) 的 極值條件, 即 A1 = ? 時, D ( A1 ) 取 極值 。
D ( A1 ) 取 最小值 時 的 A1 , 就是 要求 的 A1 。
極值 怎么求 ? 函數極值 出現在 極值點 和 折點 。
極值點 是 導數 為 0 的 點, 且 點 的 兩邊 的 導數 異號 。
折點 是 導數 為 無窮, 但 函數值 不是 無窮, 且 點 的 兩邊 的 導數 異號 的 點 。 折點 也可以 稱為 不光滑極值點 。
還有一種情況 是 單邊折點, 單邊折點 是 導數 為 無窮, 函數值 不是 無窮, 且 只在 點 的一邊 有 函數, 另一邊 沒有 函數 的 點 。
比如, y = 根號 ( x ) , 當 x = 0 時, y = 0 , y ′ = 無窮 , 當 x >= 0 時, y 存在, 當 x < 0 時, y 不存在 。
所以, x = 0 是 y = 根號 ( x ) 的 單邊折點 。