最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

信號生成及DFT的python實現(xiàn)方式

 更新時間:2020年02月25日 13:02:28   作者:芥末的無奈  
今天小編就為大家分享一篇信號生成及DFT的python實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

DFT

DFT(Discrete Fourier Transform),離散傅里葉變化,可以將離散信號變換到頻域,它的公式非常簡單:

離散頻率下標(biāo)為k時的頻率大小

離散時域信號序列

信號序列的長度,也就是采樣的個數(shù)

如果你剛接觸DFT,并且之前沒有信號處理的相關(guān)經(jīng)驗,那么第一次看到這個公式,你可能有一些疑惑,為什么這個公式就能進(jìn)行時域與頻域之間的轉(zhuǎn)換呢?

這里,我不打算去解釋它,因為我水平有限,說的不清楚。相反,在這里我想介紹,作為一個程序員,如何如實現(xiàn)DFT

從矩陣的角度看DFT

DFT的公式,雖然簡單,但是理解起來比較麻煩,我發(fā)現(xiàn)如果用矩陣相乘的角度來理解上面的公式,就會非常簡單,直接上矩陣:

OK,通過上面的表示,我們很容易將DFT理解成為一種矩陣相乘的操作,這對于我們編碼是很容易的。

Talk is cheap, show me the code

根據(jù)上面的理解,我們只需要構(gòu)建出S SS矩陣,然后做矩陣相乘,就等得到DFT的結(jié)果

在這之前,我們先介紹如何生成正弦信號,以及如何用scipy中的fft模塊進(jìn)行DFT操作,以驗證我們的結(jié)果是否正確

正弦信號

A: 幅度

f: 信號頻率

n: 時間下標(biāo)

T: 采樣間隔, 等于 1/fs,fs為采樣頻率

ϕ \phiϕ: 相位

下面介紹如何生成正弦信號

import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline
def generate_sinusoid(N, A, f0, fs, phi):
 '''
 N(int) : number of samples
 A(float) : amplitude
 f0(float): frequency in Hz
 fs(float): sample rate
 phi(float): initial phase
 
 return 
 x (numpy array): sinusoid signal which lenght is M
 '''
 
 T = 1/fs
 n = np.arange(N) # [0,1,..., N-1]
 x = A * np.cos( 2*f0*np.pi*n*T + phi )
 
 return x

N = 511
A = 0.8
f0 = 440
fs = 44100
phi = 0

x = generate_sinusoid(N, A, f0, fs, phi)

plt.plot(x)
plt.show()

# 另一種生成正弦信號的方法,生成時長為t的序列
def generate_sinusoid_2(t, A, f0, fs, phi):
 '''
 t (float) : 生成序列的時長
 A (float) : amplitude
 f0 (float) : frequency
 fs (float) : sample rate
 phi(float) : initial phase
 
 returns
 x (numpy array): sinusoid signal sequence
 '''
 
 T = 1.0/fs
 N = t / T
 
 return generate_sinusoid(N, A, f0, fs, phi)

A = 1.0
f0 = 440
fs = 44100
phi = 0
t = 0.02

x = generate_sinusoid_2(t, A, f0, fs, phi)

n = np.arange(0, 0.02, 1/fs)
plt.plot(n, x)

Scipy FFT

介紹如何Scipy的FFT模塊計算DFT

注意,理論上輸入信號的長度必須是才能做FFT,而scipy中FFT卻沒有這樣的限制

這是因為當(dāng)長度不等于時,scipy fft默認(rèn)做DFT

from scipy.fftpack import fft

# generate sinusoid
N = 511
A = 0.8
f0 = 440
fs = 44100
phi = 1.0
x = generate_sinusoid(N, A, f0, fs, phi)

# fft is
X = fft(x)
mX = np.abs(X) # magnitude
pX = np.angle(X) # phase

# plot the magnitude and phase
plt.subplot(2,1,1)
plt.plot(mX)

plt.subplot(2,1,2)
plt.plot(pX)
plt.show()

自己實現(xiàn)DFT

自己實現(xiàn)DFT的關(guān)鍵就是構(gòu)造出S,有兩種方式:

def generate_complex_sinusoid(k, N):
 '''
 k (int): frequency index
 N (int): length of complex sinusoid in samples
 
 returns
 c_sin (numpy array): the generated complex sinusoid (length N)
 '''
 
 n = np.arange(N)
 
 c_sin = np.exp(1j * 2 * np.pi * k * n / N)
 
 return np.conjugate(c_sin)

def generate_complex_sinusoid_matrix(N):
 '''
 N (int): length of complex sinusoid in samples
 
 returns
 c_sin_matrix (numpy array): the generated complex sinusoid (length N)
 '''
 
 n = np.arange(N)
 n = np.expand_dims(n, axis=1)  # 擴(kuò)充維度,將1D向量,轉(zhuǎn)為2D矩陣,方便后面的矩陣相乘
 
 k = n
 
 m = n.T * k / N     # [N,1] * [1, N] = [N,N]
 
 S = np.exp(1j * 2 * np.pi * m)  # 計算矩陣 S
 
 return np.conjugate(S)
