DFT
DFT(Discrete Fourier Transform),离散傅里叶变化,可以将离散信号变换到频域,它的公式非常简单:
如果你刚接触DFT,并且之前没有信号处理的相关经验,那么第一次看到这个公式,你可能有一些疑惑,为什么这个公式就能进行时域与频域之间的转换呢?
这里,我不打算去解释它,因为我水平有限,说的不清楚。相反,在这里我想介绍,作为一个程序员,如何如实现DFT
从矩阵的角度看DFT
DFT的公式,虽然简单,但是理解起来比较麻烦,我发现如果用矩阵相乘的角度来理解上面的公式,就会非常简单,直接上矩阵:
OK,通过上面的表示,我们很容易将DFT理解成为一种矩阵相乘的操作,这对于我们编码是很容易的。
Talk is cheap, show me the code
根据上面的理解,我们只需要构建出S SS矩阵,然后做矩阵相乘,就等得到DFT的结果
在这之前,我们先介绍如何生成正弦信号,以及如何用scipy中的fft模块进行DFT操作,以验证我们的结果是否正确
正弦信号
A: 幅度
f: 信号频率
n: 时间下标
T: 采样间隔, 等于 1/fs,fs为采样频率
"htmlcode">
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却没有这样的限制
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()
自己实现DFT
自己实现DFT的关键就是构造出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) # 扩充维度,将1D向量,转为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() # 结果和scipy的结果基本相同
# 第二种方法计算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()
总结
回顾了DFT的计算公式,并尝试用矩阵相乘的角度来理解DFT
介绍了两种生成正弦信号的方法
实现了两种DFT的计算方法
完整代码在这里
以上这篇信号生成及DFT的python实现方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]