一個 周期信號 分解為 若干個 正弦信號


一個 周期信號 分解為 若干個 正弦信號,   就是 傅里葉級數,  不過 我對 傅里葉級數 了解不多,  一方面 是 懶得去 細看, 一方面 也是 為了 保持 神秘感 。

 

我們把  一個 周期信號, 甚至 非周期信號,   記為   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 )   的   單邊折點  。

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM