项目文件结构

emg信号处理 python 能用python做信号处理吗_emg信号处理 python


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')

emg信号处理 python 能用python做信号处理吗_信号处理_02

脉冲信号的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')

emg信号处理 python 能用python做信号处理吗_python_03


验证矩形脉冲emg信号处理 python 能用python做信号处理吗_单元测试_04的DTFT可由emg信号处理 python 能用python做信号处理吗_信号处理_05的数学表达式得出,其单元测试函数为

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')

emg信号处理 python 能用python做信号处理吗_emg信号处理 python_06


使用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')

emg信号处理 python 能用python做信号处理吗_python_07

频移特性

单元测试函数

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')

emg信号处理 python 能用python做信号处理吗_python_08

系统分析

单元测试函数

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')

emg信号处理 python 能用python做信号处理吗_单元测试_09


emg信号处理 python 能用python做信号处理吗_信号处理_10

无限长信号的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')

emg信号处理 python 能用python做信号处理吗_emg信号处理 python_11

指数信号

指数信号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')

emg信号处理 python 能用python做信号处理吗_单元测试_12

指数信号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')

emg信号处理 python 能用python做信号处理吗_python_13