# 生成信號,用于測試
N = 511
A = 0.8
f0 = 440
fs = 44100
phi = 1.0
x = generate_sinusoid(N, A, f0, fs, phi)

# 第一種方式計算DFT
X_1 = np.array([])
for k in range(N):
 s = generate_complex_sinusoid(k, N)
 X_1 = np.append(X_1, np.sum(x * s))
 
mX = np.abs(X_1)
pX = np.angle(X_1)

# plot the magnitude and phase
plt.subplot(2,1,1)
plt.plot(mX)

plt.subplot(2,1,2)
plt.plot(pX)
plt.show()

# 結(jié)果和scipy的結(jié)果基本相同

# 第二種方法計算DFT
S = generate_complex_sinusoid_matrix(N)
X_2 = np.dot(S, x)

mX = np.abs(X_2)
pX = np.angle(X_2)

# plot the magnitude and phase
plt.subplot(2,1,1)
plt.plot(mX)

plt.subplot(2,1,2)
plt.plot(pX)
plt.show()

總結(jié)

回顧了DFT的計算公式,并嘗試用矩陣相乘的角度來理解DFT

介紹了兩種生成正弦信號的方法

實現(xiàn)了兩種DFT的計算方法

完整代碼在這里

以上這篇信號生成及DFT的python實現(xiàn)方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python?plotly設(shè)置go.Scatter為實線實例

    python?plotly設(shè)置go.Scatter為實線實例

    這篇文章主要為大家介紹了python?plotly設(shè)置go.Scatter為實線線條的樣式實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • python基礎(chǔ)之并發(fā)編程(三)

    python基礎(chǔ)之并發(fā)編程(三)

    這篇文章主要介紹了詳解python的并發(fā)編程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • python密碼學(xué)RSA密碼加密教程

    python密碼學(xué)RSA密碼加密教程

    這篇文章主要為大家介紹了python密碼學(xué)RSA密碼加密教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 這3個Python實時可視化工具包來幫你了解性能瓶頸

    這3個Python實時可視化工具包來幫你了解性能瓶頸

    由于Python的動態(tài)性和多功能性,它比其他語言的速度要慢.有時復(fù)雜的計算或算法需要大量時間才能在Python中執(zhí)行.因此需要跟蹤代碼的執(zhí)行流,深入了解性能瓶頸,需要的朋友可以參考下
    2021-06-06
  • Python Request類源碼實現(xiàn)方法及原理解析

    Python Request類源碼實現(xiàn)方法及原理解析

    這篇文章主要介紹了Python Request類源碼實現(xiàn)方法及原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Python腳本實現(xiàn)小猿口算

    Python腳本實現(xiàn)小猿口算

    最近小猿口算已經(jīng)被不少大學(xué)生攻占,一個好好的給小學(xué)生的口算題已經(jīng)變成了大學(xué)生的計算機大戰(zhàn),下面我們就來看看如何使用Python腳本就行吧小猿口算
    2024-10-10
  • Django應(yīng)用程序入口WSGIHandler源碼解析

    Django應(yīng)用程序入口WSGIHandler源碼解析

    這篇文章主要介紹了Django應(yīng)用程序入口WSGIHandler源碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Python實現(xiàn)定時監(jiān)測網(wǎng)站運行狀態(tài)的示例代碼

    Python實現(xiàn)定時監(jiān)測網(wǎng)站運行狀態(tài)的示例代碼

    這篇文章主要介紹了Python實現(xiàn)定時監(jiān)測網(wǎng)站狀態(tài)的示例代碼,幫助大家更好的管理自己的網(wǎng)站,感興趣的朋友可以了解下
    2020-09-09
  • python?PyQt5中QButtonGroup的詳細(xì)用法解析與應(yīng)用實戰(zhàn)記錄

    python?PyQt5中QButtonGroup的詳細(xì)用法解析與應(yīng)用實戰(zhàn)記錄

    在PyQt5中,QButtonGroup是一個用于管理按鈕互斥性和信號槽連接的類,它可以將多個按鈕劃分為一個組,管理按鈕的選中狀態(tài)和ID,本文詳細(xì)介紹了QButtonGroup的創(chuàng)建、使用方法和實際應(yīng)用案例,適合需要在PyQt5項目中高效管理按鈕組的開發(fā)者
    2024-10-10
  • 解決jupyter notebook 前面書寫后面內(nèi)容消失的問題

    解決jupyter notebook 前面書寫后面內(nèi)容消失的問題

    這篇文章主要介紹了解決jupyter notebook 前面書寫后面內(nèi)容消失的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論

津南区| 宜章县| 扎赉特旗| 益阳市| 若尔盖县| 同江市| 连城县| 晋中市| 德庆县| 孝感市| 舟曲县| 兴宁市| 六盘水市| 昭觉县| 沁阳市| 洪湖市| 巢湖市| 台湾省| 湘乡市| 游戏| 息烽县| 明星| 光山县| 布拖县| 新津县| 黄冈市| 红河县| 无为县| 遂川县| 天长市| 台南市| 乌兰县| 佛坪县| 竹山县| 海丰县| 无棣县| 敦煌市| 凤台县| 康马县| 东光县| 武陟县|