信號(hào)時(shí)間采樣
近期在信號(hào)與系統(tǒng)課程中講完了“信號(hào)的采樣與恢復(fù)”的內(nèi)容。通常情況下對(duì)于信號(hào)的采樣都是沿著時(shí)間軸對(duì)信號(hào)的幅值進(jìn)行采樣,獲得信號(hào)的離散時(shí)間點(diǎn)上的數(shù)據(jù)。
如果將信號(hào) 的波形繪制在直接坐標(biāo)系中,那么該曲線(xiàn)就是分布在二維空間上的曲線(xiàn)。曲線(xiàn)上的點(diǎn)可以沿著時(shí)間 軸進(jìn)行排列,當(dāng)然也可以按照幅值 的大小進(jìn)行排列。也就是按照取值間隔,將信號(hào)通過(guò)該間隔的時(shí)間進(jìn)行保存,這就是對(duì)信號(hào)的時(shí)間采樣。
沿著時(shí)間軸對(duì)信號(hào)的幅值進(jìn)行采樣,Nyquist-Shannon定理告訴我們?nèi)绾芜M(jìn)行采樣和如何進(jìn)行信號(hào)恢復(fù)。但是,如何對(duì)信號(hào)時(shí)間進(jìn)行采樣,如何恢復(fù)是一個(gè)經(jīng)典的未解決問(wèn)題。
Logan定理[Logan,Jr.,1977]對(duì)一種特殊信號(hào)給出了采樣與恢復(fù)的描述:如果一個(gè)信號(hào)的頻譜具有倍頻的性質(zhì),即信號(hào)頻譜分布在一個(gè)頻率范圍內(nèi),最高頻率是最低頻率的兩倍。那么這個(gè)信號(hào)可以通過(guò)它的過(guò)零點(diǎn)的時(shí)間值進(jìn)行恢復(fù)?;謴?fù)的信號(hào)與原始信號(hào)僅僅相差一個(gè)比例因子。
信號(hào)采樣與恢復(fù)
1. 幅度采樣
下面是一段普通語(yǔ)音信號(hào)的復(fù)制采樣波形。通過(guò)簡(jiǎn)單的DA轉(zhuǎn)換和低通濾波便可以恢復(fù)出原始的聲音波形。
2. 時(shí)間采樣
如果僅僅保留該信號(hào)的過(guò)零時(shí)間點(diǎn)的信息,它的幅值全部去掉,所形成的波形大體上如下圖所示。這很像將原來(lái)的語(yǔ)音信號(hào)通過(guò)一個(gè)過(guò)零點(diǎn)比較器,輸出的信號(hào)反映了信號(hào)的極性。
▲ 聲音信號(hào)過(guò)零點(diǎn)采樣
當(dāng)然,這個(gè)信號(hào)中包含有原來(lái)信號(hào)的部分信息。但它并不是原來(lái)語(yǔ)音信號(hào)的完美的回復(fù)。
盡管如此,播放這個(gè)信號(hào),還是可以聽(tīng)到原來(lái)語(yǔ)音的信息。雖然有很大的失真和噪聲。這說(shuō)明原來(lái)的信號(hào)信息還是部分保留在這些過(guò)零點(diǎn)中。
經(jīng)過(guò)比較器之后的語(yǔ)音信號(hào)為:
如果語(yǔ)音信號(hào)滿(mǎn)足Logan定理的要求,那么理論上是可以恢復(fù)出原來(lái)的信號(hào)的。但如何來(lái)恢復(fù)?
如果信號(hào)本身是一個(gè)周期信號(hào),也就是信號(hào)的頻譜是離散的頻譜。相對(duì)回復(fù)信號(hào)的算法比較簡(jiǎn)單。Sam Roweis等人在論文“Signal Reconstruction from Zero-Crossings"中給出了通過(guò)求解數(shù)據(jù)矩陣零空間向量的方法,來(lái)通過(guò)信號(hào)的過(guò)零時(shí)間點(diǎn)來(lái)重構(gòu)信號(hào)的方法。
重建算法
1. 基本原理
已知到信號(hào) 具有倍頻窄帶頻譜,它的頻率范圍分布在 范圍內(nèi)。
已知信號(hào)的周期 , ,以及 個(gè)信號(hào)過(guò)零點(diǎn):
重構(gòu)信號(hào)的計(jì)算步驟如下:
(1)計(jì)算相關(guān)參數(shù): 以及 ;
(2)構(gòu)造矩陣: ;
(3)尋找數(shù)據(jù)矩陣零空間向量:構(gòu)造數(shù)據(jù)矩陣 ,矩陣大小是 。對(duì)該矩陣進(jìn)行奇異值分解,得到 。其中 是 空間上的正交矩陣, 是 空間上的正交矩陣。 是奇異值向量,長(zhǎng)度為 。
零空間向量是奇異值向量 中最?。ɡ碚撋蠎?yīng)該為0,但由于計(jì)算誤差的存在,它可能是一個(gè)很小的數(shù))對(duì)應(yīng)的 中的向量,由于SVD算法往往把結(jié)果 按照絕對(duì)值從大到小排列,所以 的最后一個(gè)向量就對(duì)應(yīng)著數(shù)據(jù)矩陣的零空間向量。
(4)構(gòu)造信號(hào)函數(shù):將數(shù)據(jù)空間矩陣中零空間向量前 個(gè)數(shù)值當(dāng)做 ,后 個(gè)數(shù)值當(dāng)做 ,重建信號(hào)公式為:
這種回復(fù)信號(hào)的過(guò)程,實(shí)際上就是根據(jù)信號(hào)的過(guò)零點(diǎn)來(lái)求解上面的函數(shù)中的參數(shù)。具體的理論分析在這里就不再展開(kāi)了。
2. 測(cè)試函數(shù)
(1)實(shí)驗(yàn)信號(hào)的數(shù)學(xué)表達(dá)式:
選擇一個(gè)頻率分布在10Hz到20Hz之間的一個(gè)信號(hào)進(jìn)行實(shí)驗(yàn),隨機(jī)指定對(duì)應(yīng)的cos,sin信號(hào)的系數(shù),如下:
這是一個(gè)周期為1的倍頻信號(hào)。
(2)信號(hào)的產(chǎn)生Python程序:
使用下面python程序,可以產(chǎn)生該信號(hào)的數(shù)據(jù)。也可以通過(guò)該函數(shù)完搜索信號(hào)的過(guò)零點(diǎn)。
def sfunc1(x):
pi2 = 2 * pi
retdata = cos(pi2*11*x) + sin(pi2*11*x)/2 + \
cos(pi2*12*x)/33 + sin(pi2*12*x)/4 + \
cos(pi2*13*x) + sin(pi2*13*x)/8 + \
cos(pi2*14*x) + sin(pi2*14*x)/7 + \
cos(pi2*15*x)/22 + sin(pi2*15*x)/3 +\
cos(pi2*16*x) + sin(pi2*16*x)/12 +\
cos(pi2*17*x) + sin(pi2*17*x)/40 +\
cos(pi2*18*x) + sin(pi2*18*x)/2 +\
cos(pi2*19*x)/3 + sin(pi2*19*x)/2
return retdata
(3)實(shí)驗(yàn)信號(hào)的波形:
下面繪制出0~2秒兩個(gè)周期內(nèi)的波形。
繪制該信號(hào)的過(guò)零點(diǎn)飽和信號(hào),它僅僅保留了該信號(hào)的過(guò)零點(diǎn)的時(shí)間和相位信息。計(jì)算公式為:
(4)信號(hào)的過(guò)零點(diǎn):
通過(guò)數(shù)值計(jì)算,來(lái)獲得信號(hào)的過(guò)零點(diǎn)。下面重新繪制出信號(hào)一個(gè)周期內(nèi)的波形,沒(méi)有添加任何噪聲。
通過(guò)對(duì)區(qū)間(0,1)采集10^6^個(gè)數(shù)值,然后通過(guò)尋找過(guò)零點(diǎn),獲得二十八個(gè)信號(hào)的過(guò)零點(diǎn)的值。
搜尋函數(shù)值過(guò)零點(diǎn)的python程序如下crosszero(t,val)。其中 是函數(shù)的自變量, 是函數(shù)值的采樣。函數(shù)返回是對(duì)應(yīng)函數(shù)過(guò)零點(diǎn)時(shí)的 的數(shù)值。
def crosszero(t, val):
valsign = sign(val)
valsignchange = [int(x!=y) for x,y in zip(valsign[0:-1],valsign[1:])]
tvalue = [(x,y) for x,y in zip(t[0:-1], valsignchange)]
zerot = filter(lambda t: t[1]!= 0, tvalue)
return [zt[0] for zt in zerot]
通過(guò)scipy.optimize.root來(lái)尋找信號(hào)的根,用于確定信號(hào)的過(guò)零點(diǎn)。利用上面搜索的結(jié)果作為初始值。
sol = scipy.optimize.root(tssub.sfunc1, czt, method='lm')
-
tssub.sfunc1:定義的信號(hào)函數(shù); -
czt:是前面通過(guò)數(shù)值過(guò)零點(diǎn)搜索獲得的28個(gè)根的數(shù)值;
如下是sol['x']中的數(shù)值,包含了最終優(yōu)化后的數(shù)值,對(duì)比前面通過(guò)搜索獲得數(shù)值,可以看到基本上在10^-6^的內(nèi)存在一定的誤差。
將通過(guò)數(shù)值計(jì)算所得到的28個(gè)函數(shù)的根繪制在信號(hào)波形上,看到他們的分布。
3. 重建結(jié)果
根據(jù)前面所敘述的方法,使用28個(gè)過(guò)零點(diǎn)信息重構(gòu)出的信號(hào)波形如下圖所示。重構(gòu)的信號(hào)與原始的信號(hào)之間波形基本一致,只是相差了一個(gè)比例因子。
前面實(shí)驗(yàn)中的程序和數(shù)據(jù)可以在CSDN博文中看到。
http://zhuoqing.blog.csdn/net
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀(guān)點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!