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

??根據上面的表達式可以繪制出對應的函數,如下圖所示。這個函數具有無窮多個間斷點,它的面積為:
∫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)一個周期內的波形
#------------------------------------------------------------
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()
??將信號抽取100000數據,利用FFT計算對應的離散傅里葉系數。下面繪制出前面200個系數的幅值??梢钥吹皆撔盘柕念l譜幅度隨著n增加迅速降低到0。
▲ 信號f(t)的FFT前200個系數的幅值
??下面給出了利用信號f(t)的前1~200個系數合成信號的過程??梢钥吹叫盘栐陂g斷點處出現Gibbs過沖現象。但是誤差信號還是隨著n增加逐步能量降低。
▲ 使用前200個系數合成信號波形
▲ 使用前2000個系數合成信號波形
▲ 使用前20000個系數合成信號波形
2.無限個極值
??下面表達式給出了一個在周期(0,1)\left( {0,1} \right)(0,1)內的具有無限多個極大值,極小值的函數:
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)
▲ 函數sin(pi/t)的信號波形
??對這個函數進行離散傅里葉變換(DFT),從0.0001~1之間采集10510^5105個數據的,利用FFT計算DFT的系數,下圖繪制了前200個系數的幅值??梢钥吹剿念l率迅速衰減到0。如果jd計算后的系數重新進行逆運算,合成后的波形就會與原來信號保持一致。
▲ sin(pi/t)DFT前200個系數幅值
▲ 使用100000000采樣后計算的DFT系數
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前面若干系數來合成對應的波形。
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]]}
??下圖顯示了合成系數的個數分別從1演變到300過程中,合成信號波形的變化。毫不夸張的說,這個波形與sin(1/t)之間幾乎毫無關系。
▲ 使用sin(pi/t)DFT前200個系數合成信號的波形演變過程
??如果將合成系數的數量增加10倍,合成之后的波形在左邊的高頻波形逐步豐富 ,在右端則會出現越來越高的尖峰。
▲ 使用sin(pi/t)DFT前2000個系數合成信號的波形演變過程
▲ 使用sin(pi/t)DFT前30000個系數合成信號的波形演變過程
3.絕對可積
??下圖是在(0,1)\left( {0,1} \right)(0,1)之間函數:f(t)=1tf\left( t \right) = {1 \over t}f(t)=t1?
??它的面積為無窮大。但是信號的能量為:
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∞?=∞
▲ 信號f(t)在0~1之間的波形
??下面使用信號的FFT前20000項系數合成信號,隨著n增加合成信號的變化過程。
▲ 使用信號的FFT前20000個系數重新合成信號
?
▌附件
#!/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
#============================================================
■ 相關文獻鏈接:
- 狄利克雷條件(Dirichlet Condition)
● 相關圖表鏈接:
- f(t)一個周期內的波形
- 信號f(t)的FFT前200個系數的幅值
- 使用前200個系數合成信號波形
- 使用前2000個系數合成信號波形
- 使用前20000個系數合成信號波形
- 函數sin(pi/t)的信號波形
- sin(pi/t)DFT前200個系數幅值
- 使用100000000采樣后計算的DFT系數
- 使用sin(pi/t)DFT前200個系數合成信號的波形演變過程
- 使用sin(pi/t)DFT前2000個系數合成信號的波形演變過程
- 使用sin(pi/t)DFT前30000個系數合成信號的波形演變過程
- 信號f(t)在0~1之間的波形
- 使用信號的FFT前20000個系數重新合成信號
總結
以上是生活随笔為你收集整理的傅里叶变换中的狄利克雷条件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java实现layui分页_layui如
- 下一篇: java 合并到一行_mysql中将多行