數(shù)學(xué)實現(xiàn)信號分析 [real]: 信號過濾和壓縮

在計算機中, 幾乎所有信號都是離散信號, 所有對應(yīng)應(yīng)該使用離散傅里葉變換DFT, DFT和其快速算法FFT已經(jīng)在之前講述過了, 這里不再重復(fù)


在正篇開始前應(yīng)該了解一下傅里葉變換的兩個臭名昭著的效應(yīng)

循環(huán)位移
在計算機里, 數(shù)列第一個元素的索引為0, 而傅里葉變換的頻率變換范圍是取整個實數(shù)域, 那么負數(shù)部分的頻率在離散傅里葉變換后是丟失了嗎??
我們來看看 sin(20t), 范圍 [0, 2), 總?cè)狱c50? 的離散傅里葉變換? ?這個時候頻率就約等于3.18

我們可以看到一個很奇怪的現(xiàn)象, 下面圖像的右邊出現(xiàn)了一個不屬于頻率為3.18的尖峰
如果我們從中間截斷, 并把右邊移動到左邊, 得到:

而這個新圖像對應(yīng)的就是傅里葉變換
所以循環(huán)位移可以這樣理解:?一個有限數(shù)列經(jīng)過非零的位移后, 有部分數(shù)據(jù)消失在位移方向外 (即被移動出數(shù)列之外了),? 那么這部分數(shù)據(jù)會再次出現(xiàn)在與消失方向相反的地方??***
在之前發(fā)過的傅里葉小技巧里也有提到過這個效應(yīng)

***? 如果真的想要糾結(jié)為什么會出現(xiàn)這個效應(yīng)的話, 這里有一些小提示:? 離散傅里葉變換實際上與傅里葉級數(shù)的關(guān)系比較密切, 而傅里葉級數(shù)就是對有限區(qū)間的已知函數(shù)作正弦余弦展開,? 而正弦余弦的出現(xiàn)也就代表著在已知區(qū)間外會形成周期性信號, 而位移對應(yīng)只是改變了正弦余弦的相位, 那么在已知區(qū)間就會出現(xiàn)原本在區(qū)間外的信號了

Gibbs現(xiàn)象
gibbs現(xiàn)象是在傅里葉級數(shù)中出現(xiàn)的,? 首先來思考一個問題: 連續(xù)光滑的正弦函數(shù)真的可以通過傅里葉級數(shù)得到不連續(xù)的函數(shù)嗎
我們來研究一個函數(shù)? f(t) = {t<0:-1, else: 1}

然后逐項作傅里葉級數(shù)展開

可以看到虹色圈的部分確實有隨著級數(shù)的展開而逐漸收斂到原函數(shù)中
但是綠色圈部分(即間斷點處)可以看出并沒有收斂的跡象, 只不過是跳起來的地方越來越靠近間斷點罷了, Gibbs發(fā)現(xiàn), 當(dāng)級數(shù)展開非常大之后, 跳起來的值約等于間斷處差的9%, 當(dāng)無限展開后, 跳起來的地方被壓縮到間斷點這一個點
浪費了827字, 正片開始

信號濾波
實際測量得到的信號總會因為設(shè)備干擾或者外界影響造成在信號里有很高頻率的噪聲混雜在里面, 那么有沒有辦法把高頻分量過濾掉呢
1. 對信號取傅里葉變換,? 2.把高頻率的分量設(shè)置為0,? 3.取傅里葉逆變換得到濾波信號
例子: 這里有一個信號, 里面混雜著高頻的噪聲

傅里葉變換后把頻率大于5的分量設(shè)置為0,? ?注意循環(huán)位移效應(yīng), 在數(shù)列末端的也是低頻分量

取逆變換得到新信號, 與原信號作比較

上述過程用蛇實現(xiàn):


信號壓縮
經(jīng)常在測量信號時, 測量速度會遠遠超過某些地方的數(shù)據(jù)包傳輸速度, 為了實時傳輸整個信號, 我們必須對這個信號作有損失的壓縮, 主要實現(xiàn)思路:
1.取傅里葉變換,? 2.把比較小的大部分分量設(shè)置為0,? 3.只傳輸不為0的分量,? 4.接收分量并進行傅里葉逆變換得到壓縮后的信號
例子:

把比較小的80%分量設(shè)置為0

進行傅里葉逆變換, 注意此處出現(xiàn)了gibbs現(xiàn)象

采用這種辦法, 如果壓縮率為90%, 那么只需要傳輸原數(shù)據(jù)長度的10%數(shù)據(jù)就可以得到足夠近似的壓縮信號了


信號卷積
離散信號進行卷積的過程, 計算速度非常非常慢 (特別是py的單線程 當(dāng)然, 利用多線程和numba等gpu加速可以做到很快的計算速度, 不過眾所周知numba的一個永遠裝不上的東西), 對于無限離散序列, 卷積的定義如下

而對于有限序列的卷積還要考慮是否有循環(huán)位移, 是否取序列相交范圍等復(fù)雜的情況
幸好這里有一個非??旖莸膽腥诉m配方法:? ?假如信號序列, 卷積核序列和輸出序列一樣長度, 且可以忽略傅里葉變換帶來的一點gibbs現(xiàn)象的話, 那么:

α是一個我還沒摸清頭腦的常數(shù), 應(yīng)該是與序列長度有關(guān), 但是我不太清楚? ?在這篇專欄提交前我找到了一個數(shù)字能很好地擬合實際情況,? 這個數(shù)字的值是?α=π/N? N是序列長度
例子: 一個帶高頻噪聲的信號, 和一個非常非常早期的濾波核函數(shù)可以得到以下圖像

注意到傅里葉的gibbs現(xiàn)象和卷積濾波器的滯后現(xiàn)象

傅里葉的那么多應(yīng)用里面, 我覺得最被人熟悉的應(yīng)該就是變聲器了 (笑
那么問題來了, 這個數(shù)學(xué)實現(xiàn)信號分析完了嗎
也許沒有, 但是也許已經(jīng)完了, 說不定我以后又發(fā)現(xiàn)上面奇奇怪怪的東西可以分享給大家呢?
代碼的度盤連接:?https://pan.baidu.com/s/18OCOBWIxXYJevEDEqdqIaA