今天小编要和大家分享的是模拟技术相关信息,接下来我将从浅谈移动平均滤波器C实现设计,数字滤波器这几个方面来介绍。
模拟技术相关技术文章浅谈移动平均滤波器C实现设计
学习一样东西,个人建议须从三个维度进行:What Why How
这里的内容主要参考胡广书编写的《《数字信号处理导论》》7.5.1节,加了一些自己的理解。
提到平均滤波器,做过单片机应用开发的朋友,马上能想到将一些采样数据进行加和求平均。诚然如此,从其时域数学描述而言也很直观:
其中 代表当前测量值,对于单片机应用而言,可以是当前ADC的采样值或者当前传感器经过一系列处理的物理量(比如在工业控制领域中的温度、压力、流量等测量值),而 表示上一次的测量值,以此类推, 则是前第N-1次测量值。
为了揭示其更深层次的机理,这里用Z传递函数将上述公式进一步描述:
对于傅立叶变换而言:
Z变换的本质是拉普拉斯变换的离散化形式, ,令 ,则
令 ,则
)
所以,平均滤波器的频率响应为:
幅频相频响应分析
利用下面的python代码,来分析一下
# encoding: UTF-8
fromscipy.optimize importnewton
fromscipy.signal importfreqz, dimpulse, dstep
frommath importsin, cos, sqrt, pi
importnumpy asnp
importmatplotlib.pyplot asplt
importsys
reload(sys)
sys.setdefaultencoding( ‘utf8’)
#函数用于计算移动平均滤波器的截止频率
defget_filter_cutoff(N, **kwargs):
func = lambdaw: sin(N*w/ 2) - N/sqrt( 2) * sin(w/ 2)
deriv = lambdaw: cos(N*w/ 2) * N/ 2- N/sqrt( 2) * cos(w/ 2) / 2
omega_0 = pi/N # Starting condition: halfway the first period of sin
returnnewton(func, omega_0, deriv, **kwargs)
#设置采样率
sample_rate = 200#Hz
N = 7
# 计算截止频率
w_c = get_filter_cutoff(N)
cutoff_freq = w_c * sample_rate / ( 2* pi)
# 滤波器参数
b = np.ones(N)
a = np.array([N] + [ 0]*(N -1))
#频率响应
w, h = freqz(b, a, worN= 4096)
#转为频率
w *= sample_rate / ( 2* pi)
#绘制波特图
plt.subplot( 2, 1, 1)
plt.suptitle( “Bode”)
#转换为分贝
plt.plot(w, 20* np.log10(abs(h)))
plt.ylabel( ‘Magnitude [dB]’)
plt.xlim( 0, sample_rate / 2)