傅里叶变换中的狄利克雷条件
簡(jiǎn) 介: 對(duì)于傅里葉變換,傅里葉級(jí)數(shù)分解中存在的狄利克雷條件進(jìn)行實(shí)驗(yàn)展示,說明這些條件是如何影響信號(hào)的傅里葉變換結(jié)果的。
關(guān)鍵詞: 傅里葉變換,FFT,狄利克雷條件
?
??傅里葉在提出傅里葉級(jí)數(shù)時(shí)堅(jiān)持認(rèn)為,任何一個(gè)周期信號(hào)都可以展開成傅里葉級(jí)數(shù),雖然這個(gè)結(jié)論在當(dāng)時(shí)引起許多爭(zhēng)議,但持異議者卻不能給出有力的不同論據(jù)。直到20年后(1829年)狄利克雷才對(duì)這個(gè)問題作出了令人信服的回答,狄利克雷認(rèn)為,只有在滿足一定條件時(shí),周期信號(hào)才能展開成傅里葉級(jí)數(shù)。這個(gè)條件被稱為 狄利克雷條件(Dirichlet Condition) 。
??下面對(duì)于經(jīng)常看到的不符合Dirichlet條件的波形,通過FFT來研究使用部分它的系數(shù)來合成對(duì)應(yīng)的信號(hào)時(shí),隨著系數(shù)的增加,合成波形的變化規(guī)律。
1.有限個(gè)間斷點(diǎn)
??定一個(gè)在(0,1)\left( {0,1} \right)(0,1)之內(nèi)具有無限間斷點(diǎn)的函數(shù)。從0到1之間每前進(jìn)當(dāng)前剩余區(qū)間一半的時(shí)候,函數(shù)值就降低一倍。

