上数字信号处理课的时候,仿佛自己是个傻子。
今天讲了DFT,不回顾一下明天就忘了。虽然FS、FT、DTFT、DFS这四种我已经忘了,但老师这些都不重要,只有DFT是可计算的。以下是我的DFT代码:
def myDFT(inputSig,isPrintW=False):
'''
输入:
inputSig:指输入信号,我希望它是array格式。
isPrintW:可以指定是否输出那个W矩阵
输出:
DFT计算出的结果
'''
sigLen = len(inputSig)
n = np.arange(0,sigLen).reshape(1,sigLen)
k = n.reshape(sigLen,1)
base = np.exp(-1j*2*np.pi/sigLen) # 基低
w = np.dot(k,n) # 指数矩阵
W = base**w # W矩阵
outputSig = np.dot(W,inputSig)
if isPrintW:
return outputSig,W
else:
return outputSig
上述代码我纯粹是用下面的定义写的。对不对我还真不确定。
试试验证一下这个函数的效果。为了方便,从网上找一个离散信号,并做图。
N = 16
n = np.arange(N)
y = np.cos(2*np.pi*2*(n/N)+np.pi/3)+0.5*np.cos(2*np.pi*5*(n/N))
from matplotlib import pyplot as plt
%matplotlib inline
plt.stem(n, y) #茎叶图
plt.show()
然后我用numpy自带的fft函数来运算一下这个信号,并做图。
re1 = np.fft.fft(y) #计算FFT
plt.stem(n,re1) #茎叶图
plt.show()
然后我用自己的函数来运算,并做图。
re2 = myDFT(y)
plt.stem(n,re2) #茎叶图
plt.show()
Fine,至少从运算后的结果来看,效果是好的。我暂且认为myDFT实现了DFT变换。
欢迎交流讨论!