使用python實現離散時間傅利葉變換

2021-08-17 04:14:38 字數 2664 閱讀 7172

我們經常使用傅利葉變換來計算數碼訊號的頻譜,進而分析數碼訊號,離散時間傅利葉變換的公式為: 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...