??根據(jù)上面的表達(dá)式可以繪制出對(duì)應(yīng)的函數(shù),如下圖所示。這個(gè)函數(shù)具有無窮多個(gè)間斷點(diǎn),它的面積為:
∫01f(t)dt=12∑n=0∞14n=12?11?1/4=23\int_0^1 {f\left( t \right)dt} = {1 \over 2}\sum\limits_{n = 0}^\infty {{1 \over {4^n }} = {1 \over 2} \cdot {1 \over {1 - 1/4}} = {2 \over 3}}∫01?f(t)dt=21?n=0∑∞?4n1?=21??1?1/41?=32?
▲ f(t)一個(gè)周期內(nèi)的波形
#------------------------------------------------------------
def setfv(t):tn = len(t)f = zeros(tn)for i in range(20):v = 2**(-i)startn = int(tn - v*tn)f[startn:] = vreturn f
#------------------------------------------------------------
t = linspace(0, 1, 100000)
data = setfv(t)
plt.plot(t, data)
plt.xlabel("t")
plt.ylabel("f(t)")
plt.grid(True)
plt.tight_layout()
plt.show()
??將信號(hào)抽取100000數(shù)據(jù),利用FFT計(jì)算對(duì)應(yīng)的離散傅里葉系數(shù)。下面繪制出前面200個(gè)系數(shù)的幅值。可以看到該信號(hào)的頻譜幅度隨著n增加迅速降低到0。
▲ 信號(hào)f(t)的FFT前200個(gè)系數(shù)的幅值
??下面給出了利用信號(hào)f(t)的前1~200個(gè)系數(shù)合成信號(hào)的過程。可以看到信號(hào)在間斷點(diǎn)處出現(xiàn)Gibbs過沖現(xiàn)象。但是誤差信號(hào)還是隨著n增加逐步能量降低。
▲ 使用前200個(gè)系數(shù)合成信號(hào)波形
▲ 使用前2000個(gè)系數(shù)合成信號(hào)波形
▲ 使用前20000個(gè)系數(shù)合成信號(hào)波形
2.無限個(gè)極值
??下面表達(dá)式給出了一個(gè)在周期(0,1)\left( {0,1} \right)(0,1)內(nèi)的具有無限多個(gè)極大值,極小值的函數(shù):
f1(t)=sin?(πt),t∈(0,1)f_1 \left( t \right) = \sin \left( {{\pi \over t}} \right),\,\,t \in \left( {0,1} \right)f1?(t)=sin(tπ?),t∈(0,1)
▲ 函數(shù)sin(pi/t)的信號(hào)波形
??對(duì)這個(gè)函數(shù)進(jìn)行離散傅里葉變換(DFT),從0.0001~1之間采集10510^5105個(gè)數(shù)據(jù)的,利用FFT計(jì)算DFT的系數(shù),下圖繪制了前200個(gè)系數(shù)的幅值。可以看到它的頻率迅速衰減到0。如果jd計(jì)算后的系數(shù)重新進(jìn)行逆運(yùn)算,合成后的波形就會(huì)與原來信號(hào)保持一致。
▲ sin(pi/t)DFT前200個(gè)系數(shù)幅值
▲ 使用100000000采樣后計(jì)算的DFT系數(shù)
t = linspace(0.0000000001, 1, 100000000)
data = sin(1/t*pi)
fftdata = fft.fft(data)plt.plot(abs(fftdata[:20000]))
plt.xlabel("k")
plt.ylabel("abs(fft(data))")
plt.grid(True)
plt.tight_layout()
plt.show()
??下面分別使用sin(1/t)DFT前面若干系數(shù)來合成對(duì)應(yīng)的波形。
fN(t)=real{IFFT[X[m:?m]]}f_N \left( t \right) = real\left\{ {IFFT\left[ {X\left[ {m: - m} \right]} \right]} \right\}fN?(t)=real{IFFT[X[m:?m]]}
??下圖顯示了合成系數(shù)的個(gè)數(shù)分別從1演變到300過程中,合成信號(hào)波形的變化。毫不夸張的說,這個(gè)波形與sin(1/t)之間幾乎毫無關(guān)系。
▲ 使用sin(pi/t)DFT前200個(gè)系數(shù)合成信號(hào)的波形演變過程
??如果將合成系數(shù)的數(shù)量增加10倍,合成之后的波形在左邊的高頻波形逐步豐富 ,在右端則會(huì)出現(xiàn)越來越高的尖峰。
▲ 使用sin(pi/t)DFT前2000個(gè)系數(shù)合成信號(hào)的波形演變過程
▲ 使用sin(pi/t)DFT前30000個(gè)系數(shù)合成信號(hào)的波形演變過程
3.絕對(duì)可積
??下圖是在(0,1)\left( {0,1} \right)(0,1)之間函數(shù):f(t)=1tf\left( t \right) = {1 \over t}f(t)=t1?
??它的面積為無窮大。但是信號(hào)的能量為:
Ef=∫01f2(t)dt=∫011t2dt=?1t∣0∞=∞E_f = \int_0^1 {f^2 \left( t \right)dt} = \int_0^1 {{1 \over {t^2 }}dt} = \left. { - {1 \over t}} \right|_0^\infty = \inftyEf?=∫01?f2(t)dt=∫01?t21?dt=?t1?∣∣∣∣?0∞?=∞
▲ 信號(hào)f(t)在0~1之間的波形
??下面使用信號(hào)的FFT前20000項(xiàng)系數(shù)合成信號(hào),隨著n增加合成信號(hào)的變化過程。
▲ 使用信號(hào)的FFT前20000個(gè)系數(shù)重新合成信號(hào)
?
▌附件
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2021-03-23
#
# Note:
#============================================================from headm import *#------------------------------------------------------------def setfv(t):tn = len(t)f = zeros(tn)for i in range(20):v = 2**(-i)startn = int(tn - v*tn)f[startn:] = vreturn f#------------------------------------------------------------
t = linspace(0.0001, 1, 100000)
data = 1/t**2#------------------------------------------------------------#area = sum(data)/len(data)
#printf(area)'''
m = 100plt.draw()
plt.pause(.25)pltgif = PlotGIF()for i in range(200):startm = m * (i+1)dataf = fft.fft(data)dataf[startm:-startm] = 0plt.clf()plt.plot(t, real(fft.ifft(dataf)))plt.xlabel("t")plt.ylabel("ifft(data)")plt.grid(True)plt.title('n = %d'%startm)plt.tight_layout()plt.axis([0, 1, 0, 20])plt.draw()plt.pause(.01)pltgif.append(plt)pltgif.save(r'd:\temp\1.gif')
printf('\a')'''
#------------------------------------------------------------'''datafft = fft.fft(data)plt.plot(abs(datafft[:200]))
plt.xlabel("k")
plt.ylabel("abs(fft(data))")
plt.grid(True)
plt.tight_layout()
plt.show()'''
#------------------------------------------------------------plt.plot(t, data)
plt.xlabel("t")
plt.ylabel("f(t)")
plt.grid(True)
plt.axis([0, 1, 0, 20])
plt.tight_layout()
plt.show()#------------------------------------------------------------#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
■ 相關(guān)文獻(xiàn)鏈接:
- 狄利克雷條件(Dirichlet Condition)
● 相關(guān)圖表鏈接:
- f(t)一個(gè)周期內(nèi)的波形
- 信號(hào)f(t)的FFT前200個(gè)系數(shù)的幅值
- 使用前200個(gè)系數(shù)合成信號(hào)波形
- 使用前2000個(gè)系數(shù)合成信號(hào)波形
- 使用前20000個(gè)系數(shù)合成信號(hào)波形
- 函數(shù)sin(pi/t)的信號(hào)波形
- sin(pi/t)DFT前200個(gè)系數(shù)幅值
- 使用100000000采樣后計(jì)算的DFT系數(shù)
- 使用sin(pi/t)DFT前200個(gè)系數(shù)合成信號(hào)的波形演變過程
- 使用sin(pi/t)DFT前2000個(gè)系數(shù)合成信號(hào)的波形演變過程
- 使用sin(pi/t)DFT前30000個(gè)系數(shù)合成信號(hào)的波形演變過程
- 信號(hào)f(t)在0~1之間的波形
- 使用信號(hào)的FFT前20000個(gè)系數(shù)重新合成信號(hào)
總結(jié)
以上是生活随笔為你收集整理的傅里叶变换中的狄利克雷条件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java实现layui分页_layui如
- 下一篇: 如何将安卓数据同步到Mac电脑上