[Python]使⽤python的⼯具箱做数字滤波器设计和频域分析 1# -*- coding: utf-8 -*-
2"""
3Spyder Editor
4
5This is a temporary script file.
6"""
7
8import matplotlib.pyplot  as plt
9import scipy as sci
10import numpy as np
11
12
13
Params['font.sans-serif']=['SimHei'] #⽤来正常显⽰中⽂标签
Params['axes.unicode_minus']=False #⽤来正常显⽰负号
16
17
18 fs = 200; #采样频率
19 f1 = 10;  #信号分量1频率
20 f2 = 20;  #信号分量2频率
21 f3 = 30;  #信号分量3频率
22 f4 = 40;  #信号分量1频率
23 n  = np.arange(100)/fs; #采样点
24
25# ⽣成信号
26 yn = [20*np.sin(2*np.pi*f1*i) + 10*np.sin(2*np.pi*f2*i) + 5*np.sin(2*np.pi*f3*i) + 20*np.sin(2*np.pi*f4*i) for i in n];
27
28
29
30# fft分析原始信号
31 fft_result_abs1 = np.abs(sci.fft(yn))*2/len(n);
32 f_idx = np.arange(len(n))*fs/len(n);
33
34# 滤波器设计和滤波
35 (b,a) = sci.signal.butter(N=5,Wn=(15),btype='lowpass',output='ba',fs=200); #⽣成低通滤波器参数
36#print(b)
37#print(a)
38 yn_filtered = sci.signal.filtfilt(b,a,yn); #滤波器
39# fft分析滤波后的信号
spyder python下载40 fft_result_abs2 = np.abs(sci.fft(yn_filtered))*2/len(n);
41
42
43
44# 画图
45 plt.close('all');
46 plt.figure();
47 plt.subplot(2,2,1);
48 plt.plot(n,yn);
49 plt.title(U'原始时域信号');
50 plt.subplot(2,2,2);
51 plt.plot(f_idx[range(int(len(n)/2))],fft_result_abs1[range(int(len(n)/2))]);
52 plt.title(U'原始信号频域分析');
53
54 plt.subplot(2,2,3);
55 plt.plot(n,yn_filtered);
56 plt.title(U'低通滤波后时域信号');
57
58
59 plt.subplot(2,2,4);
60 plt.plot(f_idx[range(int(len(n)/2))],fft_result_abs2[range(int(len(n)/2))]);
61 plt.title(U'低通滤波信号频域分析');
62
63
64 plt.figure();
65 (w,h) = sci.signal.freqs(b,a);
66#plt.plot(w, 20 * np.log10(abs(h)))    #绘制幅频响应,频率轴取对数,幅度轴转换成dB。
67
68 plt.plot(w, abs(h))
图⽚显⽰:
Ref:
blog.csdn/qq7835144/article/details/88838537 segmentfault/a/1190000005144275

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。