我們經常使用傅利葉變換來計算數碼訊號的頻譜,進而分析數碼訊號,離散時間傅利葉變換的公式為: x(
ejw)
=∑n=
−∞n=
+∞x[
n]e−
jwn x(e
jw)=
∑n=−
∞n=+
∞x[n
]e−j
wn可是自己動手實現一遍才是最好的學習。
在數字分析裡面,傅利葉變換預設等時間間隔取樣,不需要時間序列,只需要訊號陣列即可分析。
分析過程如下:
1. 對於含有 n 個樣本值的數碼訊號序列,根據奈奎斯特取樣定律,包含的週期數最大為n/2,週期數為 0 代表直流分量。所以,當週期數表示為離散的0,1,2,3…n/2,總的數目為n/2+1
個
2. 傅利葉變換之後的結果為複數, 下標為k的複數a+b*j表示時域訊號中週期為n/k個取樣值的正弦波和余弦波的成分的多少, 其中a表示cos波形的成分,b表示sin波形的成分
3. 首先產生乙個長度為n,一倍週期的e−
jwn e−j
wn(即為cos
(wn)
−jsi
n(wn
) cos(
wn)−
jsin
(wn)
)波樣本序列.
1. 將數碼訊號序列中的每乙個樣本與1倍週期的樣本波形序列相乘,得到n個乘積,將n個乘積相加,放入f[1]中。
1. 再產生乙個長度為n,兩倍週期的e−
jwn e−j
wn(即為cos
(wn)
−jsi
n(wn
) cos(
wn)−
jsin
(wn)
)波樣本序列,再將數碼訊號序列中的每乙個樣本與2倍週期的樣本波形序列相乘,得到n個乘積,將n個乘積相加,放入f[2]中。依次重複。
1. 對於0倍週期,即直流分量來說,可以認為產生的是0倍週期的樣本波形,重複操作,放入f[0]即可。
使用方法:
從以上過程得到數字序列的傅利葉變換之後,如果想要得到真正頻譜,還需要做處理:
1. 計算出的每乙個頻率下的幅值需要除以時間序列的長度,類似求平均的過程
2. 每乙個頻率下的幅值是乙個複數,需要對它求模,而且因為在負頻率處也有值,所以需要對於實訊號需要乘2
3. 頻率的序列為0到取樣率的一半,長度為n/2+1
完整程式:
# 離散時間傅利葉變換的python實現
import numpy as np
import math
import pylab as pl
import scipy.signal as signal
import matplotlib.pyplot as plt
sampling_rate=1000
t1=np.arange(0, 10.0, 1.0/sampling_rate)
x1 =np.sin(15*np.pi*t1)
# 傅利葉變換
此處實現的是傳統的傅利葉變換,這種方法實際已經不用了,現在使用快速傅利葉變換,其實兩種是等價的,但是快速傅利葉變換時間複雜度要小很多。
Python 用Python實現時間離散化
方案1 時間取到小時,分鐘和秒全部用0代替,這樣造成的問題是區間劃分不正確,00 00 00,00 59 59 被劃分到時間點00 00 00上,與需求方的意思相違背 這裡真的要吐槽一下,開始之前一定要做好需求分析,大部分的統計結果不合適都是因為需求分析沒有做好而導致的 方案2 通過判斷分鐘和秒是否...
離散時間傅利葉變換DTFT實現
使用matlab軟體畫出頻譜圖 x zeros 1,3 m ones 1,n zeros 1,3 m 給出輸入序列 w 15 0.1 15 1e 10 x sin 0.5 n w t sin 0.5 w t 給出頻譜序列 subplot 1,3,1 stem n,x,畫出輸入序列 axis 20,2...
python 實現樸素貝葉斯分類器(離散資料)
有用請點贊,沒用請差評。bayes 樸素貝葉斯法 author tomator 演算法參考與李航博士 統計學習方法 採用貝葉斯估計 拉普拉斯平滑 計算先驗概率和條件概率 from collections import counter,defaultdict import numpy as np im...