项目文件结构
test为测试文件,window为项目文件
DTFT计算——有限长序列信号
test\signal.py中dtft函数
def dtft(self, h, N):
"""
离散时间傅里叶变换
:param h:输入向量,长度为L
:param N:对[-pi,pi)求值的频率数
:return:DTFT变换后的值,DTFT的频率矢量
"""
N = int(N)
L = len(h)
if N < L:
raise ZeroDivisionError("N必须不小于L")
W = (2 * np.pi / N) * np.array(list(range(0, N)))
mid = np.ceil(N / 2) + 1
for i in range(int(mid - 1), N):
W[i] = W[i] - 2 * np.pi
W = np.fft.fftshift(W)
H = np.fft.fftshift(np.fft.fft(h, N))
return H, W
单元测试函数
def test_dtft(self):
signal = Signal()
a = 0.88 * np.exp(complex(0, 1) * 2 * np.pi / 5)
nn = np.array(list(range(0, 41)))
xn = [a ** i for i in nn]
X, W = signal.dtft(xn, 128)
plt.subplot(2, 1, 1)
plt.plot(W / 2 / np.pi, np.abs(X))
plt.title('MAGNITUDE RESPONSE')
plt.xlabel('NORMALIZED FREQUENCY')
plt.ylabel('$|H(w)|$')
plt.subplot(2, 1, 2)
plt.plot(W / 2 / np.pi, 180 / np.pi * np.angle(X))
plt.xlabel('NORMALIZED FREQUENCY')
plt.ylabel('DEGREES')
plt.title('PUASE RESPONSE')
plt.tight_layout()
plt.savefig('data/images/dtft.png')
脉冲信号的DTFT
矩形脉冲
单元测试函数
def test_dtft_pulse1(self):
signal = Signal()
a = 1
nn = np.array(list(range(0, 20)))
xn = a ** nn
[X, W] = signal.dtft(xn, 300)
plt.subplot(2, 1, 1)
plt.plot(W / 2 / np.pi, abs(X))
plt.title('幅频响应特性曲线')
plt.xlabel('NORMALIZED FREQUENCY')
plt.ylabel('$|H(w)|$')
plt.subplot(2, 1, 2)
X = np.where(abs(X.real) < 10 ** (-7), 0, X)
plt.plot(W / 2 / np.pi, 180 / np.pi * np.angle(X))
plt.xlabel('NORMALIZED FREQUENCY')
plt.ylabel('DEGREES')
plt.title('相频响应特性曲线')
plt.tight_layout()
plt.savefig('data/images/dtft_pulse1.png')
验证矩形脉冲的DTFT可由的数学表达式得出,其单元测试函数为
def test_dtft_pulse2(self):
w = np.array(list(range(-400, 401, 5))) / 100
R = np.sin(w * 20 / 2) / np.sin(w / 2) * np.exp(complex(0, -1) * w * (20 - 1) / 2)
plt.subplot(2, 1, 1)
plt.plot(w, abs(R))
plt.xlabel('$w$')
plt.ylabel('abs')
plt.title('幅频响应特性曲线')
plt.subplot(2, 1, 2)
R = np.where(abs(R.real) < 10 ** (-7), 0, R)
plt.plot(w, 180 / np.pi * np.angle(R))
plt.xlabel('$w$')
plt.ylabel('phase')
plt.title('相频响应特性曲线')
plt.tight_layout()
plt.savefig('data/images/dtft_pulse2.png')
使用dtft函数计算12点脉冲信号的DTFT,频率样本分别为150、100和50个点
test\signal.py中dtft_pulse_samples函数
def dtft_pulse_samples(self, n,L,path):
"""
不同频率试验
:param n: 频率样本数
:parm L: 脉冲数
:param path: 图的保存路径
:return:
"""
plt.clf()
a = np.ones([1,L])
[X, W] = self.dtft(a, n)
plt.subplot(3, 1, 1)
plt.plot(W / 2 / np.pi, abs(X[0]))
plt.title('MAGNITUDE RESPONSE')
plt.xlabel('FREQUENCY')
plt.ylabel('$|H(w)|$')
plt.subplot(3, 1, 2)
plt.plot(W / 2 / np.pi, np.real(X[0]))
plt.xlabel('FREQUENCY')
plt.ylabel('REAL(X)')
plt.title('实部')
单元测试函数
def test_dftf_samples(self):
signal = Signal()
path1 = 'data/images/dftf_pulse3.png'
path2 = 'data/images/dftf_pulse4.png'
path3 = 'data/images/dftf_pulse5.png'
signal.dtft_pulse_samples(150, 12, path1)
signal.dtft_pulse_samples(100, 12, path2)
signal.dtft_pulse_samples(50, 12, path3)
- 频率样本为150点
- 频率样本为100点
- 频率样本为50点
奇数长脉冲
单元测试函数
def test_dtft_long_pulse(self):
signal = Signal()
L = 15
r = np.ones([1, L])
[R, W] = signal.dtft(r, 120)
[X, W2] = signal.dtft(R, 1200)
plt.plot(W, abs(R[0]))
plt.plot(W2, abs(X[0]))
plt.title('幅频响应特性曲线')
plt.xlabel('FREQUENCY')
plt.ylabel('$|R(w)|$')
plt.savefig('data/images/long_pulse.png')
频移特性
单元测试函数
def test_frequency_shift(self):
signal = Signal()
nn = np.array(list(range(0, 11)))
x = np.cos(np.pi / 2 * nn)
y = np.exp(np.complex(0, 1) * np.pi * nn / 4) * np.cos(np.pi / 2 * nn)
X, Wx = signal.dtft(x, 100)
Y, Wy = signal.dtft(y, 100)
plt.subplot(2, 2, 1)
plt.plot(Wx, abs(X))
plt.title('x(n)的幅频特性曲线')
plt.xlabel('FREQUENCY')
plt.ylabel('$|X(w)|$')
plt.grid(visible=True)
plt.subplot(2, 2, 2);
plt.plot(Wx, np.angle(X))
plt.title('x(n)的相频特性曲线')
plt.xlabel('FREQUENCY')
plt.ylabel('ANGLE{X(w)}')
plt.grid(visible=True)
plt.subplot(2, 2, 3)
plt.plot(Wy, abs(Y))
plt.title('y(n)的幅频特性曲线')
plt.xlabel('FREQUENCY')
plt.ylabel('$|Y(w)|$')
plt.grid(visible=True)
plt.subplot(2, 2, 4)
plt.plot(Wy, np.angle(Y))
plt.title('y(n)的相频特性曲线')
plt.xlabel('FREQUENCY')
plt.ylabel('ANGLE{Y(w)}')
plt.grid(visible=True)
plt.tight_layout()
plt.savefig('data/images/frequency_shift.png')
系统分析
单元测试函数
def test_lti(self):
w = np.linspace(0, np.pi, 500)
x = 1. / (1 - 0.8 * np.exp(np.complex(0, -1) * w))
plt.figure(1)
plt.subplot(2, 1, 1)
plt.plot(w / np.pi, abs(x))
plt.title('幅频响应特性曲线')
plt.xlabel('w')
plt.ylabel('|H(e^j*w)|')
plt.grid(visible=True)
plt.subplot(2, 1, 2)
plt.plot(w / np.pi, np.angle(x))
plt.title('相频响应特性曲线')
plt.xlabel('w')
plt.ylabel('ANGLE{H(e^j*w)}')
plt.grid(visible=True)
plt.tight_layout()
plt.savefig('data/images/lti1.png')
plt.figure(2)
a = np.array([1, -0.8])
b = np.array([1, 0])
yn = scipy.signal.freqz(b, a, 100)
plt.stem(yn[1])
plt.title('输出响应y(n)')
plt.xlabel('n')
plt.ylabel('y(n)')
plt.savefig('data/images/lti2.png')
无限长信号的DTFT
单元测试函数
def test_long_dtft(self):
a = np.array([1, -0.9])
b = np.array([1, 0])
W = np.arange(-np.pi, np.pi, 0.1)
X = scipy.signal.freqz(b, a, W)
plt.subplot(2, 1, 1)
plt.plot(W, abs(X[1]))
plt.title('幅频响应特性曲线')
plt.xlabel('频率')
plt.ylabel('|H(w)|')
plt.grid(visible=True)
plt.subplot(2, 1, 2)
plt.plot(W, np.angle(X[1]))
plt.title('相频响应特性曲线')
plt.xlabel('频率')
plt.ylabel('angle{H(w)}')
plt.grid(visible=True)
plt.tight_layout()
plt.savefig('data/images/long_dtft.png')
指数信号
指数信号1
def test_exponent1(self):
a = np.array(list([1, -0.9]))
b = 1
N = 100
WW, HH = scipy.signal.freqz(b, a, N, whole=True)
mid = int(np.ceil(N / 2) + 1)
WW[mid: N] = WW[mid: N] - 2 * np.pi
WW = np.fft.fftshift(WW)
HH = np.fft.fftshift(HH)
plt.subplot(2, 1, 1)
plt.plot(WW / 2 / np.pi, abs(HH))
plt.xlabel('\omega');
plt.ylabel('|X(e^j^\omega)|')
plt.title('x(n)的幅频特性')
plt.grid(visible=True)
plt.subplot(2, 1, 2)
plt.plot(WW / 2 / np.pi, 180 / np.pi * np.angle(HH))
plt.xlabel('\omega')
plt.ylabel('Angle[X(e^j^\omega)]')
plt.title('x(n)的相频特性')
plt.grid(visible=True)
plt.tight_layout()
plt.savefig('data/images/exponent1.png')
指数信号2
def test_exponent2(self):
w = np.arange(-np.pi, np.pi, 0.001)
a = np.cos(w)
b = np.sin(w)
x = np.sqrt(1 / (1.81 - 1.8 * a))
y = -np.arctan(0.9 * b / (1 - 0.9 * a))
plt.subplot(2, 1, 1)
plt.plot(w, x)
plt.xlabel('w')
plt.ylabel('|H(e^j*w)|')
plt.title('幅频响应特性曲线')
plt.subplot(2, 1, 2)
plt.plot(w, y)
plt.xlabel('w')
plt.ylabel('ANGEL{H(e^j*w)}')
plt.title('相频响应特性曲线')
plt.tight_layout()
plt.savefig('data/images/exponent2.png')